From: akr@... Date: 2014-01-18T22:53:01+00:00 Subject: [ruby-core:59857] [ruby-trunk - Feature #9330] [PATCH 0/3] avoid redundant fcntl/fstat syscalls for cloexec sockets Issue #9330 has been updated by Akira Tanaka. The patch 1/3 and 3/3 are also have difficulty with rb_update_max_fd. For example, rsock_socket0 returns fd without calling rb_update_max_fd. This style makes us difficult to confirm that rb_update_max_fd is called for all fd allocation. ---------------------------------------- Feature #9330: [PATCH 0/3] avoid redundant fcntl/fstat syscalls for cloexec sockets https://bugs.ruby-lang.org/issues/9330#change-44423 * Author: Eric Wong * Status: Open * Priority: Low * Assignee: * Category: ext * Target version: next minor ---------------------------------------- commit 52525b673669019dc3c03474e613937fd3587187 Author: Eric Wong <e@80x24.org> Date: Tue Dec 31 02:09:27 2013 +0000 socket: avoid redundant fcntl calls for FD passing If MSG_CMSG_CLOEXEC works on the first recvmsg syscall, we should assume it always works and avoid checking it with every single FD received. While we're at it, it is pointless to set FD_CLOEXEC immediately before we close it in discard_cmsg; so only update the max FD (the FD is likely to be recycled, so we should update even if we close it). Note: I think it's safe to assume any system with MSG_CMSG_CLOEXEC will have implemented SOCK_CLOEXEC; too, so we reuse use rsock_detect_cloexec instead of defining a new function wrapped by #ifdef MSG_CMSG_CLOEXEC. commit aa9ed17a5f10cf53f72dc5ab1f4ff8d8b5e4dd84 Author: Eric Wong <e@80x24.org> Date: Tue Dec 31 01:36:27 2013 +0000 socket: avoid redundant calls to rb_update_max_fd rsock_init_sock already calls rb_update_max_fd, so do not waste time making redundant fstat() and atomic CAS instructions. commit b1694d7bac55bd9f537426624fe599c46b10dee6 Author: Eric Wong <e@80x24.org> Date: Mon Dec 30 23:58:32 2013 +0000 socket: avoid redundant fcntl(fd, F_GETFD) with SOCK_CLOEXEC If socket or socketpair succeeds with SOCK_CLOEXEC once, we should expect it to succeed for all subsequent invocations of each of those syscalls. This reduces the number of syscalls made and makes strace output cleaner. While we're at it, swap some remaining rb_fd_fix_cloexec calls for rb_maygvl_fd_fix_cloexec, as the former calls rb_update_max_fd redundantly. A future commit will reduce rb_update_max_fd calls further. The following changes since commit d6c7ab9ffeff31fb5a49776ab74a61b478344107: * 2013-12-31 (2013-12-30 19:48:05 +0000) are available in the git repository at: git://bogomips.org/ruby.git socket_cloexec_once for you to fetch changes up to 52525b673669019dc3c03474e613937fd3587187: socket: avoid redundant fcntl calls for FD passing (2013-12-31 02:17:53 +0000) ---------------------------------------------------------------- Eric Wong (3): socket: avoid redundant fcntl(fd, F_GETFD) with SOCK_CLOEXEC socket: avoid redundant calls to rb_update_max_fd socket: avoid redundant fcntl calls for FD passing ext/socket/ancdata.c | 9 +++++++-- ext/socket/init.c | 49 ++++++++++++++++++++++++++++++++++++++----------- ext/socket/rubysocket.h | 2 ++ ext/socket/socket.c | 31 ++++++++++++++++++++++--------- ext/socket/unixsocket.c | 10 ++++++++-- 5 files changed, 77 insertions(+), 24 deletions(-) ---Files-------------------------------- 0001-socket-avoid-redundant-fcntl-fd-F_GETFD-with-SOCK_CL.patch (5.87 KB) 0002-socket-avoid-redundant-calls-to-rb_update_max_fd.patch (1.35 KB) 0003-socket-avoid-redundant-fcntl-calls-for-FD-passing.patch (3.27 KB) -- http://bugs.ruby-lang.org/