diff options
Diffstat (limited to 'testdata/coroutines.go')
-rw-r--r-- | testdata/coroutines.go | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/testdata/coroutines.go b/testdata/coroutines.go index bb8acdbc6..17b2b0e3a 100644 --- a/testdata/coroutines.go +++ b/testdata/coroutines.go @@ -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") + } +} |