Skip to content

Commit 15fbe34

Browse files
committed
internal/poll: simplify WriteMsg and ReadMsg on Windows
Let newWSAMsg retrieve the socket from the sync pool for unconnected sockets instead of forcing the caller to do it. Change-Id: I9b3d30bf3f5be187cbde5735d519b3b14f7b3008 Reviewed-on: https://go-review.googlesource.com/c/go/+/704116 Reviewed-by: Damien Neil <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Junyang Shao <[email protected]>
1 parent 16ae11a commit 15fbe34

File tree

2 files changed

+23
-40
lines changed

2 files changed

+23
-40
lines changed

src/internal/poll/fd_windows.go

Lines changed: 22 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ var wsaMsgPool = sync.Pool{
168168

169169
// newWSAMsg creates a new WSAMsg with the provided parameters.
170170
// Use [freeWSAMsg] to free it.
171-
func newWSAMsg(p []byte, oob []byte, flags int, rsa *syscall.RawSockaddrAny) *windows.WSAMsg {
171+
func newWSAMsg(p []byte, oob []byte, flags int, unconnected bool) *windows.WSAMsg {
172172
// The returned object can't be allocated in the stack because it is accessed asynchronously
173173
// by Windows in between several system calls. If the stack frame is moved while that happens,
174174
// then Windows may access invalid memory.
@@ -183,11 +183,9 @@ func newWSAMsg(p []byte, oob []byte, flags int, rsa *syscall.RawSockaddrAny) *wi
183183
Buf: unsafe.SliceData(oob),
184184
}
185185
msg.Flags = uint32(flags)
186-
msg.Name = syscall.Pointer(unsafe.Pointer(rsa))
187-
if rsa != nil {
188-
msg.Namelen = int32(unsafe.Sizeof(*rsa))
189-
} else {
190-
msg.Namelen = 0
186+
if unconnected {
187+
msg.Name = wsaRsaPool.Get().(*syscall.RawSockaddrAny)
188+
msg.Namelen = int32(unsafe.Sizeof(syscall.RawSockaddrAny{}))
191189
}
192190
return msg
193191
}
@@ -198,6 +196,12 @@ func freeWSAMsg(msg *windows.WSAMsg) {
198196
msg.Buffers.Buf = nil
199197
msg.Control.Len = 0
200198
msg.Control.Buf = nil
199+
if msg.Name != nil {
200+
*msg.Name = syscall.RawSockaddrAny{}
201+
wsaRsaPool.Put(msg.Name)
202+
msg.Name = nil
203+
msg.Namelen = 0
204+
}
201205
wsaMsgPool.Put(msg)
202206
}
203207

@@ -1355,9 +1359,7 @@ func (fd *FD) ReadMsg(p []byte, oob []byte, flags int) (int, int, int, syscall.S
13551359
p = p[:maxRW]
13561360
}
13571361

1358-
rsa := wsaRsaPool.Get().(*syscall.RawSockaddrAny)
1359-
defer wsaRsaPool.Put(rsa)
1360-
msg := newWSAMsg(p, oob, flags, rsa)
1362+
msg := newWSAMsg(p, oob, flags, true)
13611363
defer freeWSAMsg(msg)
13621364
n, err := fd.execIO(&fd.rop, func(o *operation) (qty uint32, err error) {
13631365
err = windows.WSARecvMsg(fd.Sysfd, msg, &qty, &o.o, nil)
@@ -1366,7 +1368,7 @@ func (fd *FD) ReadMsg(p []byte, oob []byte, flags int) (int, int, int, syscall.S
13661368
err = fd.eofError(n, err)
13671369
var sa syscall.Sockaddr
13681370
if err == nil {
1369-
sa, err = rsa.Sockaddr()
1371+
sa, err = msg.Name.Sockaddr()
13701372
}
13711373
return n, int(msg.Control.Len), int(msg.Flags), sa, err
13721374
}
@@ -1382,17 +1384,15 @@ func (fd *FD) ReadMsgInet4(p []byte, oob []byte, flags int, sa4 *syscall.Sockadd
13821384
p = p[:maxRW]
13831385
}
13841386

1385-
rsa := wsaRsaPool.Get().(*syscall.RawSockaddrAny)
1386-
defer wsaRsaPool.Put(rsa)
1387-
msg := newWSAMsg(p, oob, flags, rsa)
1387+
msg := newWSAMsg(p, oob, flags, true)
13881388
defer freeWSAMsg(msg)
13891389
n, err := fd.execIO(&fd.rop, func(o *operation) (qty uint32, err error) {
13901390
err = windows.WSARecvMsg(fd.Sysfd, msg, &qty, &o.o, nil)
13911391
return qty, err
13921392
})
13931393
err = fd.eofError(n, err)
13941394
if err == nil {
1395-
rawToSockaddrInet4(rsa, sa4)
1395+
rawToSockaddrInet4(msg.Name, sa4)
13961396
}
13971397
return n, int(msg.Control.Len), int(msg.Flags), err
13981398
}
@@ -1408,17 +1408,15 @@ func (fd *FD) ReadMsgInet6(p []byte, oob []byte, flags int, sa6 *syscall.Sockadd
14081408
p = p[:maxRW]
14091409
}
14101410

1411-
rsa := wsaRsaPool.Get().(*syscall.RawSockaddrAny)
1412-
defer wsaRsaPool.Put(rsa)
1413-
msg := newWSAMsg(p, oob, flags, rsa)
1411+
msg := newWSAMsg(p, oob, flags, true)
14141412
defer freeWSAMsg(msg)
14151413
n, err := fd.execIO(&fd.rop, func(o *operation) (qty uint32, err error) {
14161414
err = windows.WSARecvMsg(fd.Sysfd, msg, &qty, &o.o, nil)
14171415
return qty, err
14181416
})
14191417
err = fd.eofError(n, err)
14201418
if err == nil {
1421-
rawToSockaddrInet6(rsa, sa6)
1419+
rawToSockaddrInet6(msg.Name, sa6)
14221420
}
14231421
return n, int(msg.Control.Len), int(msg.Flags), err
14241422
}
@@ -1434,16 +1432,11 @@ func (fd *FD) WriteMsg(p []byte, oob []byte, sa syscall.Sockaddr) (int, int, err
14341432
}
14351433
defer fd.writeUnlock()
14361434

1437-
var rsa *syscall.RawSockaddrAny
1438-
if sa != nil {
1439-
rsa = wsaRsaPool.Get().(*syscall.RawSockaddrAny)
1440-
defer wsaRsaPool.Put(rsa)
1441-
}
1442-
msg := newWSAMsg(p, oob, 0, rsa)
1435+
msg := newWSAMsg(p, oob, 0, sa != nil)
14431436
defer freeWSAMsg(msg)
14441437
if sa != nil {
14451438
var err error
1446-
msg.Namelen, err = sockaddrToRaw(rsa, sa)
1439+
msg.Namelen, err = sockaddrToRaw(msg.Name, sa)
14471440
if err != nil {
14481441
return 0, 0, err
14491442
}
@@ -1466,15 +1459,10 @@ func (fd *FD) WriteMsgInet4(p []byte, oob []byte, sa *syscall.SockaddrInet4) (in
14661459
}
14671460
defer fd.writeUnlock()
14681461

1469-
var rsa *syscall.RawSockaddrAny
1470-
if sa != nil {
1471-
rsa = wsaRsaPool.Get().(*syscall.RawSockaddrAny)
1472-
defer wsaRsaPool.Put(rsa)
1473-
}
1474-
msg := newWSAMsg(p, oob, 0, rsa)
1462+
msg := newWSAMsg(p, oob, 0, sa != nil)
14751463
defer freeWSAMsg(msg)
14761464
if sa != nil {
1477-
msg.Namelen = sockaddrInet4ToRaw(rsa, sa)
1465+
msg.Namelen = sockaddrInet4ToRaw(msg.Name, sa)
14781466
}
14791467
n, err := fd.execIO(&fd.wop, func(o *operation) (qty uint32, err error) {
14801468
err = windows.WSASendMsg(fd.Sysfd, msg, 0, nil, &o.o, nil)
@@ -1494,15 +1482,10 @@ func (fd *FD) WriteMsgInet6(p []byte, oob []byte, sa *syscall.SockaddrInet6) (in
14941482
}
14951483
defer fd.writeUnlock()
14961484

1497-
var rsa *syscall.RawSockaddrAny
1498-
if sa != nil {
1499-
rsa = wsaRsaPool.Get().(*syscall.RawSockaddrAny)
1500-
defer wsaRsaPool.Put(rsa)
1501-
}
1502-
msg := newWSAMsg(p, oob, 0, rsa)
1485+
msg := newWSAMsg(p, oob, 0, sa != nil)
15031486
defer freeWSAMsg(msg)
15041487
if sa != nil {
1505-
msg.Namelen = sockaddrInet6ToRaw(rsa, sa)
1488+
msg.Namelen = sockaddrInet6ToRaw(msg.Name, sa)
15061489
}
15071490
n, err := fd.execIO(&fd.wop, func(o *operation) (qty uint32, err error) {
15081491
err = windows.WSASendMsg(fd.Sysfd, msg, 0, nil, &o.o, nil)

src/internal/syscall/windows/syscall_windows.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ var sendRecvMsgFunc struct {
261261
}
262262

263263
type WSAMsg struct {
264-
Name syscall.Pointer
264+
Name *syscall.RawSockaddrAny
265265
Namelen int32
266266
Buffers *syscall.WSABuf
267267
BufferCount uint32

0 commit comments

Comments
 (0)