runtime: add cheap atomic condition variable

This commit is contained in:
Nia Weiss
2020-06-15 18:57:13 -04:00
committed by Ron Evans
parent b40f250530
commit ed9b97cc0d
3 changed files with 172 additions and 0 deletions
+44
View File
@@ -1,6 +1,7 @@
package main
import (
"runtime"
"sync"
"time"
)
@@ -71,6 +72,8 @@ func main() {
startSimpleFunc(emptyFunc)
time.Sleep(2 * time.Millisecond)
testCond()
}
func acquire(m *sync.Mutex) {
@@ -127,3 +130,44 @@ type simpleFunc func()
func emptyFunc() {
}
func testCond() {
var cond runtime.Cond
go func() {
// Wait for the caller to wait on the cond.
time.Sleep(time.Millisecond)
// Notify the caller.
ok := cond.Notify()
if !ok {
panic("notification not sent")
}
// This notification will be buffered inside the cond.
ok = cond.Notify()
if !ok {
panic("notification not queued")
}
// This notification should fail, since there is already one buffered.
ok = cond.Notify()
if ok {
panic("notification double-sent")
}
}()
// Verify that the cond has no pending notifications.
ok := cond.Poll()
if ok {
panic("unexpected early notification")
}
// Wait for the goroutine spawned earlier to send a notification.
cond.Wait()
// The goroutine should have also queued a notification in the cond.
ok = cond.Poll()
if !ok {
panic("missing queued notification")
}
}