From b3caf388a0418f6c031e4dbdcc0c1ce7e5cc36bd Mon Sep 17 00:00:00 2001 From: Alexey Izbyshev Date: Tue, 20 Feb 2018 10:25:46 +0300 Subject: [PATCH] closes bpo-32859: Don't retry dup3() if it is not available at runtime (GH-5708) os.dup2() tests for dup3() system call availability at runtime, but doesn't remember the result across calls, repeating the test on each call with inheritable=False. Since the caller of os.dup2() is expected to hold the GIL, fix this by making the variable holding the test result static. --- .../next/Library/2018-02-19-17-46-31.bpo-32859.kAT-Xp.rst | 2 ++ Modules/posixmodule.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2018-02-19-17-46-31.bpo-32859.kAT-Xp.rst diff --git a/Misc/NEWS.d/next/Library/2018-02-19-17-46-31.bpo-32859.kAT-Xp.rst b/Misc/NEWS.d/next/Library/2018-02-19-17-46-31.bpo-32859.kAT-Xp.rst new file mode 100644 index 00000000000000..755bdc11861010 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-02-19-17-46-31.bpo-32859.kAT-Xp.rst @@ -0,0 +1,2 @@ +In ``os.dup2``, don't check every call whether the ``dup3`` syscall exists +or not. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index d242df0b6f3106..0bbf7c57961f0e 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -8016,7 +8016,7 @@ os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable) #if defined(HAVE_DUP3) && \ !(defined(HAVE_FCNTL_H) && defined(F_DUP2FD_CLOEXEC)) /* dup3() is available on Linux 2.6.27+ and glibc 2.9 */ - int dup3_works = -1; + static int dup3_works = -1; #endif if (fd < 0 || fd2 < 0) {