@@ -77,7 +77,6 @@ type operation struct {
77
77
mode int32
78
78
79
79
// fields used only by net package
80
- fd * FD
81
80
buf syscall.WSABuf
82
81
msg windows.WSAMsg
83
82
sa syscall.Sockaddr
@@ -105,8 +104,8 @@ func (o *operation) close() {
105
104
}
106
105
}
107
106
108
- func (o * operation ) overlapped () * syscall.Overlapped {
109
- if o . fd .isBlocking {
107
+ func (fd * FD ) overlapped (o * operation ) * syscall.Overlapped {
108
+ if fd .isBlocking {
110
109
// Don't return the overlapped object if the file handle
111
110
// doesn't use overlapped I/O. It could be used, but
112
111
// that would then use the file pointer stored in the
@@ -171,11 +170,10 @@ func (o *operation) InitMsg(p []byte, oob []byte) {
171
170
}
172
171
173
172
// waitIO waits for the IO operation o to complete.
174
- func waitIO (o * operation ) error {
175
- if o . fd .isBlocking {
173
+ func ( fd * FD ) waitIO (o * operation ) error {
174
+ if fd .isBlocking {
176
175
panic ("can't wait on blocking operations" )
177
176
}
178
- fd := o .fd
179
177
if ! fd .pollable () {
180
178
// The overlapped handle is not added to the runtime poller,
181
179
// the only way to wait for the IO to complete is block until
@@ -195,8 +193,7 @@ func waitIO(o *operation) error {
195
193
}
196
194
197
195
// cancelIO cancels the IO operation o and waits for it to complete.
198
- func cancelIO (o * operation ) {
199
- fd := o .fd
196
+ func (fd * FD ) cancelIO (o * operation ) {
200
197
if ! fd .pollable () {
201
198
return
202
199
}
@@ -214,8 +211,7 @@ func cancelIO(o *operation) {
214
211
// It supports both synchronous and asynchronous IO.
215
212
// o.qty and o.flags are set to zero before calling submit
216
213
// to avoid reusing the values from a previous call.
217
- func execIO (o * operation , submit func (o * operation ) error ) (int , error ) {
218
- fd := o .fd
214
+ func (fd * FD ) execIO (o * operation , submit func (o * operation ) error ) (int , error ) {
219
215
// Notify runtime netpoll about starting IO.
220
216
err := fd .pd .prepare (int (o .mode ), fd .isFile )
221
217
if err != nil {
@@ -234,13 +230,13 @@ func execIO(o *operation, submit func(o *operation) error) (int, error) {
234
230
var waitErr error
235
231
// Blocking operations shouldn't return ERROR_IO_PENDING.
236
232
// Continue without waiting if that happens.
237
- if ! o . fd .isBlocking && (err == syscall .ERROR_IO_PENDING || (err == nil && ! o . fd .skipSyncNotif )) {
233
+ if ! fd .isBlocking && (err == syscall .ERROR_IO_PENDING || (err == nil && ! fd .skipSyncNotif )) {
238
234
// IO started asynchronously or completed synchronously but
239
235
// a sync notification is required. Wait for it to complete.
240
- waitErr = waitIO (o )
236
+ waitErr = fd . waitIO (o )
241
237
if waitErr != nil {
242
238
// IO interrupted by "close" or "timeout".
243
- cancelIO (o )
239
+ fd . cancelIO (o )
244
240
// We issued a cancellation request, but the IO operation may still succeeded
245
241
// before the cancellation request runs.
246
242
}
@@ -399,8 +395,6 @@ func (fd *FD) Init(net string, pollable bool) error {
399
395
fd .isBlocking = ! pollable
400
396
fd .rop .mode = 'r'
401
397
fd .wop .mode = 'w'
402
- fd .rop .fd = fd
403
- fd .wop .fd = fd
404
398
405
399
// It is safe to add overlapped handles that also perform I/O
406
400
// outside of the runtime poller. The runtime poller will ignore
@@ -514,8 +508,8 @@ func (fd *FD) Read(buf []byte) (int, error) {
514
508
case kindFile , kindPipe :
515
509
o := & fd .rop
516
510
o .InitBuf (buf )
517
- n , err = execIO (o , func (o * operation ) error {
518
- return syscall .ReadFile (o . fd .Sysfd , unsafe .Slice (o .buf .Buf , o .buf .Len ), & o .qty , o .overlapped ())
511
+ n , err = fd . execIO (o , func (o * operation ) error {
512
+ return syscall .ReadFile (fd .Sysfd , unsafe .Slice (o .buf .Buf , o .buf .Len ), & o .qty , fd .overlapped (o ))
519
513
})
520
514
fd .addOffset (n )
521
515
switch err {
@@ -530,8 +524,8 @@ func (fd *FD) Read(buf []byte) (int, error) {
530
524
case kindNet :
531
525
o := & fd .rop
532
526
o .InitBuf (buf )
533
- n , err = execIO (o , func (o * operation ) error {
534
- return syscall .WSARecv (o . fd .Sysfd , & o .buf , 1 , & o .qty , & o .flags , & o .o , nil )
527
+ n , err = fd . execIO (o , func (o * operation ) error {
528
+ return syscall .WSARecv (fd .Sysfd , & o .buf , 1 , & o .qty , & o .flags , & o .o , nil )
535
529
})
536
530
if race .Enabled {
537
531
race .Acquire (unsafe .Pointer (& ioSync ))
@@ -645,8 +639,8 @@ func (fd *FD) Pread(b []byte, off int64) (int, error) {
645
639
o := & fd .rop
646
640
o .InitBuf (b )
647
641
fd .setOffset (off )
648
- n , err := execIO (o , func (o * operation ) error {
649
- return syscall .ReadFile (o . fd .Sysfd , unsafe .Slice (o .buf .Buf , o .buf .Len ), & o .qty , & o .o )
642
+ n , err := fd . execIO (o , func (o * operation ) error {
643
+ return syscall .ReadFile (fd .Sysfd , unsafe .Slice (o .buf .Buf , o .buf .Len ), & o .qty , & o .o )
650
644
})
651
645
if err == syscall .ERROR_HANDLE_EOF {
652
646
err = io .EOF
@@ -671,12 +665,12 @@ func (fd *FD) ReadFrom(buf []byte) (int, syscall.Sockaddr, error) {
671
665
defer fd .readUnlock ()
672
666
o := & fd .rop
673
667
o .InitBuf (buf )
674
- n , err := execIO (o , func (o * operation ) error {
668
+ n , err := fd . execIO (o , func (o * operation ) error {
675
669
if o .rsa == nil {
676
670
o .rsa = new (syscall.RawSockaddrAny )
677
671
}
678
672
o .rsan = int32 (unsafe .Sizeof (* o .rsa ))
679
- return syscall .WSARecvFrom (o . fd .Sysfd , & o .buf , 1 , & o .qty , & o .flags , o .rsa , & o .rsan , & o .o , nil )
673
+ return syscall .WSARecvFrom (fd .Sysfd , & o .buf , 1 , & o .qty , & o .flags , o .rsa , & o .rsan , & o .o , nil )
680
674
})
681
675
err = fd .eofError (n , err )
682
676
if err != nil {
@@ -700,12 +694,12 @@ func (fd *FD) ReadFromInet4(buf []byte, sa4 *syscall.SockaddrInet4) (int, error)
700
694
defer fd .readUnlock ()
701
695
o := & fd .rop
702
696
o .InitBuf (buf )
703
- n , err := execIO (o , func (o * operation ) error {
697
+ n , err := fd . execIO (o , func (o * operation ) error {
704
698
if o .rsa == nil {
705
699
o .rsa = new (syscall.RawSockaddrAny )
706
700
}
707
701
o .rsan = int32 (unsafe .Sizeof (* o .rsa ))
708
- return syscall .WSARecvFrom (o . fd .Sysfd , & o .buf , 1 , & o .qty , & o .flags , o .rsa , & o .rsan , & o .o , nil )
702
+ return syscall .WSARecvFrom (fd .Sysfd , & o .buf , 1 , & o .qty , & o .flags , o .rsa , & o .rsan , & o .o , nil )
709
703
})
710
704
err = fd .eofError (n , err )
711
705
if err != nil {
@@ -729,12 +723,12 @@ func (fd *FD) ReadFromInet6(buf []byte, sa6 *syscall.SockaddrInet6) (int, error)
729
723
defer fd .readUnlock ()
730
724
o := & fd .rop
731
725
o .InitBuf (buf )
732
- n , err := execIO (o , func (o * operation ) error {
726
+ n , err := fd . execIO (o , func (o * operation ) error {
733
727
if o .rsa == nil {
734
728
o .rsa = new (syscall.RawSockaddrAny )
735
729
}
736
730
o .rsan = int32 (unsafe .Sizeof (* o .rsa ))
737
- return syscall .WSARecvFrom (o . fd .Sysfd , & o .buf , 1 , & o .qty , & o .flags , o .rsa , & o .rsan , & o .o , nil )
731
+ return syscall .WSARecvFrom (fd .Sysfd , & o .buf , 1 , & o .qty , & o .flags , o .rsa , & o .rsan , & o .o , nil )
738
732
})
739
733
err = fd .eofError (n , err )
740
734
if err != nil {
@@ -770,8 +764,8 @@ func (fd *FD) Write(buf []byte) (int, error) {
770
764
case kindPipe , kindFile :
771
765
o := & fd .wop
772
766
o .InitBuf (b )
773
- n , err = execIO (o , func (o * operation ) error {
774
- return syscall .WriteFile (o . fd .Sysfd , unsafe .Slice (o .buf .Buf , o .buf .Len ), & o .qty , o .overlapped ())
767
+ n , err = fd . execIO (o , func (o * operation ) error {
768
+ return syscall .WriteFile (fd .Sysfd , unsafe .Slice (o .buf .Buf , o .buf .Len ), & o .qty , fd .overlapped (o ))
775
769
})
776
770
fd .addOffset (n )
777
771
case kindNet :
@@ -780,8 +774,8 @@ func (fd *FD) Write(buf []byte) (int, error) {
780
774
}
781
775
o := & fd .wop
782
776
o .InitBuf (b )
783
- n , err = execIO (o , func (o * operation ) error {
784
- return syscall .WSASend (o . fd .Sysfd , & o .buf , 1 , & o .qty , 0 , & o .o , nil )
777
+ n , err = fd . execIO (o , func (o * operation ) error {
778
+ return syscall .WSASend (fd .Sysfd , & o .buf , 1 , & o .qty , 0 , & o .o , nil )
785
779
})
786
780
}
787
781
ntotal += n
@@ -869,8 +863,8 @@ func (fd *FD) Pwrite(buf []byte, off int64) (int, error) {
869
863
o := & fd .wop
870
864
o .InitBuf (b )
871
865
fd .setOffset (off + int64 (ntotal ))
872
- n , err := execIO (o , func (o * operation ) error {
873
- return syscall .WriteFile (o . fd .Sysfd , unsafe .Slice (o .buf .Buf , o .buf .Len ), & o .qty , & o .o )
866
+ n , err := fd . execIO (o , func (o * operation ) error {
867
+ return syscall .WriteFile (fd .Sysfd , unsafe .Slice (o .buf .Buf , o .buf .Len ), & o .qty , & o .o )
874
868
})
875
869
if n > 0 {
876
870
ntotal += n
@@ -898,8 +892,8 @@ func (fd *FD) Writev(buf *[][]byte) (int64, error) {
898
892
}
899
893
o := & fd .wop
900
894
o .InitBufs (buf )
901
- n , err := execIO (o , func (o * operation ) error {
902
- return syscall .WSASend (o . fd .Sysfd , & o .bufs [0 ], uint32 (len (o .bufs )), & o .qty , 0 , & o .o , nil )
895
+ n , err := fd . execIO (o , func (o * operation ) error {
896
+ return syscall .WSASend (fd .Sysfd , & o .bufs [0 ], uint32 (len (o .bufs )), & o .qty , 0 , & o .o , nil )
903
897
})
904
898
o .ClearBufs ()
905
899
TestHookDidWritev (n )
@@ -919,8 +913,8 @@ func (fd *FD) WriteTo(buf []byte, sa syscall.Sockaddr) (int, error) {
919
913
o := & fd .wop
920
914
o .InitBuf (buf )
921
915
o .sa = sa
922
- n , err := execIO (o , func (o * operation ) error {
923
- return syscall .WSASendto (o . fd .Sysfd , & o .buf , 1 , & o .qty , 0 , o .sa , & o .o , nil )
916
+ n , err := fd . execIO (o , func (o * operation ) error {
917
+ return syscall .WSASendto (fd .Sysfd , & o .buf , 1 , & o .qty , 0 , o .sa , & o .o , nil )
924
918
})
925
919
return n , err
926
920
}
@@ -934,8 +928,8 @@ func (fd *FD) WriteTo(buf []byte, sa syscall.Sockaddr) (int, error) {
934
928
o := & fd .wop
935
929
o .InitBuf (b )
936
930
o .sa = sa
937
- n , err := execIO (o , func (o * operation ) error {
938
- return syscall .WSASendto (o . fd .Sysfd , & o .buf , 1 , & o .qty , 0 , o .sa , & o .o , nil )
931
+ n , err := fd . execIO (o , func (o * operation ) error {
932
+ return syscall .WSASendto (fd .Sysfd , & o .buf , 1 , & o .qty , 0 , o .sa , & o .o , nil )
939
933
})
940
934
ntotal += int (n )
941
935
if err != nil {
@@ -957,8 +951,8 @@ func (fd *FD) WriteToInet4(buf []byte, sa4 *syscall.SockaddrInet4) (int, error)
957
951
// handle zero-byte payload
958
952
o := & fd .wop
959
953
o .InitBuf (buf )
960
- n , err := execIO (o , func (o * operation ) error {
961
- return windows .WSASendtoInet4 (o . fd .Sysfd , & o .buf , 1 , & o .qty , 0 , sa4 , & o .o , nil )
954
+ n , err := fd . execIO (o , func (o * operation ) error {
955
+ return windows .WSASendtoInet4 (fd .Sysfd , & o .buf , 1 , & o .qty , 0 , sa4 , & o .o , nil )
962
956
})
963
957
return n , err
964
958
}
@@ -971,8 +965,8 @@ func (fd *FD) WriteToInet4(buf []byte, sa4 *syscall.SockaddrInet4) (int, error)
971
965
}
972
966
o := & fd .wop
973
967
o .InitBuf (b )
974
- n , err := execIO (o , func (o * operation ) error {
975
- return windows .WSASendtoInet4 (o . fd .Sysfd , & o .buf , 1 , & o .qty , 0 , sa4 , & o .o , nil )
968
+ n , err := fd . execIO (o , func (o * operation ) error {
969
+ return windows .WSASendtoInet4 (fd .Sysfd , & o .buf , 1 , & o .qty , 0 , sa4 , & o .o , nil )
976
970
})
977
971
ntotal += int (n )
978
972
if err != nil {
@@ -994,8 +988,8 @@ func (fd *FD) WriteToInet6(buf []byte, sa6 *syscall.SockaddrInet6) (int, error)
994
988
// handle zero-byte payload
995
989
o := & fd .wop
996
990
o .InitBuf (buf )
997
- n , err := execIO (o , func (o * operation ) error {
998
- return windows .WSASendtoInet6 (o . fd .Sysfd , & o .buf , 1 , & o .qty , 0 , sa6 , & o .o , nil )
991
+ n , err := fd . execIO (o , func (o * operation ) error {
992
+ return windows .WSASendtoInet6 (fd .Sysfd , & o .buf , 1 , & o .qty , 0 , sa6 , & o .o , nil )
999
993
})
1000
994
return n , err
1001
995
}
@@ -1008,8 +1002,8 @@ func (fd *FD) WriteToInet6(buf []byte, sa6 *syscall.SockaddrInet6) (int, error)
1008
1002
}
1009
1003
o := & fd .wop
1010
1004
o .InitBuf (b )
1011
- n , err := execIO (o , func (o * operation ) error {
1012
- return windows .WSASendtoInet6 (o . fd .Sysfd , & o .buf , 1 , & o .qty , 0 , sa6 , & o .o , nil )
1005
+ n , err := fd . execIO (o , func (o * operation ) error {
1006
+ return windows .WSASendtoInet6 (fd .Sysfd , & o .buf , 1 , & o .qty , 0 , sa6 , & o .o , nil )
1013
1007
})
1014
1008
ntotal += int (n )
1015
1009
if err != nil {
@@ -1026,8 +1020,8 @@ func (fd *FD) WriteToInet6(buf []byte, sa6 *syscall.SockaddrInet6) (int, error)
1026
1020
func (fd * FD ) ConnectEx (ra syscall.Sockaddr ) error {
1027
1021
o := & fd .wop
1028
1022
o .sa = ra
1029
- _ , err := execIO (o , func (o * operation ) error {
1030
- return ConnectExFunc (o . fd .Sysfd , o .sa , nil , 0 , nil , & o .o )
1023
+ _ , err := fd . execIO (o , func (o * operation ) error {
1024
+ return ConnectExFunc (fd .Sysfd , o .sa , nil , 0 , nil , & o .o )
1031
1025
})
1032
1026
return err
1033
1027
}
@@ -1036,8 +1030,8 @@ func (fd *FD) acceptOne(s syscall.Handle, rawsa []syscall.RawSockaddrAny, o *ope
1036
1030
// Submit accept request.
1037
1031
o .handle = s
1038
1032
o .rsan = int32 (unsafe .Sizeof (rawsa [0 ]))
1039
- _ , err := execIO (o , func (o * operation ) error {
1040
- return AcceptFunc (o . fd .Sysfd , o .handle , (* byte )(unsafe .Pointer (& rawsa [0 ])), 0 , uint32 (o .rsan ), uint32 (o .rsan ), & o .qty , & o .o )
1033
+ _ , err := fd . execIO (o , func (o * operation ) error {
1034
+ return AcceptFunc (fd .Sysfd , o .handle , (* byte )(unsafe .Pointer (& rawsa [0 ])), 0 , uint32 (o .rsan ), uint32 (o .rsan ), & o .qty , & o .o )
1041
1035
})
1042
1036
if err != nil {
1043
1037
CloseFunc (s )
@@ -1179,11 +1173,11 @@ func (fd *FD) RawRead(f func(uintptr) bool) error {
1179
1173
// socket is readable. h/t https://stackoverflow.com/a/42019668/332798
1180
1174
o := & fd .rop
1181
1175
o .InitBuf (nil )
1182
- _ , err := execIO (o , func (o * operation ) error {
1176
+ _ , err := fd . execIO (o , func (o * operation ) error {
1183
1177
if ! fd .IsStream {
1184
1178
o .flags |= windows .MSG_PEEK
1185
1179
}
1186
- return syscall .WSARecv (o . fd .Sysfd , & o .buf , 1 , & o .qty , & o .flags , & o .o , nil )
1180
+ return syscall .WSARecv (fd .Sysfd , & o .buf , 1 , & o .qty , & o .flags , & o .o , nil )
1187
1181
})
1188
1182
if err == windows .WSAEMSGSIZE {
1189
1183
// expected with a 0-byte peek, ignore.
@@ -1278,8 +1272,8 @@ func (fd *FD) ReadMsg(p []byte, oob []byte, flags int) (int, int, int, syscall.S
1278
1272
o .msg .Name = (syscall .Pointer )(unsafe .Pointer (o .rsa ))
1279
1273
o .msg .Namelen = int32 (unsafe .Sizeof (* o .rsa ))
1280
1274
o .msg .Flags = uint32 (flags )
1281
- n , err := execIO (o , func (o * operation ) error {
1282
- return windows .WSARecvMsg (o . fd .Sysfd , & o .msg , & o .qty , & o .o , nil )
1275
+ n , err := fd . execIO (o , func (o * operation ) error {
1276
+ return windows .WSARecvMsg (fd .Sysfd , & o .msg , & o .qty , & o .o , nil )
1283
1277
})
1284
1278
err = fd .eofError (n , err )
1285
1279
var sa syscall.Sockaddr
@@ -1308,8 +1302,8 @@ func (fd *FD) ReadMsgInet4(p []byte, oob []byte, flags int, sa4 *syscall.Sockadd
1308
1302
o .msg .Name = (syscall .Pointer )(unsafe .Pointer (o .rsa ))
1309
1303
o .msg .Namelen = int32 (unsafe .Sizeof (* o .rsa ))
1310
1304
o .msg .Flags = uint32 (flags )
1311
- n , err := execIO (o , func (o * operation ) error {
1312
- return windows .WSARecvMsg (o . fd .Sysfd , & o .msg , & o .qty , & o .o , nil )
1305
+ n , err := fd . execIO (o , func (o * operation ) error {
1306
+ return windows .WSARecvMsg (fd .Sysfd , & o .msg , & o .qty , & o .o , nil )
1313
1307
})
1314
1308
err = fd .eofError (n , err )
1315
1309
if err == nil {
@@ -1337,8 +1331,8 @@ func (fd *FD) ReadMsgInet6(p []byte, oob []byte, flags int, sa6 *syscall.Sockadd
1337
1331
o .msg .Name = (syscall .Pointer )(unsafe .Pointer (o .rsa ))
1338
1332
o .msg .Namelen = int32 (unsafe .Sizeof (* o .rsa ))
1339
1333
o .msg .Flags = uint32 (flags )
1340
- n , err := execIO (o , func (o * operation ) error {
1341
- return windows .WSARecvMsg (o . fd .Sysfd , & o .msg , & o .qty , & o .o , nil )
1334
+ n , err := fd . execIO (o , func (o * operation ) error {
1335
+ return windows .WSARecvMsg (fd .Sysfd , & o .msg , & o .qty , & o .o , nil )
1342
1336
})
1343
1337
err = fd .eofError (n , err )
1344
1338
if err == nil {
@@ -1371,8 +1365,8 @@ func (fd *FD) WriteMsg(p []byte, oob []byte, sa syscall.Sockaddr) (int, int, err
1371
1365
o .msg .Name = (syscall .Pointer )(unsafe .Pointer (o .rsa ))
1372
1366
o .msg .Namelen = len
1373
1367
}
1374
- n , err := execIO (o , func (o * operation ) error {
1375
- return windows .WSASendMsg (o . fd .Sysfd , & o .msg , 0 , & o .qty , & o .o , nil )
1368
+ n , err := fd . execIO (o , func (o * operation ) error {
1369
+ return windows .WSASendMsg (fd .Sysfd , & o .msg , 0 , & o .qty , & o .o , nil )
1376
1370
})
1377
1371
return n , int (o .msg .Control .Len ), err
1378
1372
}
@@ -1396,8 +1390,8 @@ func (fd *FD) WriteMsgInet4(p []byte, oob []byte, sa *syscall.SockaddrInet4) (in
1396
1390
len := sockaddrInet4ToRaw (o .rsa , sa )
1397
1391
o .msg .Name = (syscall .Pointer )(unsafe .Pointer (o .rsa ))
1398
1392
o .msg .Namelen = len
1399
- n , err := execIO (o , func (o * operation ) error {
1400
- return windows .WSASendMsg (o . fd .Sysfd , & o .msg , 0 , & o .qty , & o .o , nil )
1393
+ n , err := fd . execIO (o , func (o * operation ) error {
1394
+ return windows .WSASendMsg (fd .Sysfd , & o .msg , 0 , & o .qty , & o .o , nil )
1401
1395
})
1402
1396
return n , int (o .msg .Control .Len ), err
1403
1397
}
@@ -1421,8 +1415,8 @@ func (fd *FD) WriteMsgInet6(p []byte, oob []byte, sa *syscall.SockaddrInet6) (in
1421
1415
len := sockaddrInet6ToRaw (o .rsa , sa )
1422
1416
o .msg .Name = (syscall .Pointer )(unsafe .Pointer (o .rsa ))
1423
1417
o .msg .Namelen = len
1424
- n , err := execIO (o , func (o * operation ) error {
1425
- return windows .WSASendMsg (o . fd .Sysfd , & o .msg , 0 , & o .qty , & o .o , nil )
1418
+ n , err := fd . execIO (o , func (o * operation ) error {
1419
+ return windows .WSASendMsg (fd .Sysfd , & o .msg , 0 , & o .qty , & o .o , nil )
1426
1420
})
1427
1421
return n , int (o .msg .Control .Len ), err
1428
1422
}
0 commit comments