diff options
Diffstat (limited to 'libgo/go/runtime/netpoll_stub.go')
-rw-r--r-- | libgo/go/runtime/netpoll_stub.go | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/libgo/go/runtime/netpoll_stub.go b/libgo/go/runtime/netpoll_stub.go index f585333..fe45cfb 100644 --- a/libgo/go/runtime/netpoll_stub.go +++ b/libgo/go/runtime/netpoll_stub.go @@ -6,16 +6,42 @@ package runtime +import "runtime/internal/atomic" + +var netpollInited uint32 var netpollWaiters uint32 +var netpollStubLock mutex +var netpollNote note +var netpollBroken uint32 + +func netpollGenericInit() { + atomic.Store(&netpollInited, 1) +} + +func netpollBreak() { + if atomic.Cas(&netpollBroken, 0, 1) { + notewakeup(&netpollNote) + } +} + // Polls for ready network connections. // Returns list of goroutines that become runnable. -func netpoll(block bool) gList { +func netpoll(delay int64) gList { // Implementation for platforms that do not support // integrated network poller. + if delay != 0 { + // This lock ensures that only one goroutine tries to use + // the note. It should normally be completely uncontended. + lock(&netpollStubLock) + noteclear(&netpollNote) + atomic.Store(&netpollBroken, 0) + notetsleep(&netpollNote, delay) + unlock(&netpollStubLock) + } return gList{} } func netpollinited() bool { - return false + return atomic.Load(&netpollInited) != 0 } |