]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: avoid extra syscall on send/recvmsg on Linux
authorJason A. Donenfeld <Jason@zx2c4.com>
Thu, 19 Apr 2018 21:46:52 +0000 (23:46 +0200)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 19 Apr 2018 22:16:24 +0000 (22:16 +0000)
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: Id85cff17328ecbf6d09dd52fbeeaa691dbe69b75
Reviewed-on: https://go-review.googlesource.com/108338
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/syscall/syscall_linux.go

index 76afab0bfc61cc6c44cf15a57c06fdee72fddee2..2d2863690d1566c216b1a59c9d4d8452f6856d82 100644 (file)
@@ -541,15 +541,17 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from
        }
        var dummy byte
        if len(oob) > 0 {
-               var sockType int
-               sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
-               if err != nil {
-                       return
-               }
-               // receive at least one normal byte
-               if sockType != SOCK_DGRAM && len(p) == 0 {
-                       iov.Base = &dummy
-                       iov.SetLen(1)
+               if len(p) == 0 {
+                       var sockType int
+                       sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
+                       if err != nil {
+                               return
+                       }
+                       // receive at least one normal byte
+                       if sockType != SOCK_DGRAM {
+                               iov.Base = &dummy
+                               iov.SetLen(1)
+                       }
                }
                msg.Control = &oob[0]
                msg.SetControllen(len(oob))
@@ -593,15 +595,17 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error)
        }
        var dummy byte
        if len(oob) > 0 {
-               var sockType int
-               sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
-               if err != nil {
-                       return 0, err
-               }
-               // send at least one normal byte
-               if sockType != SOCK_DGRAM && len(p) == 0 {
-                       iov.Base = &dummy
-                       iov.SetLen(1)
+               if len(p) == 0 {
+                       var sockType int
+                       sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
+                       if err != nil {
+                               return 0, err
+                       }
+                       // send at least one normal byte
+                       if sockType != SOCK_DGRAM {
+                               iov.Base = &dummy
+                               iov.SetLen(1)
+                       }
                }
                msg.Control = &oob[0]
                msg.SetControllen(len(oob))