@@ -14,6 +14,7 @@ import (
14
14
"sync"
15
15
"sync/atomic"
16
16
"syscall"
17
+ "time"
17
18
"unsafe"
18
19
19
20
"github.com/sirupsen/logrus"
@@ -178,10 +179,11 @@ func (u *RIOConn) receive(buf []byte) (int, windows.RawSockaddrInet6, error) {
178
179
retry:
179
180
count = 0
180
181
for tries := 0 ; count == 0 && tries < receiveSpins ; tries ++ {
182
+ if ! u .isOpen .Load () { // might have changed since first check before the mutex lock
183
+ return 0 , windows.RawSockaddrInet6 {}, net .ErrClosed
184
+ }
185
+
181
186
if tries > 0 {
182
- if ! u .isOpen .Load () {
183
- return 0 , windows.RawSockaddrInet6 {}, net .ErrClosed
184
- }
185
187
procyield (1 )
186
188
}
187
189
@@ -247,6 +249,10 @@ func (u *RIOConn) WriteTo(buf []byte, ip netip.AddrPort) error {
247
249
u .tx .mu .Lock ()
248
250
defer u .tx .mu .Unlock ()
249
251
252
+ if ! u .isOpen .Load () { // might have changed since first check before the mutex lock
253
+ return net .ErrClosed
254
+ }
255
+
250
256
count := winrio .DequeueCompletion (u .tx .cq , u .results [:])
251
257
if count == 0 && u .tx .isFull {
252
258
err := winrio .Notify (u .tx .cq )
@@ -323,6 +329,14 @@ func (u *RIOConn) Close() error {
323
329
windows .PostQueuedCompletionStatus (u .rx .iocp , 0 , 0 , nil )
324
330
windows .PostQueuedCompletionStatus (u .tx .iocp , 0 , 0 , nil )
325
331
332
+ u .rx .mu .Lock () // for waiting till active reader is done
333
+ time .Sleep (time .Millisecond * 0 ) // avoid warning about empty critical section
334
+ u .rx .mu .Unlock ()
335
+
336
+ u .tx .mu .Lock () // for waiting till active writer is done
337
+ time .Sleep (time .Millisecond * 0 ) // avoid warning about empty critical section
338
+ u .tx .mu .Unlock ()
339
+
326
340
u .rx .CloseAndZero ()
327
341
u .tx .CloseAndZero ()
328
342
if u .sock != 0 {
0 commit comments