From: Victor Stinner Date: Sun, 17 Apr 2016 14:51:52 +0000 (+0200) Subject: Avoid fcntl() if possible in set_inheritable() X-Git-Tag: v3.6.0a1~180 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a858bbde03638e3145894029dbc40d3d777be24f;p=python Avoid fcntl() if possible in set_inheritable() Issue #26770: set_inheritable() avoids calling fcntl() twice if the FD_CLOEXEC is already set/cleared. This change only impacts platforms using the fcntl() implementation of set_inheritable() (not Linux nor Windows). --- diff --git a/Python/fileutils.c b/Python/fileutils.c index a710c99129..4a0ef48f12 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -798,7 +798,7 @@ set_inheritable(int fd, int inheritable, int raise, int *atomic_flag_works) int request; int err; #endif - int flags; + int flags, new_flags; int res; #endif @@ -884,10 +884,18 @@ set_inheritable(int fd, int inheritable, int raise, int *atomic_flag_works) return -1; } - if (inheritable) - flags &= ~FD_CLOEXEC; - else - flags |= FD_CLOEXEC; + if (inheritable) { + new_flags = flags & ~FD_CLOEXEC; + } + else { + new_flags = flags | FD_CLOEXEC; + } + + if (new_flags == flags) { + /* FD_CLOEXEC flag already set/cleared: nothing to do */ + return 0; + } + res = fcntl(fd, F_SETFD, flags); if (res < 0) { if (raise)