| // Copyright 2024 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| //go:build !js | |
| package runtime | |
| // sleep and wakeup on one-time events. | |
| // before any calls to notesleep or notewakeup, | |
| // must call noteclear to initialize the Note. | |
| // then, exactly one thread can call notesleep | |
| // and exactly one thread can call notewakeup (once). | |
| // once notewakeup has been called, the notesleep | |
| // will return. future notesleep will return immediately. | |
| // subsequent noteclear must be called only after | |
| // previous notesleep has returned, e.g. it's disallowed | |
| // to call noteclear straight after notewakeup. | |
| // | |
| // notetsleep is like notesleep but wakes up after | |
| // a given number of nanoseconds even if the event | |
| // has not yet happened. if a goroutine uses notetsleep to | |
| // wake up early, it must wait to call noteclear until it | |
| // can be sure that no other goroutine is calling | |
| // notewakeup. | |
| // | |
| // notesleep/notetsleep are generally called on g0, | |
| // notetsleepg is similar to notetsleep but is called on user g. | |
| type note struct { | |
| // Futex-based impl treats it as uint32 key, | |
| // while sema-based impl as M* waitm. | |
| key uintptr | |
| } |