From: Ian Lance Taylor Date: Fri, 1 Nov 2019 23:31:57 +0000 (-0700) Subject: runtime: don't return from netpollGenericInit until init is complete X-Git-Tag: go1.14beta1~421 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=04e80fb2c9e502c011d367ad36307290df07cb41;p=gostls13.git runtime: don't return from netpollGenericInit until init is complete 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 Reviewed-by: Brad Fitzpatrick --- diff --git a/src/runtime/netpoll.go b/src/runtime/netpoll.go index 939b27061e..25b1d5d49e 100644 --- a/src/runtime/netpoll.go +++ b/src/runtime/netpoll.go @@ -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) } }