@@ -74,7 +74,7 @@ type afWinRingBind struct {
7474type WinRingBind struct {
7575 v4 , v6 afWinRingBind
7676 mu sync.RWMutex
77- isOpen uint32
77+ isOpen atomic. Uint32 // 0, 1, or 2
7878}
7979
8080func NewDefaultBind () Bind { return NewWinRingBind () }
@@ -212,7 +212,7 @@ func (bind *afWinRingBind) CloseAndZero() {
212212}
213213
214214func (bind * WinRingBind ) closeAndZero () {
215- atomic . StoreUint32 ( & bind .isOpen , 0 )
215+ bind .isOpen . Store ( 0 )
216216 bind .v4 .CloseAndZero ()
217217 bind .v6 .CloseAndZero ()
218218}
@@ -276,7 +276,7 @@ func (bind *WinRingBind) Open(port uint16) (recvFns []ReceiveFunc, selectedPort
276276 bind .closeAndZero ()
277277 }
278278 }()
279- if atomic . LoadUint32 ( & bind .isOpen ) != 0 {
279+ if bind .isOpen . Load ( ) != 0 {
280280 return nil , 0 , ErrBindAlreadyOpen
281281 }
282282 var sa windows.Sockaddr
@@ -299,17 +299,17 @@ func (bind *WinRingBind) Open(port uint16) (recvFns []ReceiveFunc, selectedPort
299299 return nil , 0 , err
300300 }
301301 }
302- atomic . StoreUint32 ( & bind .isOpen , 1 )
302+ bind .isOpen . Store ( 1 )
303303 return []ReceiveFunc {bind .receiveIPv4 , bind .receiveIPv6 }, selectedPort , err
304304}
305305
306306func (bind * WinRingBind ) Close () error {
307307 bind .mu .RLock ()
308- if atomic . LoadUint32 ( & bind .isOpen ) != 1 {
308+ if bind .isOpen . Load ( ) != 1 {
309309 bind .mu .RUnlock ()
310310 return nil
311311 }
312- atomic . StoreUint32 ( & bind .isOpen , 2 )
312+ bind .isOpen . Store ( 2 )
313313 windows .PostQueuedCompletionStatus (bind .v4 .rx .iocp , 0 , 0 , nil )
314314 windows .PostQueuedCompletionStatus (bind .v4 .tx .iocp , 0 , 0 , nil )
315315 windows .PostQueuedCompletionStatus (bind .v6 .rx .iocp , 0 , 0 , nil )
@@ -345,8 +345,8 @@ func (bind *afWinRingBind) InsertReceiveRequest() error {
345345//go:linkname procyield runtime.procyield
346346func procyield (cycles uint32 )
347347
348- func (bind * afWinRingBind ) Receive (buf []byte , isOpen * uint32 ) (int , Endpoint , error ) {
349- if atomic . LoadUint32 ( isOpen ) != 1 {
348+ func (bind * afWinRingBind ) Receive (buf []byte , isOpen * atomic. Uint32 ) (int , Endpoint , error ) {
349+ if isOpen . Load ( ) != 1 {
350350 return 0 , nil , net .ErrClosed
351351 }
352352 bind .rx .mu .Lock ()
@@ -359,7 +359,7 @@ retry:
359359 count = 0
360360 for tries := 0 ; count == 0 && tries < receiveSpins ; tries ++ {
361361 if tries > 0 {
362- if atomic . LoadUint32 ( isOpen ) != 1 {
362+ if isOpen . Load ( ) != 1 {
363363 return 0 , nil , net .ErrClosed
364364 }
365365 procyield (1 )
@@ -378,7 +378,7 @@ retry:
378378 if err != nil {
379379 return 0 , nil , err
380380 }
381- if atomic . LoadUint32 ( isOpen ) != 1 {
381+ if isOpen . Load ( ) != 1 {
382382 return 0 , nil , net .ErrClosed
383383 }
384384 count = winrio .DequeueCompletion (bind .rx .cq , results [:])
@@ -395,7 +395,7 @@ retry:
395395 // huge packets. Just try again when this happens. The infinite loop this could cause is still limited to
396396 // attacker bandwidth, just like the rest of the receive path.
397397 if windows .Errno (results [0 ].Status ) == windows .WSAEMSGSIZE {
398- if atomic . LoadUint32 ( isOpen ) != 1 {
398+ if isOpen . Load ( ) != 1 {
399399 return 0 , nil , net .ErrClosed
400400 }
401401 goto retry
@@ -421,8 +421,8 @@ func (bind *WinRingBind) receiveIPv6(buf []byte) (int, Endpoint, error) {
421421 return bind .v6 .Receive (buf , & bind .isOpen )
422422}
423423
424- func (bind * afWinRingBind ) Send (buf []byte , nend * WinRingEndpoint , isOpen * uint32 ) error {
425- if atomic . LoadUint32 ( isOpen ) != 1 {
424+ func (bind * afWinRingBind ) Send (buf []byte , nend * WinRingEndpoint , isOpen * atomic. Uint32 ) error {
425+ if isOpen . Load ( ) != 1 {
426426 return net .ErrClosed
427427 }
428428 if len (buf ) > bytesPerPacket {
@@ -444,7 +444,7 @@ func (bind *afWinRingBind) Send(buf []byte, nend *WinRingEndpoint, isOpen *uint3
444444 if err != nil {
445445 return err
446446 }
447- if atomic . LoadUint32 ( isOpen ) != 1 {
447+ if isOpen . Load ( ) != 1 {
448448 return net .ErrClosed
449449 }
450450 count = winrio .DequeueCompletion (bind .tx .cq , results [:])
@@ -538,7 +538,7 @@ func (bind *StdNetBind) BindSocketToInterface6(interfaceIndex uint32, blackhole
538538func (bind * WinRingBind ) BindSocketToInterface4 (interfaceIndex uint32 , blackhole bool ) error {
539539 bind .mu .RLock ()
540540 defer bind .mu .RUnlock ()
541- if atomic . LoadUint32 ( & bind .isOpen ) != 1 {
541+ if bind .isOpen . Load ( ) != 1 {
542542 return net .ErrClosed
543543 }
544544 err := bindSocketToInterface4 (bind .v4 .sock , interfaceIndex )
@@ -552,7 +552,7 @@ func (bind *WinRingBind) BindSocketToInterface4(interfaceIndex uint32, blackhole
552552func (bind * WinRingBind ) BindSocketToInterface6 (interfaceIndex uint32 , blackhole bool ) error {
553553 bind .mu .RLock ()
554554 defer bind .mu .RUnlock ()
555- if atomic . LoadUint32 ( & bind .isOpen ) != 1 {
555+ if bind .isOpen . Load ( ) != 1 {
556556 return net .ErrClosed
557557 }
558558 err := bindSocketToInterface6 (bind .v6 .sock , interfaceIndex )
0 commit comments