@@ -250,12 +250,16 @@ func (fd *FD) cancelIO(o *operation) {
250
250
// It supports both synchronous and asynchronous IO.
251
251
// o.qty and o.flags are set to zero before calling submit
252
252
// to avoid reusing the values from a previous call.
253
- func (fd * FD ) execIO (o * operation , submit func (o * operation ) (uint32 , error )) (int , error ) {
253
+ func (fd * FD ) execIO (mode int , submit func (o * operation ) (uint32 , error )) (int , error ) {
254
254
// Notify runtime netpoll about starting IO.
255
- err := fd .pd .prepare (int ( o . mode ) , fd .isFile )
255
+ err := fd .pd .prepare (mode , fd .isFile )
256
256
if err != nil {
257
257
return 0 , err
258
258
}
259
+ o := & fd .rop
260
+ if mode == 'w' {
261
+ o = & fd .wop
262
+ }
259
263
// Start IO.
260
264
if ! fd .isBlocking && o .o .HEvent == 0 && ! fd .pollable () {
261
265
// If the handle is opened for overlapped IO but we can't
@@ -552,7 +556,7 @@ func (fd *FD) Read(buf []byte) (int, error) {
552
556
case kindConsole :
553
557
n , err = fd .readConsole (buf )
554
558
case kindFile , kindPipe :
555
- n , err = fd .execIO (& fd . rop , func (o * operation ) (qty uint32 , err error ) {
559
+ n , err = fd .execIO ('r' , func (o * operation ) (qty uint32 , err error ) {
556
560
err = syscall .ReadFile (fd .Sysfd , buf , & qty , fd .overlapped (o ))
557
561
return qty , err
558
562
})
@@ -567,7 +571,7 @@ func (fd *FD) Read(buf []byte) (int, error) {
567
571
}
568
572
}
569
573
case kindNet :
570
- n , err = fd .execIO (& fd . rop , func (o * operation ) (qty uint32 , err error ) {
574
+ n , err = fd .execIO ('r' , func (o * operation ) (qty uint32 , err error ) {
571
575
var flags uint32
572
576
err = syscall .WSARecv (fd .Sysfd , newWsaBuf (buf ), 1 , & qty , & flags , & o .o , nil )
573
577
return qty , err
@@ -694,7 +698,7 @@ func (fd *FD) Pread(buf []byte, off int64) (int, error) {
694
698
defer fd .setOffset (curoffset )
695
699
}
696
700
fd .setOffset (off )
697
- n , err := fd .execIO (& fd . rop , func (o * operation ) (qty uint32 , err error ) {
701
+ n , err := fd .execIO ('r' , func (o * operation ) (qty uint32 , err error ) {
698
702
err = syscall .ReadFile (fd .Sysfd , buf , & qty , & o .o )
699
703
return qty , err
700
704
})
@@ -727,7 +731,7 @@ func (fd *FD) ReadFrom(buf []byte) (int, syscall.Sockaddr, error) {
727
731
728
732
rsa := wsaRsaPool .Get ().(* syscall.RawSockaddrAny )
729
733
defer wsaRsaPool .Put (rsa )
730
- n , err := fd .execIO (& fd . rop , func (o * operation ) (qty uint32 , err error ) {
734
+ n , err := fd .execIO ('r' , func (o * operation ) (qty uint32 , err error ) {
731
735
rsan := int32 (unsafe .Sizeof (* rsa ))
732
736
var flags uint32
733
737
err = syscall .WSARecvFrom (fd .Sysfd , newWsaBuf (buf ), 1 , & qty , & flags , rsa , & rsan , & o .o , nil )
@@ -761,7 +765,7 @@ func (fd *FD) ReadFromInet4(buf []byte, sa4 *syscall.SockaddrInet4) (int, error)
761
765
762
766
rsa := wsaRsaPool .Get ().(* syscall.RawSockaddrAny )
763
767
defer wsaRsaPool .Put (rsa )
764
- n , err := fd .execIO (& fd . rop , func (o * operation ) (qty uint32 , err error ) {
768
+ n , err := fd .execIO ('r' , func (o * operation ) (qty uint32 , err error ) {
765
769
rsan := int32 (unsafe .Sizeof (* rsa ))
766
770
var flags uint32
767
771
err = syscall .WSARecvFrom (fd .Sysfd , newWsaBuf (buf ), 1 , & qty , & flags , rsa , & rsan , & o .o , nil )
@@ -795,7 +799,7 @@ func (fd *FD) ReadFromInet6(buf []byte, sa6 *syscall.SockaddrInet6) (int, error)
795
799
796
800
rsa := wsaRsaPool .Get ().(* syscall.RawSockaddrAny )
797
801
defer wsaRsaPool .Put (rsa )
798
- n , err := fd .execIO (& fd . rop , func (o * operation ) (qty uint32 , err error ) {
802
+ n , err := fd .execIO ('r' , func (o * operation ) (qty uint32 , err error ) {
799
803
rsan := int32 (unsafe .Sizeof (* rsa ))
800
804
var flags uint32
801
805
err = syscall .WSARecvFrom (fd .Sysfd , newWsaBuf (buf ), 1 , & qty , & flags , rsa , & rsan , & o .o , nil )
@@ -841,7 +845,7 @@ func (fd *FD) Write(buf []byte) (int, error) {
841
845
case kindConsole :
842
846
n , err = fd .writeConsole (b )
843
847
case kindPipe , kindFile :
844
- n , err = fd .execIO (& fd . wop , func (o * operation ) (qty uint32 , err error ) {
848
+ n , err = fd .execIO ('w' , func (o * operation ) (qty uint32 , err error ) {
845
849
err = syscall .WriteFile (fd .Sysfd , b , & qty , fd .overlapped (o ))
846
850
return qty , err
847
851
})
@@ -850,7 +854,7 @@ func (fd *FD) Write(buf []byte) (int, error) {
850
854
if race .Enabled {
851
855
race .ReleaseMerge (unsafe .Pointer (& ioSync ))
852
856
}
853
- n , err = fd .execIO (& fd . wop , func (o * operation ) (qty uint32 , err error ) {
857
+ n , err = fd .execIO ('w' , func (o * operation ) (qty uint32 , err error ) {
854
858
err = syscall .WSASend (fd .Sysfd , newWsaBuf (b ), 1 , & qty , 0 , & o .o , nil )
855
859
return qty , err
856
860
})
@@ -949,7 +953,7 @@ func (fd *FD) Pwrite(buf []byte, off int64) (int, error) {
949
953
max = ntotal + maxRW
950
954
}
951
955
fd .setOffset (off + int64 (ntotal ))
952
- n , err := fd .execIO (& fd . wop , func (o * operation ) (qty uint32 , err error ) {
956
+ n , err := fd .execIO ('w' , func (o * operation ) (qty uint32 , err error ) {
953
957
err = syscall .WriteFile (fd .Sysfd , buf [ntotal :max ], & qty , & o .o )
954
958
return qty , err
955
959
})
@@ -979,7 +983,7 @@ func (fd *FD) Writev(buf *[][]byte) (int64, error) {
979
983
}
980
984
bufs := newWSABufs (buf )
981
985
defer freeWSABufs (bufs )
982
- n , err := fd .execIO (& fd . wop , func (o * operation ) (qty uint32 , err error ) {
986
+ n , err := fd .execIO ('w' , func (o * operation ) (qty uint32 , err error ) {
983
987
err = syscall .WSASend (fd .Sysfd , & (* bufs )[0 ], uint32 (len (* bufs )), & qty , 0 , & o .o , nil )
984
988
return qty , err
985
989
})
@@ -997,7 +1001,7 @@ func (fd *FD) WriteTo(buf []byte, sa syscall.Sockaddr) (int, error) {
997
1001
998
1002
if len (buf ) == 0 {
999
1003
// handle zero-byte payload
1000
- n , err := fd .execIO (& fd . wop , func (o * operation ) (qty uint32 , err error ) {
1004
+ n , err := fd .execIO ('w' , func (o * operation ) (qty uint32 , err error ) {
1001
1005
err = syscall .WSASendto (fd .Sysfd , & syscall.WSABuf {}, 1 , & qty , 0 , sa , & o .o , nil )
1002
1006
return qty , err
1003
1007
})
@@ -1015,7 +1019,7 @@ func (fd *FD) WriteTo(buf []byte, sa syscall.Sockaddr) (int, error) {
1015
1019
if len (b ) > maxRW {
1016
1020
b = b [:maxRW ]
1017
1021
}
1018
- n , err := fd .execIO (& fd . wop , func (o * operation ) (qty uint32 , err error ) {
1022
+ n , err := fd .execIO ('w' , func (o * operation ) (qty uint32 , err error ) {
1019
1023
err = syscall .WSASendto (fd .Sysfd , newWsaBuf (b ), 1 , & qty , 0 , sa , & o .o , nil )
1020
1024
return qty , err
1021
1025
})
@@ -1037,7 +1041,7 @@ func (fd *FD) WriteToInet4(buf []byte, sa4 *syscall.SockaddrInet4) (int, error)
1037
1041
1038
1042
if len (buf ) == 0 {
1039
1043
// handle zero-byte payload
1040
- n , err := fd .execIO (& fd . wop , func (o * operation ) (qty uint32 , err error ) {
1044
+ n , err := fd .execIO ('w' , func (o * operation ) (qty uint32 , err error ) {
1041
1045
err = windows .WSASendtoInet4 (fd .Sysfd , & syscall.WSABuf {}, 1 , & qty , 0 , sa4 , & o .o , nil )
1042
1046
return qty , err
1043
1047
})
@@ -1055,7 +1059,7 @@ func (fd *FD) WriteToInet4(buf []byte, sa4 *syscall.SockaddrInet4) (int, error)
1055
1059
if len (b ) > maxRW {
1056
1060
b = b [:maxRW ]
1057
1061
}
1058
- n , err := fd .execIO (& fd . wop , func (o * operation ) (qty uint32 , err error ) {
1062
+ n , err := fd .execIO ('w' , func (o * operation ) (qty uint32 , err error ) {
1059
1063
err = windows .WSASendtoInet4 (fd .Sysfd , newWsaBuf (b ), 1 , & qty , 0 , sa4 , & o .o , nil )
1060
1064
return qty , err
1061
1065
})
@@ -1077,7 +1081,7 @@ func (fd *FD) WriteToInet6(buf []byte, sa6 *syscall.SockaddrInet6) (int, error)
1077
1081
1078
1082
if len (buf ) == 0 {
1079
1083
// handle zero-byte payload
1080
- n , err := fd .execIO (& fd . wop , func (o * operation ) (qty uint32 , err error ) {
1084
+ n , err := fd .execIO ('w' , func (o * operation ) (qty uint32 , err error ) {
1081
1085
err = windows .WSASendtoInet6 (fd .Sysfd , & syscall.WSABuf {}, 1 , & qty , 0 , sa6 , & o .o , nil )
1082
1086
return qty , err
1083
1087
})
@@ -1095,7 +1099,7 @@ func (fd *FD) WriteToInet6(buf []byte, sa6 *syscall.SockaddrInet6) (int, error)
1095
1099
if len (b ) > maxRW {
1096
1100
b = b [:maxRW ]
1097
1101
}
1098
- n , err := fd .execIO (& fd . wop , func (o * operation ) (qty uint32 , err error ) {
1102
+ n , err := fd .execIO ('w' , func (o * operation ) (qty uint32 , err error ) {
1099
1103
err = windows .WSASendtoInet6 (fd .Sysfd , newWsaBuf (b ), 1 , & qty , 0 , sa6 , & o .o , nil )
1100
1104
return qty , err
1101
1105
})
@@ -1112,17 +1116,16 @@ func (fd *FD) WriteToInet6(buf []byte, sa6 *syscall.SockaddrInet6) (int, error)
1112
1116
// called when the descriptor is first created. This is here rather
1113
1117
// than in the net package so that it can use fd.wop.
1114
1118
func (fd * FD ) ConnectEx (ra syscall.Sockaddr ) error {
1115
- o := & fd .wop
1116
- _ , err := fd .execIO (o , func (o * operation ) (uint32 , error ) {
1119
+ _ , err := fd .execIO ('w' , func (o * operation ) (uint32 , error ) {
1117
1120
return 0 , ConnectExFunc (fd .Sysfd , ra , nil , 0 , nil , & o .o )
1118
1121
})
1119
1122
return err
1120
1123
}
1121
1124
1122
- func (fd * FD ) acceptOne (s syscall.Handle , rawsa []syscall.RawSockaddrAny , o * operation ) (string , error ) {
1125
+ func (fd * FD ) acceptOne (s syscall.Handle , rawsa []syscall.RawSockaddrAny ) (string , error ) {
1123
1126
// Submit accept request.
1124
1127
rsan := uint32 (unsafe .Sizeof (rawsa [0 ]))
1125
- _ , err := fd .execIO (o , func (o * operation ) (qty uint32 , err error ) {
1128
+ _ , err := fd .execIO ('r' , func (o * operation ) (qty uint32 , err error ) {
1126
1129
err = AcceptFunc (fd .Sysfd , s , (* byte )(unsafe .Pointer (& rawsa [0 ])), 0 , rsan , rsan , & qty , & o .o )
1127
1130
return qty , err
1128
1131
@@ -1150,15 +1153,14 @@ func (fd *FD) Accept(sysSocket func() (syscall.Handle, error)) (syscall.Handle,
1150
1153
}
1151
1154
defer fd .readUnlock ()
1152
1155
1153
- o := & fd .rop
1154
1156
var rawsa [2 ]syscall.RawSockaddrAny
1155
1157
for {
1156
1158
s , err := sysSocket ()
1157
1159
if err != nil {
1158
1160
return syscall .InvalidHandle , nil , 0 , "" , err
1159
1161
}
1160
1162
1161
- errcall , err := fd .acceptOne (s , rawsa [:], o )
1163
+ errcall , err := fd .acceptOne (s , rawsa [:])
1162
1164
if err == nil {
1163
1165
return s , rawsa [:], uint32 (unsafe .Sizeof (rawsa [0 ])), "" , nil
1164
1166
}
@@ -1286,7 +1288,7 @@ func (fd *FD) RawRead(f func(uintptr) bool) error {
1286
1288
1287
1289
// Use a zero-byte read as a way to get notified when this
1288
1290
// socket is readable. h/t https://stackoverflow.com/a/42019668/332798
1289
- _ , err := fd .execIO (& fd . rop , func (o * operation ) (qty uint32 , err error ) {
1291
+ _ , err := fd .execIO ('r' , func (o * operation ) (qty uint32 , err error ) {
1290
1292
var flags uint32
1291
1293
if ! fd .IsStream {
1292
1294
flags |= windows .MSG_PEEK
@@ -1381,7 +1383,7 @@ func (fd *FD) ReadMsg(p []byte, oob []byte, flags int) (int, int, int, syscall.S
1381
1383
1382
1384
msg := newWSAMsg (p , oob , flags , true )
1383
1385
defer freeWSAMsg (msg )
1384
- n , err := fd .execIO (& fd . rop , func (o * operation ) (qty uint32 , err error ) {
1386
+ n , err := fd .execIO ('r' , func (o * operation ) (qty uint32 , err error ) {
1385
1387
err = windows .WSARecvMsg (fd .Sysfd , msg , & qty , & o .o , nil )
1386
1388
return qty , err
1387
1389
})
@@ -1406,7 +1408,7 @@ func (fd *FD) ReadMsgInet4(p []byte, oob []byte, flags int, sa4 *syscall.Sockadd
1406
1408
1407
1409
msg := newWSAMsg (p , oob , flags , true )
1408
1410
defer freeWSAMsg (msg )
1409
- n , err := fd .execIO (& fd . rop , func (o * operation ) (qty uint32 , err error ) {
1411
+ n , err := fd .execIO ('r' , func (o * operation ) (qty uint32 , err error ) {
1410
1412
err = windows .WSARecvMsg (fd .Sysfd , msg , & qty , & o .o , nil )
1411
1413
return qty , err
1412
1414
})
@@ -1430,7 +1432,7 @@ func (fd *FD) ReadMsgInet6(p []byte, oob []byte, flags int, sa6 *syscall.Sockadd
1430
1432
1431
1433
msg := newWSAMsg (p , oob , flags , true )
1432
1434
defer freeWSAMsg (msg )
1433
- n , err := fd .execIO (& fd . rop , func (o * operation ) (qty uint32 , err error ) {
1435
+ n , err := fd .execIO ('r' , func (o * operation ) (qty uint32 , err error ) {
1434
1436
err = windows .WSARecvMsg (fd .Sysfd , msg , & qty , & o .o , nil )
1435
1437
return qty , err
1436
1438
})
@@ -1461,7 +1463,7 @@ func (fd *FD) WriteMsg(p []byte, oob []byte, sa syscall.Sockaddr) (int, int, err
1461
1463
return 0 , 0 , err
1462
1464
}
1463
1465
}
1464
- n , err := fd .execIO (& fd . wop , func (o * operation ) (qty uint32 , err error ) {
1466
+ n , err := fd .execIO ('w' , func (o * operation ) (qty uint32 , err error ) {
1465
1467
err = windows .WSASendMsg (fd .Sysfd , msg , 0 , nil , & o .o , nil )
1466
1468
return qty , err
1467
1469
})
@@ -1484,7 +1486,7 @@ func (fd *FD) WriteMsgInet4(p []byte, oob []byte, sa *syscall.SockaddrInet4) (in
1484
1486
if sa != nil {
1485
1487
msg .Namelen = sockaddrInet4ToRaw (msg .Name , sa )
1486
1488
}
1487
- n , err := fd .execIO (& fd . wop , func (o * operation ) (qty uint32 , err error ) {
1489
+ n , err := fd .execIO ('w' , func (o * operation ) (qty uint32 , err error ) {
1488
1490
err = windows .WSASendMsg (fd .Sysfd , msg , 0 , nil , & o .o , nil )
1489
1491
return qty , err
1490
1492
})
@@ -1507,7 +1509,7 @@ func (fd *FD) WriteMsgInet6(p []byte, oob []byte, sa *syscall.SockaddrInet6) (in
1507
1509
if sa != nil {
1508
1510
msg .Namelen = sockaddrInet6ToRaw (msg .Name , sa )
1509
1511
}
1510
- n , err := fd .execIO (& fd . wop , func (o * operation ) (qty uint32 , err error ) {
1512
+ n , err := fd .execIO ('w' , func (o * operation ) (qty uint32 , err error ) {
1511
1513
err = windows .WSASendMsg (fd .Sysfd , msg , 0 , nil , & o .o , nil )
1512
1514
return qty , err
1513
1515
})
0 commit comments