@@ -77,14 +77,12 @@ type operation struct {
77
77
mode int32
78
78
79
79
// fields used only by net package
80
- buf syscall.WSABuf
81
- msg windows.WSAMsg
82
- sa syscall.Sockaddr
83
- rsa * syscall.RawSockaddrAny
84
- rsan int32
85
- flags uint32
86
- qty uint32
87
- bufs []syscall.WSABuf
80
+ buf syscall.WSABuf
81
+ msg windows.WSAMsg
82
+ sa syscall.Sockaddr
83
+ rsa * syscall.RawSockaddrAny
84
+ rsan int32
85
+ bufs []syscall.WSABuf
88
86
}
89
87
90
88
func (o * operation ) setEvent () {
@@ -210,7 +208,7 @@ func (fd *FD) cancelIO(o *operation) {
210
208
// It supports both synchronous and asynchronous IO.
211
209
// o.qty and o.flags are set to zero before calling submit
212
210
// to avoid reusing the values from a previous call.
213
- func (fd * FD ) execIO (o * operation , submit func (o * operation ) error ) (int , error ) {
211
+ func (fd * FD ) execIO (o * operation , submit func (o * operation ) ( uint32 , error ) ) (int , error ) {
214
212
// Notify runtime netpoll about starting IO.
215
213
err := fd .pd .prepare (int (o .mode ), fd .isFile )
216
214
if err != nil {
@@ -223,9 +221,7 @@ func (fd *FD) execIO(o *operation, submit func(o *operation) error) (int, error)
223
221
// event to wait for the IO to complete.
224
222
o .setEvent ()
225
223
}
226
- o .qty = 0
227
- o .flags = 0
228
- err = submit (o )
224
+ qty , err := submit (o )
229
225
var waitErr error
230
226
// Blocking operations shouldn't return ERROR_IO_PENDING.
231
227
// Continue without waiting if that happens.
@@ -240,9 +236,10 @@ func (fd *FD) execIO(o *operation, submit func(o *operation) error) (int, error)
240
236
// before the cancellation request runs.
241
237
}
242
238
if fd .isFile {
243
- err = windows .GetOverlappedResult (fd .Sysfd , & o .o , & o . qty , false )
239
+ err = windows .GetOverlappedResult (fd .Sysfd , & o .o , & qty , false )
244
240
} else {
245
- err = windows .WSAGetOverlappedResult (fd .Sysfd , & o .o , & o .qty , false , & o .flags )
241
+ var flags uint32
242
+ err = windows .WSAGetOverlappedResult (fd .Sysfd , & o .o , & qty , false , & flags )
246
243
}
247
244
}
248
245
switch err {
@@ -266,7 +263,7 @@ func (fd *FD) execIO(o *operation, submit func(o *operation) error) (int, error)
266
263
err = waitErr
267
264
}
268
265
}
269
- return int (o . qty ), err
266
+ return int (qty ), err
270
267
}
271
268
272
269
// FD is a file descriptor. The net and os packages embed this type in
@@ -507,8 +504,9 @@ func (fd *FD) Read(buf []byte) (int, error) {
507
504
case kindFile , kindPipe :
508
505
o := & fd .rop
509
506
o .InitBuf (buf )
510
- n , err = fd .execIO (o , func (o * operation ) error {
511
- return syscall .ReadFile (fd .Sysfd , unsafe .Slice (o .buf .Buf , o .buf .Len ), & o .qty , fd .overlapped (o ))
507
+ n , err = fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
508
+ err = syscall .ReadFile (fd .Sysfd , unsafe .Slice (o .buf .Buf , o .buf .Len ), & qty , fd .overlapped (o ))
509
+ return qty , err
512
510
})
513
511
fd .addOffset (n )
514
512
switch err {
@@ -523,8 +521,10 @@ func (fd *FD) Read(buf []byte) (int, error) {
523
521
case kindNet :
524
522
o := & fd .rop
525
523
o .InitBuf (buf )
526
- n , err = fd .execIO (o , func (o * operation ) error {
527
- return syscall .WSARecv (fd .Sysfd , & o .buf , 1 , & o .qty , & o .flags , & o .o , nil )
524
+ n , err = fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
525
+ var flags uint32
526
+ err = syscall .WSARecv (fd .Sysfd , & o .buf , 1 , & qty , & flags , & o .o , nil )
527
+ return qty , err
528
528
})
529
529
if race .Enabled {
530
530
race .Acquire (unsafe .Pointer (& ioSync ))
@@ -638,8 +638,9 @@ func (fd *FD) Pread(b []byte, off int64) (int, error) {
638
638
o := & fd .rop
639
639
o .InitBuf (b )
640
640
fd .setOffset (off )
641
- n , err := fd .execIO (o , func (o * operation ) error {
642
- return syscall .ReadFile (fd .Sysfd , unsafe .Slice (o .buf .Buf , o .buf .Len ), & o .qty , & o .o )
641
+ n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
642
+ err = syscall .ReadFile (fd .Sysfd , unsafe .Slice (o .buf .Buf , o .buf .Len ), & qty , & o .o )
643
+ return qty , err
643
644
})
644
645
if err == syscall .ERROR_HANDLE_EOF {
645
646
err = io .EOF
@@ -664,12 +665,14 @@ func (fd *FD) ReadFrom(buf []byte) (int, syscall.Sockaddr, error) {
664
665
defer fd .readUnlock ()
665
666
o := & fd .rop
666
667
o .InitBuf (buf )
667
- n , err := fd .execIO (o , func (o * operation ) error {
668
+ n , err := fd .execIO (o , func (o * operation ) ( qty uint32 , err error ) {
668
669
if o .rsa == nil {
669
670
o .rsa = new (syscall.RawSockaddrAny )
670
671
}
671
672
o .rsan = int32 (unsafe .Sizeof (* o .rsa ))
672
- return syscall .WSARecvFrom (fd .Sysfd , & o .buf , 1 , & o .qty , & o .flags , o .rsa , & o .rsan , & o .o , nil )
673
+ var flags uint32
674
+ err = syscall .WSARecvFrom (fd .Sysfd , & o .buf , 1 , & qty , & flags , o .rsa , & o .rsan , & o .o , nil )
675
+ return qty , err
673
676
})
674
677
err = fd .eofError (n , err )
675
678
if err != nil {
@@ -693,12 +696,14 @@ func (fd *FD) ReadFromInet4(buf []byte, sa4 *syscall.SockaddrInet4) (int, error)
693
696
defer fd .readUnlock ()
694
697
o := & fd .rop
695
698
o .InitBuf (buf )
696
- n , err := fd .execIO (o , func (o * operation ) error {
699
+ n , err := fd .execIO (o , func (o * operation ) ( qty uint32 , err error ) {
697
700
if o .rsa == nil {
698
701
o .rsa = new (syscall.RawSockaddrAny )
699
702
}
700
703
o .rsan = int32 (unsafe .Sizeof (* o .rsa ))
701
- return syscall .WSARecvFrom (fd .Sysfd , & o .buf , 1 , & o .qty , & o .flags , o .rsa , & o .rsan , & o .o , nil )
704
+ var flags uint32
705
+ err = syscall .WSARecvFrom (fd .Sysfd , & o .buf , 1 , & qty , & flags , o .rsa , & o .rsan , & o .o , nil )
706
+ return qty , err
702
707
})
703
708
err = fd .eofError (n , err )
704
709
if err != nil {
@@ -722,12 +727,14 @@ func (fd *FD) ReadFromInet6(buf []byte, sa6 *syscall.SockaddrInet6) (int, error)
722
727
defer fd .readUnlock ()
723
728
o := & fd .rop
724
729
o .InitBuf (buf )
725
- n , err := fd .execIO (o , func (o * operation ) error {
730
+ n , err := fd .execIO (o , func (o * operation ) ( qty uint32 , err error ) {
726
731
if o .rsa == nil {
727
732
o .rsa = new (syscall.RawSockaddrAny )
728
733
}
729
734
o .rsan = int32 (unsafe .Sizeof (* o .rsa ))
730
- return syscall .WSARecvFrom (fd .Sysfd , & o .buf , 1 , & o .qty , & o .flags , o .rsa , & o .rsan , & o .o , nil )
735
+ var flags uint32
736
+ err = syscall .WSARecvFrom (fd .Sysfd , & o .buf , 1 , & qty , & flags , o .rsa , & o .rsan , & o .o , nil )
737
+ return qty , err
731
738
})
732
739
err = fd .eofError (n , err )
733
740
if err != nil {
@@ -763,8 +770,9 @@ func (fd *FD) Write(buf []byte) (int, error) {
763
770
case kindPipe , kindFile :
764
771
o := & fd .wop
765
772
o .InitBuf (b )
766
- n , err = fd .execIO (o , func (o * operation ) error {
767
- return syscall .WriteFile (fd .Sysfd , unsafe .Slice (o .buf .Buf , o .buf .Len ), & o .qty , fd .overlapped (o ))
773
+ n , err = fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
774
+ err = syscall .WriteFile (fd .Sysfd , unsafe .Slice (o .buf .Buf , o .buf .Len ), & qty , fd .overlapped (o ))
775
+ return qty , err
768
776
})
769
777
fd .addOffset (n )
770
778
case kindNet :
@@ -773,8 +781,9 @@ func (fd *FD) Write(buf []byte) (int, error) {
773
781
}
774
782
o := & fd .wop
775
783
o .InitBuf (b )
776
- n , err = fd .execIO (o , func (o * operation ) error {
777
- return syscall .WSASend (fd .Sysfd , & o .buf , 1 , & o .qty , 0 , & o .o , nil )
784
+ n , err = fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
785
+ err = syscall .WSASend (fd .Sysfd , & o .buf , 1 , & qty , 0 , & o .o , nil )
786
+ return qty , err
778
787
})
779
788
}
780
789
ntotal += n
@@ -862,8 +871,9 @@ func (fd *FD) Pwrite(buf []byte, off int64) (int, error) {
862
871
o := & fd .wop
863
872
o .InitBuf (b )
864
873
fd .setOffset (off + int64 (ntotal ))
865
- n , err := fd .execIO (o , func (o * operation ) error {
866
- return syscall .WriteFile (fd .Sysfd , unsafe .Slice (o .buf .Buf , o .buf .Len ), & o .qty , & o .o )
874
+ n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
875
+ err = syscall .WriteFile (fd .Sysfd , unsafe .Slice (o .buf .Buf , o .buf .Len ), & qty , & o .o )
876
+ return qty , err
867
877
})
868
878
if n > 0 {
869
879
ntotal += n
@@ -891,8 +901,9 @@ func (fd *FD) Writev(buf *[][]byte) (int64, error) {
891
901
}
892
902
o := & fd .wop
893
903
o .InitBufs (buf )
894
- n , err := fd .execIO (o , func (o * operation ) error {
895
- return syscall .WSASend (fd .Sysfd , & o .bufs [0 ], uint32 (len (o .bufs )), & o .qty , 0 , & o .o , nil )
904
+ n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
905
+ err = syscall .WSASend (fd .Sysfd , & o .bufs [0 ], uint32 (len (o .bufs )), & qty , 0 , & o .o , nil )
906
+ return qty , err
896
907
})
897
908
o .ClearBufs ()
898
909
TestHookDidWritev (n )
@@ -912,8 +923,9 @@ func (fd *FD) WriteTo(buf []byte, sa syscall.Sockaddr) (int, error) {
912
923
o := & fd .wop
913
924
o .InitBuf (buf )
914
925
o .sa = sa
915
- n , err := fd .execIO (o , func (o * operation ) error {
916
- return syscall .WSASendto (fd .Sysfd , & o .buf , 1 , & o .qty , 0 , o .sa , & o .o , nil )
926
+ n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
927
+ err = syscall .WSASendto (fd .Sysfd , & o .buf , 1 , & qty , 0 , o .sa , & o .o , nil )
928
+ return qty , err
917
929
})
918
930
return n , err
919
931
}
@@ -927,8 +939,9 @@ func (fd *FD) WriteTo(buf []byte, sa syscall.Sockaddr) (int, error) {
927
939
o := & fd .wop
928
940
o .InitBuf (b )
929
941
o .sa = sa
930
- n , err := fd .execIO (o , func (o * operation ) error {
931
- return syscall .WSASendto (fd .Sysfd , & o .buf , 1 , & o .qty , 0 , o .sa , & o .o , nil )
942
+ n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
943
+ err = syscall .WSASendto (fd .Sysfd , & o .buf , 1 , & qty , 0 , o .sa , & o .o , nil )
944
+ return qty , err
932
945
})
933
946
ntotal += int (n )
934
947
if err != nil {
@@ -950,8 +963,9 @@ func (fd *FD) WriteToInet4(buf []byte, sa4 *syscall.SockaddrInet4) (int, error)
950
963
// handle zero-byte payload
951
964
o := & fd .wop
952
965
o .InitBuf (buf )
953
- n , err := fd .execIO (o , func (o * operation ) error {
954
- return windows .WSASendtoInet4 (fd .Sysfd , & o .buf , 1 , & o .qty , 0 , sa4 , & o .o , nil )
966
+ n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
967
+ err = windows .WSASendtoInet4 (fd .Sysfd , & o .buf , 1 , & qty , 0 , sa4 , & o .o , nil )
968
+ return qty , err
955
969
})
956
970
return n , err
957
971
}
@@ -964,8 +978,9 @@ func (fd *FD) WriteToInet4(buf []byte, sa4 *syscall.SockaddrInet4) (int, error)
964
978
}
965
979
o := & fd .wop
966
980
o .InitBuf (b )
967
- n , err := fd .execIO (o , func (o * operation ) error {
968
- return windows .WSASendtoInet4 (fd .Sysfd , & o .buf , 1 , & o .qty , 0 , sa4 , & o .o , nil )
981
+ n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
982
+ err = windows .WSASendtoInet4 (fd .Sysfd , & o .buf , 1 , & qty , 0 , sa4 , & o .o , nil )
983
+ return qty , err
969
984
})
970
985
ntotal += int (n )
971
986
if err != nil {
@@ -987,8 +1002,9 @@ func (fd *FD) WriteToInet6(buf []byte, sa6 *syscall.SockaddrInet6) (int, error)
987
1002
// handle zero-byte payload
988
1003
o := & fd .wop
989
1004
o .InitBuf (buf )
990
- n , err := fd .execIO (o , func (o * operation ) error {
991
- return windows .WSASendtoInet6 (fd .Sysfd , & o .buf , 1 , & o .qty , 0 , sa6 , & o .o , nil )
1005
+ n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
1006
+ err = windows .WSASendtoInet6 (fd .Sysfd , & o .buf , 1 , & qty , 0 , sa6 , & o .o , nil )
1007
+ return qty , err
992
1008
})
993
1009
return n , err
994
1010
}
@@ -1001,8 +1017,9 @@ func (fd *FD) WriteToInet6(buf []byte, sa6 *syscall.SockaddrInet6) (int, error)
1001
1017
}
1002
1018
o := & fd .wop
1003
1019
o .InitBuf (b )
1004
- n , err := fd .execIO (o , func (o * operation ) error {
1005
- return windows .WSASendtoInet6 (fd .Sysfd , & o .buf , 1 , & o .qty , 0 , sa6 , & o .o , nil )
1020
+ n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
1021
+ err = windows .WSASendtoInet6 (fd .Sysfd , & o .buf , 1 , & qty , 0 , sa6 , & o .o , nil )
1022
+ return qty , err
1006
1023
})
1007
1024
ntotal += int (n )
1008
1025
if err != nil {
@@ -1019,17 +1036,18 @@ func (fd *FD) WriteToInet6(buf []byte, sa6 *syscall.SockaddrInet6) (int, error)
1019
1036
func (fd * FD ) ConnectEx (ra syscall.Sockaddr ) error {
1020
1037
o := & fd .wop
1021
1038
o .sa = ra
1022
- _ , err := fd .execIO (o , func (o * operation ) error {
1023
- return ConnectExFunc (fd .Sysfd , o .sa , nil , 0 , nil , & o .o )
1039
+ _ , err := fd .execIO (o , func (o * operation ) ( uint32 , error ) {
1040
+ return 0 , ConnectExFunc (fd .Sysfd , o .sa , nil , 0 , nil , & o .o )
1024
1041
})
1025
1042
return err
1026
1043
}
1027
1044
1028
1045
func (fd * FD ) acceptOne (s syscall.Handle , rawsa []syscall.RawSockaddrAny , o * operation ) (string , error ) {
1029
1046
// Submit accept request.
1030
1047
o .rsan = int32 (unsafe .Sizeof (rawsa [0 ]))
1031
- _ , err := fd .execIO (o , func (o * operation ) error {
1032
- return AcceptFunc (fd .Sysfd , s , (* byte )(unsafe .Pointer (& rawsa [0 ])), 0 , uint32 (o .rsan ), uint32 (o .rsan ), & o .qty , & o .o )
1048
+ _ , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
1049
+ err = AcceptFunc (fd .Sysfd , s , (* byte )(unsafe .Pointer (& rawsa [0 ])), 0 , uint32 (o .rsan ), uint32 (o .rsan ), & qty , & o .o )
1050
+ return qty , err
1033
1051
})
1034
1052
if err != nil {
1035
1053
CloseFunc (s )
@@ -1171,11 +1189,13 @@ func (fd *FD) RawRead(f func(uintptr) bool) error {
1171
1189
// socket is readable. h/t https://stackoverflow.com/a/42019668/332798
1172
1190
o := & fd .rop
1173
1191
o .InitBuf (nil )
1174
- _ , err := fd .execIO (o , func (o * operation ) error {
1192
+ _ , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
1193
+ var flags uint32
1175
1194
if ! fd .IsStream {
1176
- o . flags |= windows .MSG_PEEK
1195
+ flags |= windows .MSG_PEEK
1177
1196
}
1178
- return syscall .WSARecv (fd .Sysfd , & o .buf , 1 , & o .qty , & o .flags , & o .o , nil )
1197
+ err = syscall .WSARecv (fd .Sysfd , & o .buf , 1 , & qty , & flags , & o .o , nil )
1198
+ return qty , err
1179
1199
})
1180
1200
if err == windows .WSAEMSGSIZE {
1181
1201
// expected with a 0-byte peek, ignore.
@@ -1270,8 +1290,9 @@ func (fd *FD) ReadMsg(p []byte, oob []byte, flags int) (int, int, int, syscall.S
1270
1290
o .msg .Name = (syscall .Pointer )(unsafe .Pointer (o .rsa ))
1271
1291
o .msg .Namelen = int32 (unsafe .Sizeof (* o .rsa ))
1272
1292
o .msg .Flags = uint32 (flags )
1273
- n , err := fd .execIO (o , func (o * operation ) error {
1274
- return windows .WSARecvMsg (fd .Sysfd , & o .msg , & o .qty , & o .o , nil )
1293
+ n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
1294
+ err = windows .WSARecvMsg (fd .Sysfd , & o .msg , & qty , & o .o , nil )
1295
+ return qty , err
1275
1296
})
1276
1297
err = fd .eofError (n , err )
1277
1298
var sa syscall.Sockaddr
@@ -1300,8 +1321,9 @@ func (fd *FD) ReadMsgInet4(p []byte, oob []byte, flags int, sa4 *syscall.Sockadd
1300
1321
o .msg .Name = (syscall .Pointer )(unsafe .Pointer (o .rsa ))
1301
1322
o .msg .Namelen = int32 (unsafe .Sizeof (* o .rsa ))
1302
1323
o .msg .Flags = uint32 (flags )
1303
- n , err := fd .execIO (o , func (o * operation ) error {
1304
- return windows .WSARecvMsg (fd .Sysfd , & o .msg , & o .qty , & o .o , nil )
1324
+ n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
1325
+ err = windows .WSARecvMsg (fd .Sysfd , & o .msg , & qty , & o .o , nil )
1326
+ return qty , err
1305
1327
})
1306
1328
err = fd .eofError (n , err )
1307
1329
if err == nil {
@@ -1329,8 +1351,9 @@ func (fd *FD) ReadMsgInet6(p []byte, oob []byte, flags int, sa6 *syscall.Sockadd
1329
1351
o .msg .Name = (syscall .Pointer )(unsafe .Pointer (o .rsa ))
1330
1352
o .msg .Namelen = int32 (unsafe .Sizeof (* o .rsa ))
1331
1353
o .msg .Flags = uint32 (flags )
1332
- n , err := fd .execIO (o , func (o * operation ) error {
1333
- return windows .WSARecvMsg (fd .Sysfd , & o .msg , & o .qty , & o .o , nil )
1354
+ n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
1355
+ err = windows .WSARecvMsg (fd .Sysfd , & o .msg , & qty , & o .o , nil )
1356
+ return qty , err
1334
1357
})
1335
1358
err = fd .eofError (n , err )
1336
1359
if err == nil {
@@ -1363,8 +1386,9 @@ func (fd *FD) WriteMsg(p []byte, oob []byte, sa syscall.Sockaddr) (int, int, err
1363
1386
o .msg .Name = (syscall .Pointer )(unsafe .Pointer (o .rsa ))
1364
1387
o .msg .Namelen = len
1365
1388
}
1366
- n , err := fd .execIO (o , func (o * operation ) error {
1367
- return windows .WSASendMsg (fd .Sysfd , & o .msg , 0 , & o .qty , & o .o , nil )
1389
+ n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
1390
+ err = windows .WSASendMsg (fd .Sysfd , & o .msg , 0 , nil , & o .o , nil )
1391
+ return qty , err
1368
1392
})
1369
1393
return n , int (o .msg .Control .Len ), err
1370
1394
}
@@ -1388,8 +1412,9 @@ func (fd *FD) WriteMsgInet4(p []byte, oob []byte, sa *syscall.SockaddrInet4) (in
1388
1412
len := sockaddrInet4ToRaw (o .rsa , sa )
1389
1413
o .msg .Name = (syscall .Pointer )(unsafe .Pointer (o .rsa ))
1390
1414
o .msg .Namelen = len
1391
- n , err := fd .execIO (o , func (o * operation ) error {
1392
- return windows .WSASendMsg (fd .Sysfd , & o .msg , 0 , & o .qty , & o .o , nil )
1415
+ n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
1416
+ err = windows .WSASendMsg (fd .Sysfd , & o .msg , 0 , nil , & o .o , nil )
1417
+ return qty , err
1393
1418
})
1394
1419
return n , int (o .msg .Control .Len ), err
1395
1420
}
@@ -1413,8 +1438,9 @@ func (fd *FD) WriteMsgInet6(p []byte, oob []byte, sa *syscall.SockaddrInet6) (in
1413
1438
len := sockaddrInet6ToRaw (o .rsa , sa )
1414
1439
o .msg .Name = (syscall .Pointer )(unsafe .Pointer (o .rsa ))
1415
1440
o .msg .Namelen = len
1416
- n , err := fd .execIO (o , func (o * operation ) error {
1417
- return windows .WSASendMsg (fd .Sysfd , & o .msg , 0 , & o .qty , & o .o , nil )
1441
+ n , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
1442
+ err = windows .WSASendMsg (fd .Sysfd , & o .msg , 0 , nil , & o .o , nil )
1443
+ return qty , err
1418
1444
})
1419
1445
return n , int (o .msg .Control .Len ), err
1420
1446
}
0 commit comments