]> Cypherpunks repositories - gostls13.git/commitdiff
net: enable fast socket creation with close-on-exec flag on freebsd
authorMikio Hara <mikioh.mikioh@gmail.com>
Tue, 4 Mar 2014 00:28:09 +0000 (09:28 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Tue, 4 Mar 2014 00:28:09 +0000 (09:28 +0900)
Also makes variable names explicit.

Fixes #7186.

LGTM=iant
R=golang-codereviews, gobot, iant, bradfitz
CC=golang-codereviews
https://golang.org/cl/69100043

src/pkg/net/sock_cloexec.go
src/pkg/net/sys_cloexec.go

index 3f22cd8f570480c26c8b85d8af932e8b5d30e1ea..18ff64388c526d9b1d33326bab48db3ff59ab5c8 100644 (file)
@@ -5,7 +5,7 @@
 // This file implements sysSocket and accept for platforms that
 // provide a fast path for setting SetNonblock and CloseOnExec.
 
-// +build linux
+// +build freebsd linux
 
 package net
 
@@ -13,18 +13,20 @@ import "syscall"
 
 // Wrapper around the socket system call that marks the returned file
 // descriptor as nonblocking and close-on-exec.
-func sysSocket(f, t, p int) (int, error) {
-       s, err := syscall.Socket(f, t|syscall.SOCK_NONBLOCK|syscall.SOCK_CLOEXEC, p)
-       // The SOCK_NONBLOCK and SOCK_CLOEXEC flags were introduced in
-       // Linux 2.6.27.  If we get an EINVAL error, fall back to
-       // using socket without them.
-       if err == nil || err != syscall.EINVAL {
+func sysSocket(family, sotype, proto int) (int, error) {
+       s, err := syscall.Socket(family, sotype|syscall.SOCK_NONBLOCK|syscall.SOCK_CLOEXEC, proto)
+       // On Linux the SOCK_NONBLOCK and SOCK_CLOEXEC flags were
+       // introduced in 2.6.27 kernel and on FreeBSD both flags were
+       // introduced in 10 kernel. If we get an EINVAL error on Linux
+       // or EPROTONOSUPPORT error on FreeBSD, fall back to using
+       // socket without them.
+       if err == nil || (err != syscall.EPROTONOSUPPORT && err != syscall.EINVAL) {
                return s, err
        }
 
        // See ../syscall/exec_unix.go for description of ForkLock.
        syscall.ForkLock.RLock()
-       s, err = syscall.Socket(f, t, p)
+       s, err = syscall.Socket(family, sotype, proto)
        if err == nil {
                syscall.CloseOnExec(s)
        }
@@ -41,12 +43,14 @@ func sysSocket(f, t, p int) (int, error) {
 
 // Wrapper around the accept system call that marks the returned file
 // descriptor as nonblocking and close-on-exec.
-func accept(fd int) (int, syscall.Sockaddr, error) {
-       nfd, sa, err := syscall.Accept4(fd, syscall.SOCK_NONBLOCK|syscall.SOCK_CLOEXEC)
-       // The accept4 system call was introduced in Linux 2.6.28.  If
-       // we get an ENOSYS or EINVAL error, fall back to using accept.
+func accept(s int) (int, syscall.Sockaddr, error) {
+       ns, sa, err := syscall.Accept4(s, syscall.SOCK_NONBLOCK|syscall.SOCK_CLOEXEC)
+       // On Linux the accept4 system call was introduced in 2.6.28
+       // kernel and on FreeBSD it was introduced in 10 kernel. If we
+       // get an ENOSYS error on both Linux and FreeBSD, or EINVAL
+       // error on Linux, fall back to using accept.
        if err == nil || (err != syscall.ENOSYS && err != syscall.EINVAL) {
-               return nfd, sa, err
+               return ns, sa, err
        }
 
        // See ../syscall/exec_unix.go for description of ForkLock.
@@ -54,16 +58,16 @@ func accept(fd int) (int, syscall.Sockaddr, error) {
        // because we have put fd.sysfd into non-blocking mode.
        // However, a call to the File method will put it back into
        // blocking mode. We can't take that risk, so no use of ForkLock here.
-       nfd, sa, err = syscall.Accept(fd)
+       ns, sa, err = syscall.Accept(s)
        if err == nil {
-               syscall.CloseOnExec(nfd)
+               syscall.CloseOnExec(ns)
        }
        if err != nil {
                return -1, nil, err
        }
-       if err = syscall.SetNonblock(nfd, true); err != nil {
-               syscall.Close(nfd)
+       if err = syscall.SetNonblock(ns, true); err != nil {
+               syscall.Close(ns)
                return -1, nil, err
        }
-       return nfd, sa, nil
+       return ns, sa, nil
 }
index 19ba0fc00ccca91c128d8c6ee67138094fc1fa8d..898fb7c0c2c5545bfca54a423253a00a56a2c6b2 100644 (file)
@@ -5,7 +5,7 @@
 // This file implements sysSocket and accept for platforms that do not
 // provide a fast path for setting SetNonblock and CloseOnExec.
 
-// +build darwin dragonfly freebsd nacl netbsd openbsd solaris
+// +build darwin dragonfly nacl netbsd openbsd solaris
 
 package net
 
@@ -13,10 +13,10 @@ import "syscall"
 
 // Wrapper around the socket system call that marks the returned file
 // descriptor as nonblocking and close-on-exec.
-func sysSocket(f, t, p int) (int, error) {
+func sysSocket(family, sotype, proto int) (int, error) {
        // See ../syscall/exec_unix.go for description of ForkLock.
        syscall.ForkLock.RLock()
-       s, err := syscall.Socket(f, t, p)
+       s, err := syscall.Socket(family, sotype, proto)
        if err == nil {
                syscall.CloseOnExec(s)
        }
@@ -33,22 +33,22 @@ func sysSocket(f, t, p int) (int, error) {
 
 // Wrapper around the accept system call that marks the returned file
 // descriptor as nonblocking and close-on-exec.
-func accept(fd int) (int, syscall.Sockaddr, error) {
+func accept(s int) (int, syscall.Sockaddr, error) {
        // See ../syscall/exec_unix.go for description of ForkLock.
        // It is probably okay to hold the lock across syscall.Accept
        // because we have put fd.sysfd into non-blocking mode.
        // However, a call to the File method will put it back into
        // blocking mode. We can't take that risk, so no use of ForkLock here.
-       nfd, sa, err := syscall.Accept(fd)
+       ns, sa, err := syscall.Accept(s)
        if err == nil {
-               syscall.CloseOnExec(nfd)
+               syscall.CloseOnExec(ns)
        }
        if err != nil {
                return -1, nil, err
        }
-       if err = syscall.SetNonblock(nfd, true); err != nil {
-               syscall.Close(nfd)
+       if err = syscall.SetNonblock(ns, true); err != nil {
+               syscall.Close(ns)
                return -1, nil, err
        }
-       return nfd, sa, nil
+       return ns, sa, nil
 }