mirror of
https://github.com/golang/go
synced 2024-11-26 22:51:23 -07:00
runtime: expand gopark documentation
unlockf is called after the G is put into _Gwaiting, meaning another G may have readied this one before unlockf is called. This is implied by the current doc, but add additional notes to call out this behavior, as it can be quite surprising. Updates #40641 Change-Id: I60b1ccc6a4dd9ced8ad2aa1f729cb2e973100b59 Reviewed-on: https://go-review.googlesource.com/c/go/+/256058 Trust: Michael Pratt <mpratt@google.com> Run-TryBot: Michael Pratt <mpratt@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com>
This commit is contained in:
parent
eb3c6a93c3
commit
02ff8b8ce4
@ -284,14 +284,23 @@ func goschedguarded() {
|
||||
mcall(goschedguarded_m)
|
||||
}
|
||||
|
||||
// Puts the current goroutine into a waiting state and calls unlockf.
|
||||
// Puts the current goroutine into a waiting state and calls unlockf on the
|
||||
// system stack.
|
||||
//
|
||||
// If unlockf returns false, the goroutine is resumed.
|
||||
//
|
||||
// unlockf must not access this G's stack, as it may be moved between
|
||||
// the call to gopark and the call to unlockf.
|
||||
// Reason explains why the goroutine has been parked.
|
||||
// It is displayed in stack traces and heap dumps.
|
||||
// Reasons should be unique and descriptive.
|
||||
// Do not re-use reasons, add new ones.
|
||||
//
|
||||
// Note that because unlockf is called after putting the G into a waiting
|
||||
// state, the G may have already been readied by the time unlockf is called
|
||||
// unless there is external synchronization preventing the G from being
|
||||
// readied. If unlockf returns false, it must guarantee that the G cannot be
|
||||
// externally readied.
|
||||
//
|
||||
// Reason explains why the goroutine has been parked. It is displayed in stack
|
||||
// traces and heap dumps. Reasons should be unique and descriptive. Do not
|
||||
// re-use reasons, add new ones.
|
||||
func gopark(unlockf func(*g, unsafe.Pointer) bool, lock unsafe.Pointer, reason waitReason, traceEv byte, traceskip int) {
|
||||
if reason != waitReasonSleep {
|
||||
checkTimeouts() // timeouts may expire while two goroutines keep the scheduler busy
|
||||
|
Loading…
Reference in New Issue
Block a user