mirror of
https://github.com/rwinkhart/sys.git
synced 2026-09-01 14:47:28 -04:00
unix: avoid extra syscall on send/recvmsg on Linux
By simply rearranging the logic, we avoid the overhead of a superfluous call to getsockopt. For, if p is already non empty, there's no point in having to check if we need to attach dummy payload. This has performance benefits when using send/recvmsg for high speed communications. Change-Id: If47ab5322464aad8e6d2603a369e95327223211f Reviewed-on: https://go-review.googlesource.com/108337 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
committed by
Brad Fitzpatrick
parent
3ccc7e5779
commit
a2a45943ae
+22
-18
@@ -944,15 +944,17 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from
|
|||||||
}
|
}
|
||||||
var dummy byte
|
var dummy byte
|
||||||
if len(oob) > 0 {
|
if len(oob) > 0 {
|
||||||
var sockType int
|
if len(p) == 0 {
|
||||||
sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
|
var sockType int
|
||||||
if err != nil {
|
sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
|
||||||
return
|
if err != nil {
|
||||||
}
|
return
|
||||||
// receive at least one normal byte
|
}
|
||||||
if sockType != SOCK_DGRAM && len(p) == 0 {
|
// receive at least one normal byte
|
||||||
iov.Base = &dummy
|
if sockType != SOCK_DGRAM {
|
||||||
iov.SetLen(1)
|
iov.Base = &dummy
|
||||||
|
iov.SetLen(1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
msg.Control = &oob[0]
|
msg.Control = &oob[0]
|
||||||
msg.SetControllen(len(oob))
|
msg.SetControllen(len(oob))
|
||||||
@@ -996,15 +998,17 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error)
|
|||||||
}
|
}
|
||||||
var dummy byte
|
var dummy byte
|
||||||
if len(oob) > 0 {
|
if len(oob) > 0 {
|
||||||
var sockType int
|
if len(p) == 0 {
|
||||||
sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
|
var sockType int
|
||||||
if err != nil {
|
sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
|
||||||
return 0, err
|
if err != nil {
|
||||||
}
|
return 0, err
|
||||||
// send at least one normal byte
|
}
|
||||||
if sockType != SOCK_DGRAM && len(p) == 0 {
|
// send at least one normal byte
|
||||||
iov.Base = &dummy
|
if sockType != SOCK_DGRAM {
|
||||||
iov.SetLen(1)
|
iov.Base = &dummy
|
||||||
|
iov.SetLen(1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
msg.Control = &oob[0]
|
msg.Control = &oob[0]
|
||||||
msg.SetControllen(len(oob))
|
msg.SetControllen(len(oob))
|
||||||
|
|||||||
Reference in New Issue
Block a user