optimize SOCK_CLOEXEC fallback for socket function
authorRich Felker <dalias@aerifal.cx>
Fri, 6 Jun 2014 19:30:28 +0000 (15:30 -0400)
committerRich Felker <dalias@aerifal.cx>
Fri, 6 Jun 2014 19:30:28 +0000 (15:30 -0400)
the fcntl function is heavy, so make the syscall directly instead.
also, avoid the code size and runtime overhead of querying the old
flags, since it's reasonable to assume nothing will be set on a
newly-created socket. this code is only used on old kernels which lack
proper atomic close-on-exec support, so future changes that might
invalidate such an assumption do not need to be considered.

src/network/socket.c

index 51be30eed72887d47e489a970ce7cd8e71c73ca6..a2e92d908265651a02e8e7bf544ea2dcd2e7ea82 100644 (file)
@@ -13,9 +13,9 @@ int socket(int domain, int type, int protocol)
                        protocol, 0, 0, 0);
                if (s < 0) return s;
                if (type & SOCK_CLOEXEC)
-                       fcntl(s, F_SETFD, FD_CLOEXEC);
+                       __syscall(SYS_fcntl, s, F_SETFD, FD_CLOEXEC);
                if (type & SOCK_NONBLOCK)
-                       fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK);
+                       __syscall(SYS_fcntl, s, F_SETFL, O_NONBLOCK);
        }
        return s;
 }