aboutsummaryrefslogtreecommitdiff
path: root/libgo/go/runtime/netpoll_stub.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/runtime/netpoll_stub.go')
-rw-r--r--libgo/go/runtime/netpoll_stub.go30
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
}