]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: don't return from netpollGenericInit until init is complete
authorIan Lance Taylor <iant@golang.org>
Fri, 1 Nov 2019 23:31:57 +0000 (16:31 -0700)
committerIan Lance Taylor <iant@golang.org>
Tue, 5 Nov 2019 00:17:34 +0000 (00:17 +0000)
As a side-effect ensure that netpollinited only reports true when
netpoll initialization is complete.

Fixes #35282
Updates #35353

Change-Id: I21f08a04fcf229e0de5e6b5ad89c990426ae9b89
Reviewed-on: https://go-review.googlesource.com/c/go/+/204937
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/runtime/netpoll.go

index 939b27061e3e8508c4b0d0a720c06c0c46ed7477..25b1d5d49efdc495d1542f33dd3746fd0fcc0350 100644 (file)
@@ -93,7 +93,9 @@ type pollCache struct {
 }
 
 var (
-       netpollInited  uint32
+       netpollInitLock mutex
+       netpollInited   uint32
+
        pollcache      pollCache
        netpollWaiters uint32
 )
@@ -104,8 +106,13 @@ func poll_runtime_pollServerInit() {
 }
 
 func netpollGenericInit() {
-       if atomic.Cas(&netpollInited, 0, 1) {
-               netpollinit()
+       if atomic.Load(&netpollInited) == 0 {
+               lock(&netpollInitLock)
+               if netpollInited == 0 {
+                       netpollinit()
+                       atomic.Store(&netpollInited, 1)
+               }
+               unlock(&netpollInitLock)
        }
 }