From cdd1eea7b2c81c144d00e7cc43218b90930a9442 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Fri, 27 Dec 2024 11:28:36 +0000 Subject: [PATCH 1/9] make flags thread safe --- .../internal/pycore_pyatomic_ft_wrappers.h | 6 ++ Modules/socketmodule.c | 81 +++++++++---------- 2 files changed, 46 insertions(+), 41 deletions(-) diff --git a/Include/internal/pycore_pyatomic_ft_wrappers.h b/Include/internal/pycore_pyatomic_ft_wrappers.h index d755d03a5fa190..1b62b201c5a374 100644 --- a/Include/internal/pycore_pyatomic_ft_wrappers.h +++ b/Include/internal/pycore_pyatomic_ft_wrappers.h @@ -109,6 +109,10 @@ extern "C" { _Py_atomic_store_ullong_relaxed(&value, new_value) #define FT_ATOMIC_LOAD_ULLONG_RELAXED(value) \ _Py_atomic_load_ullong_relaxed(&value) +#define FT_ATOMIC_STORE_INT64_RELAXED(value, new_value) \ + _Py_atomic_store_int64_relaxed(&value, new_value) +#define FT_ATOMIC_LOAD_INT64_RELAXED(value) \ + _Py_atomic_load_int64_relaxed(&value) #else #define FT_ATOMIC_LOAD_PTR(value) value @@ -156,6 +160,8 @@ extern "C" { #define FT_ATOMIC_STORE_LLONG_RELAXED(value, new_value) value = new_value #define FT_ATOMIC_LOAD_ULLONG_RELAXED(value) value #define FT_ATOMIC_STORE_ULLONG_RELAXED(value, new_value) value = new_value +#define FT_ATOMIC_LOAD_INT64_RELAXED(value) value +#define FT_ATOMIC_STORE_INT64_RELAXED(value, new_value) value = new_value #endif diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 1e95be9b1bc9f4..78044a1eaeacf8 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -108,6 +108,7 @@ Local naming conventions: #include "Python.h" #include "pycore_capsule.h" // _PyCapsule_SetTraverse() #include "pycore_fileutils.h" // _Py_set_inheritable() +#include "pycore_pyatomic_ft_wrappers.h" #include "pycore_moduleobject.h" // _PyModule_GetState #include "pycore_time.h" // _PyTime_AsMilliseconds() @@ -546,23 +547,33 @@ typedef struct _socket_state { by this module (but not argument type or memory errors, etc.). */ PyObject *socket_herror; PyObject *socket_gaierror; +} socket_state; + +/* Default timeout for new sockets */ +static PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1); - /* Default timeout for new sockets */ - PyTime_t defaulttimeout; +#define SET_DEFAULT_TIMEOUT(timeout) FT_ATOMIC_STORE_INT64_RELAXED(defaulttimeout, timeout) +#define GET_DEFAULT_TIMEOUT() FT_ATOMIC_LOAD_INT64_RELAXED(defaulttimeout) #if defined(HAVE_ACCEPT) || defined(HAVE_ACCEPT4) #if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) - /* accept4() is available on Linux 2.6.28+ and glibc 2.10 */ - int accept4_works; +/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */ +static int accept4_works = -1; + +#define SET_ACCEPT4_WORKS(value) FT_ATOMIC_STORE_INT_RELAXED(accept4_works, value) +#define GET_ACCEPT4_WORKS() FT_ATOMIC_LOAD_INT_RELAXED(accept4_works) + #endif #endif #ifdef SOCK_CLOEXEC - /* socket() and socketpair() fail with EINVAL on Linux kernel older - * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */ - int sock_cloexec_works; +/* socket() and socketpair() fail with EINVAL on Linux kernel older + * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */ +static int sock_cloexec_works = -1; + +#define SET_SOCK_CLOEXEC_WORKS(value) FT_ATOMIC_STORE_INT_RELAXED(sock_cloexec_works, value) +#define GET_SOCK_CLOEXEC_WORKS() FT_ATOMIC_LOAD_INT_RELAXED(sock_cloexec_works) #endif -} socket_state; static inline socket_state * get_module_state(PyObject *mod) @@ -1057,7 +1068,7 @@ init_sockobject(socket_state *state, PySocketSockObject *s, else #endif { - s->sock_timeout = _Py_atomic_load_int64_relaxed(&state->defaulttimeout); + s->sock_timeout = GET_DEFAULT_TIMEOUT(); if (s->sock_timeout >= 0) { if (internal_setblocking(s, 0) == -1) { return -1; @@ -2867,16 +2878,15 @@ sock_accept_impl(PySocketSockObject *s, void *data) #endif #if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) - socket_state *state = s->state; - if (state->accept4_works != 0) { + if (GET_ACCEPT4_WORKS() != 0) { ctx->result = accept4(s->sock_fd, addr, paddrlen, SOCK_CLOEXEC); - if (ctx->result == INVALID_SOCKET && state->accept4_works == -1) { + if (ctx->result == INVALID_SOCKET && GET_ACCEPT4_WORKS() == -1) { /* On Linux older than 2.6.28, accept4() fails with ENOSYS */ - state->accept4_works = (errno != ENOSYS); + SET_ACCEPT4_WORKS(errno != ENOSYS); } } - if (state->accept4_works == 0) + if (GET_ACCEPT4_WORKS() == 0) ctx->result = accept(s->sock_fd, addr, paddrlen); #else ctx->result = accept(s->sock_fd, addr, paddrlen); @@ -2929,8 +2939,7 @@ sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored)) #else #if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) - socket_state *state = s->state; - if (!state->accept4_works) + if (!GET_ACCEPT4_WORKS()) #endif { if (_Py_set_inheritable(newfd, 0, NULL) < 0) { @@ -5391,7 +5400,8 @@ sock_initobj_impl(PySocketSockObject *self, int family, int type, int proto, #ifndef MS_WINDOWS #ifdef SOCK_CLOEXEC - int *atomic_flag_works = &state->sock_cloexec_works; + int cloexec_works = GET_SOCK_CLOEXEC_WORKS(); + int *atomic_flag_works = &cloexec_works; #else int *atomic_flag_works = NULL; #endif @@ -5546,15 +5556,16 @@ sock_initobj_impl(PySocketSockObject *self, int family, int type, int proto, /* UNIX */ Py_BEGIN_ALLOW_THREADS #ifdef SOCK_CLOEXEC - if (state->sock_cloexec_works != 0) { + if (GET_SOCK_CLOEXEC_WORKS() != 0) { fd = socket(family, type | SOCK_CLOEXEC, proto); - if (state->sock_cloexec_works == -1) { + if (GET_SOCK_CLOEXEC_WORKS() == -1) { if (fd >= 0) { - state->sock_cloexec_works = 1; + SET_SOCK_CLOEXEC_WORKS(1); } + else if (errno == EINVAL) { /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */ - state->sock_cloexec_works = 0; + SET_SOCK_CLOEXEC_WORKS(0); fd = socket(family, type, proto); } } @@ -6295,7 +6306,8 @@ socket_socketpair(PyObject *self, PyObject *args) PyObject *res = NULL; socket_state *state = get_module_state(self); #ifdef SOCK_CLOEXEC - int *atomic_flag_works = &state->sock_cloexec_works; + int cloexec_works = GET_SOCK_CLOEXEC_WORKS(); + int *atomic_flag_works = &cloexec_works; #else int *atomic_flag_works = NULL; #endif @@ -6313,15 +6325,15 @@ socket_socketpair(PyObject *self, PyObject *args) /* Create a pair of socket fds */ Py_BEGIN_ALLOW_THREADS #ifdef SOCK_CLOEXEC - if (state->sock_cloexec_works != 0) { + if (GET_SOCK_CLOEXEC_WORKS() != 0) { ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv); - if (state->sock_cloexec_works == -1) { + if (GET_SOCK_CLOEXEC_WORKS() == -1) { if (ret >= 0) { - state->sock_cloexec_works = 1; + SET_SOCK_CLOEXEC_WORKS(1); } else if (errno == EINVAL) { /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */ - state->sock_cloexec_works = 0; + SET_SOCK_CLOEXEC_WORKS(0); ret = socketpair(family, type, proto, sv); } } @@ -6957,8 +6969,7 @@ Get host and port for a sockaddr."); static PyObject * socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored)) { - socket_state *state = get_module_state(self); - PyTime_t timeout = _Py_atomic_load_int64_relaxed(&state->defaulttimeout); + PyTime_t timeout = GET_DEFAULT_TIMEOUT(); if (timeout < 0) { Py_RETURN_NONE; } @@ -6983,8 +6994,7 @@ socket_setdefaulttimeout(PyObject *self, PyObject *arg) if (socket_parse_timeout(&timeout, arg) < 0) return NULL; - socket_state *state = get_module_state(self); - _Py_atomic_store_int64_relaxed(&state->defaulttimeout, timeout); + SET_DEFAULT_TIMEOUT(timeout); Py_RETURN_NONE; } @@ -7429,17 +7439,6 @@ socket_exec(PyObject *m) } socket_state *state = get_module_state(m); - state->defaulttimeout = _PYTIME_FROMSECONDS(-1); - -#if defined(HAVE_ACCEPT) || defined(HAVE_ACCEPT4) -#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) - state->accept4_works = -1; -#endif -#endif - -#ifdef SOCK_CLOEXEC - state->sock_cloexec_works = -1; -#endif #define ADD_EXC(MOD, NAME, VAR, BASE) do { \ VAR = PyErr_NewException("socket." NAME, BASE, NULL); \ From 8c1d1b435a8d6cb4ce3f5aeaa1621bc3b3a4e586 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Fri, 27 Dec 2024 11:45:56 +0000 Subject: [PATCH 2/9] fix globals-to-fix.tsv --- Tools/c-analyzer/cpython/globals-to-fix.tsv | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Tools/c-analyzer/cpython/globals-to-fix.tsv b/Tools/c-analyzer/cpython/globals-to-fix.tsv index a1ec1927eb56df..a6df6ff8d83d9d 100644 --- a/Tools/c-analyzer/cpython/globals-to-fix.tsv +++ b/Tools/c-analyzer/cpython/globals-to-fix.tsv @@ -443,4 +443,10 @@ Modules/readline.c - sigwinch_ohandler - Modules/readline.c - completed_input_string - Modules/rotatingtree.c - random_stream - Modules/rotatingtree.c - random_value - -Modules/rotatingtree.c - random_mutex - +Modules/rotatingtree.c - random_mutex - + +##----------------------- +## static thread safe globals +Modules/socketmodule.c - defaulttimeout - +Modules/socketmodule.c - accept4_works - +Modules/socketmodule.c - sock_cloexec_works - From 680961957ab816b2cde1018a010e5afe00aa4333 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Sat, 28 Dec 2024 07:25:32 +0000 Subject: [PATCH 3/9] try --- Tools/c-analyzer/cpython/globals-to-fix.tsv | 3 --- 1 file changed, 3 deletions(-) diff --git a/Tools/c-analyzer/cpython/globals-to-fix.tsv b/Tools/c-analyzer/cpython/globals-to-fix.tsv index a6df6ff8d83d9d..a312e438a7ed2d 100644 --- a/Tools/c-analyzer/cpython/globals-to-fix.tsv +++ b/Tools/c-analyzer/cpython/globals-to-fix.tsv @@ -444,9 +444,6 @@ Modules/readline.c - completed_input_string - Modules/rotatingtree.c - random_stream - Modules/rotatingtree.c - random_value - Modules/rotatingtree.c - random_mutex - - -##----------------------- -## static thread safe globals Modules/socketmodule.c - defaulttimeout - Modules/socketmodule.c - accept4_works - Modules/socketmodule.c - sock_cloexec_works - From f33020278fe881920ad58c2675b1cf9f9996a103 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Sat, 28 Dec 2024 07:31:56 +0000 Subject: [PATCH 4/9] fix c analyzer --- Tools/c-analyzer/cpython/globals-to-fix.tsv | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Tools/c-analyzer/cpython/globals-to-fix.tsv b/Tools/c-analyzer/cpython/globals-to-fix.tsv index a312e438a7ed2d..5f6062458a540d 100644 --- a/Tools/c-analyzer/cpython/globals-to-fix.tsv +++ b/Tools/c-analyzer/cpython/globals-to-fix.tsv @@ -443,7 +443,7 @@ Modules/readline.c - sigwinch_ohandler - Modules/readline.c - completed_input_string - Modules/rotatingtree.c - random_stream - Modules/rotatingtree.c - random_value - -Modules/rotatingtree.c - random_mutex - -Modules/socketmodule.c - defaulttimeout - -Modules/socketmodule.c - accept4_works - -Modules/socketmodule.c - sock_cloexec_works - +Modules/rotatingtree.c - random_mutex - +Modules/socketmodule.c - defaulttimeout - +Modules/socketmodule.c - accept4_works - +Modules/socketmodule.c - sock_cloexec_works - From 2463bbde345ab3b41138bdf9da2320f5577b7a84 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Sat, 28 Dec 2024 07:44:03 +0000 Subject: [PATCH 5/9] fmt --- Modules/socketmodule.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 78044a1eaeacf8..8c527a7fdcd1c9 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -108,9 +108,9 @@ Local naming conventions: #include "Python.h" #include "pycore_capsule.h" // _PyCapsule_SetTraverse() #include "pycore_fileutils.h" // _Py_set_inheritable() -#include "pycore_pyatomic_ft_wrappers.h" #include "pycore_moduleobject.h" // _PyModule_GetState #include "pycore_time.h" // _PyTime_AsMilliseconds() +#include "pycore_pyatomic_ft_wrappers.h" #ifdef _Py_MEMORY_SANITIZER # include @@ -573,6 +573,7 @@ static int sock_cloexec_works = -1; #define SET_SOCK_CLOEXEC_WORKS(value) FT_ATOMIC_STORE_INT_RELAXED(sock_cloexec_works, value) #define GET_SOCK_CLOEXEC_WORKS() FT_ATOMIC_LOAD_INT_RELAXED(sock_cloexec_works) + #endif static inline socket_state * From ef6f4576570d2d9aeb2f4a516af85c65693bbdab Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Sat, 28 Dec 2024 07:56:27 +0000 Subject: [PATCH 6/9] fix fileutils --- Modules/socketmodule.c | 6 ++---- Python/fileutils.c | 6 +++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 8c527a7fdcd1c9..af452a885291a7 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -5401,8 +5401,7 @@ sock_initobj_impl(PySocketSockObject *self, int family, int type, int proto, #ifndef MS_WINDOWS #ifdef SOCK_CLOEXEC - int cloexec_works = GET_SOCK_CLOEXEC_WORKS(); - int *atomic_flag_works = &cloexec_works; + int *atomic_flag_works = &sock_cloexec_works; #else int *atomic_flag_works = NULL; #endif @@ -6307,8 +6306,7 @@ socket_socketpair(PyObject *self, PyObject *args) PyObject *res = NULL; socket_state *state = get_module_state(self); #ifdef SOCK_CLOEXEC - int cloexec_works = GET_SOCK_CLOEXEC_WORKS(); - int *atomic_flag_works = &cloexec_works; + int *atomic_flag_works = &sock_cloexec_works; #else int *atomic_flag_works = NULL; #endif diff --git a/Python/fileutils.c b/Python/fileutils.c index 9529b14d377c60..81276651f6df44 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1468,14 +1468,14 @@ set_inheritable(int fd, int inheritable, int raise, int *atomic_flag_works) assert(!(atomic_flag_works != NULL && inheritable)); if (atomic_flag_works != NULL && !inheritable) { - if (*atomic_flag_works == -1) { + if (_Py_atomic_load_int_relaxed(atomic_flag_works) == -1) { int isInheritable = get_inheritable(fd, raise); if (isInheritable == -1) return -1; - *atomic_flag_works = !isInheritable; + _Py_atomic_store_int_relaxed(atomic_flag_works, !isInheritable); } - if (*atomic_flag_works) + if (_Py_atomic_load_int_relaxed(atomic_flag_works)) return 0; } From 9c543764a29c3c41e36024314348844ca2ba3267 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Tue, 31 Dec 2024 09:14:27 +0000 Subject: [PATCH 7/9] remove macros --- Modules/socketmodule.c | 54 ++++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index af452a885291a7..f72d1aa72b5d1b 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -110,7 +110,6 @@ Local naming conventions: #include "pycore_fileutils.h" // _Py_set_inheritable() #include "pycore_moduleobject.h" // _PyModule_GetState #include "pycore_time.h" // _PyTime_AsMilliseconds() -#include "pycore_pyatomic_ft_wrappers.h" #ifdef _Py_MEMORY_SANITIZER # include @@ -547,22 +546,15 @@ typedef struct _socket_state { by this module (but not argument type or memory errors, etc.). */ PyObject *socket_herror; PyObject *socket_gaierror; -} socket_state; - -/* Default timeout for new sockets */ -static PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1); -#define SET_DEFAULT_TIMEOUT(timeout) FT_ATOMIC_STORE_INT64_RELAXED(defaulttimeout, timeout) -#define GET_DEFAULT_TIMEOUT() FT_ATOMIC_LOAD_INT64_RELAXED(defaulttimeout) + /* Default timeout for new sockets */ + PyTime_t defaulttimeout; +} socket_state; #if defined(HAVE_ACCEPT) || defined(HAVE_ACCEPT4) #if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) /* accept4() is available on Linux 2.6.28+ and glibc 2.10 */ static int accept4_works = -1; - -#define SET_ACCEPT4_WORKS(value) FT_ATOMIC_STORE_INT_RELAXED(accept4_works, value) -#define GET_ACCEPT4_WORKS() FT_ATOMIC_LOAD_INT_RELAXED(accept4_works) - #endif #endif @@ -570,10 +562,6 @@ static int accept4_works = -1; /* socket() and socketpair() fail with EINVAL on Linux kernel older * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */ static int sock_cloexec_works = -1; - -#define SET_SOCK_CLOEXEC_WORKS(value) FT_ATOMIC_STORE_INT_RELAXED(sock_cloexec_works, value) -#define GET_SOCK_CLOEXEC_WORKS() FT_ATOMIC_LOAD_INT_RELAXED(sock_cloexec_works) - #endif static inline socket_state * @@ -1069,7 +1057,7 @@ init_sockobject(socket_state *state, PySocketSockObject *s, else #endif { - s->sock_timeout = GET_DEFAULT_TIMEOUT(); + s->sock_timeout = _Py_atomic_load_int64_relaxed(&state->defaulttimeout); if (s->sock_timeout >= 0) { if (internal_setblocking(s, 0) == -1) { return -1; @@ -2879,15 +2867,15 @@ sock_accept_impl(PySocketSockObject *s, void *data) #endif #if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) - if (GET_ACCEPT4_WORKS() != 0) { + if (_Py_atomic_load_int_relaxed(&accept4_works) != 0) { ctx->result = accept4(s->sock_fd, addr, paddrlen, SOCK_CLOEXEC); - if (ctx->result == INVALID_SOCKET && GET_ACCEPT4_WORKS() == -1) { + if (ctx->result == INVALID_SOCKET && _Py_atomic_load_int_relaxed(&accept4_works) == -1) { /* On Linux older than 2.6.28, accept4() fails with ENOSYS */ - SET_ACCEPT4_WORKS(errno != ENOSYS); + _Py_atomic_store_int_relaxed(&accept4_works, errno != ENOSYS); } } - if (GET_ACCEPT4_WORKS() == 0) + if (_Py_atomic_load_int_relaxed(&accept4_works) == 0) ctx->result = accept(s->sock_fd, addr, paddrlen); #else ctx->result = accept(s->sock_fd, addr, paddrlen); @@ -2940,7 +2928,7 @@ sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored)) #else #if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) - if (!GET_ACCEPT4_WORKS()) + if (!_Py_atomic_load_int_relaxed(&accept4_works)) #endif { if (_Py_set_inheritable(newfd, 0, NULL) < 0) { @@ -5556,16 +5544,16 @@ sock_initobj_impl(PySocketSockObject *self, int family, int type, int proto, /* UNIX */ Py_BEGIN_ALLOW_THREADS #ifdef SOCK_CLOEXEC - if (GET_SOCK_CLOEXEC_WORKS() != 0) { + if (_Py_atomic_load_int_relaxed(&sock_cloexec_works) != 0) { fd = socket(family, type | SOCK_CLOEXEC, proto); - if (GET_SOCK_CLOEXEC_WORKS() == -1) { + if (_Py_atomic_load_int_relaxed(&sock_cloexec_works) == -1) { if (fd >= 0) { - SET_SOCK_CLOEXEC_WORKS(1); + _Py_atomic_store_int_relaxed(&sock_cloexec_works, 1); } else if (errno == EINVAL) { /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */ - SET_SOCK_CLOEXEC_WORKS(0); + _Py_atomic_store_int_relaxed(&sock_cloexec_works, 0); fd = socket(family, type, proto); } } @@ -6324,15 +6312,15 @@ socket_socketpair(PyObject *self, PyObject *args) /* Create a pair of socket fds */ Py_BEGIN_ALLOW_THREADS #ifdef SOCK_CLOEXEC - if (GET_SOCK_CLOEXEC_WORKS() != 0) { + if (_Py_atomic_load_int_relaxed(&sock_cloexec_works) != 0) { ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv); - if (GET_SOCK_CLOEXEC_WORKS() == -1) { + if (_Py_atomic_load_int_relaxed(&sock_cloexec_works) == -1) { if (ret >= 0) { - SET_SOCK_CLOEXEC_WORKS(1); + _Py_atomic_store_int_relaxed(&sock_cloexec_works, 1); } else if (errno == EINVAL) { /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */ - SET_SOCK_CLOEXEC_WORKS(0); + _Py_atomic_store_int_relaxed(&sock_cloexec_works, 0); ret = socketpair(family, type, proto, sv); } } @@ -6968,7 +6956,8 @@ Get host and port for a sockaddr."); static PyObject * socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored)) { - PyTime_t timeout = GET_DEFAULT_TIMEOUT(); + socket_state *state = get_module_state(self); + PyTime_t timeout = _Py_atomic_load_int64_relaxed(&state->defaulttimeout); if (timeout < 0) { Py_RETURN_NONE; } @@ -6993,7 +6982,8 @@ socket_setdefaulttimeout(PyObject *self, PyObject *arg) if (socket_parse_timeout(&timeout, arg) < 0) return NULL; - SET_DEFAULT_TIMEOUT(timeout); + socket_state *state = get_module_state(self); + _Py_atomic_store_int64_relaxed(&state->defaulttimeout, timeout); Py_RETURN_NONE; } @@ -7439,6 +7429,8 @@ socket_exec(PyObject *m) socket_state *state = get_module_state(m); + _Py_atomic_store_int64_relaxed(&state->defaulttimeout, _PYTIME_FROMSECONDS(-1)); + #define ADD_EXC(MOD, NAME, VAR, BASE) do { \ VAR = PyErr_NewException("socket." NAME, BASE, NULL); \ if (VAR == NULL) { \ From 0b5b22f7cb704ba83e7284fadc192549c757957f Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Tue, 31 Dec 2024 09:15:12 +0000 Subject: [PATCH 8/9] remove ft_ macros --- Include/internal/pycore_pyatomic_ft_wrappers.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Include/internal/pycore_pyatomic_ft_wrappers.h b/Include/internal/pycore_pyatomic_ft_wrappers.h index 1b62b201c5a374..d755d03a5fa190 100644 --- a/Include/internal/pycore_pyatomic_ft_wrappers.h +++ b/Include/internal/pycore_pyatomic_ft_wrappers.h @@ -109,10 +109,6 @@ extern "C" { _Py_atomic_store_ullong_relaxed(&value, new_value) #define FT_ATOMIC_LOAD_ULLONG_RELAXED(value) \ _Py_atomic_load_ullong_relaxed(&value) -#define FT_ATOMIC_STORE_INT64_RELAXED(value, new_value) \ - _Py_atomic_store_int64_relaxed(&value, new_value) -#define FT_ATOMIC_LOAD_INT64_RELAXED(value) \ - _Py_atomic_load_int64_relaxed(&value) #else #define FT_ATOMIC_LOAD_PTR(value) value @@ -160,8 +156,6 @@ extern "C" { #define FT_ATOMIC_STORE_LLONG_RELAXED(value, new_value) value = new_value #define FT_ATOMIC_LOAD_ULLONG_RELAXED(value) value #define FT_ATOMIC_STORE_ULLONG_RELAXED(value, new_value) value = new_value -#define FT_ATOMIC_LOAD_INT64_RELAXED(value) value -#define FT_ATOMIC_STORE_INT64_RELAXED(value, new_value) value = new_value #endif From 12eeb63b39e3a6f2e195041e2e72c391614825cf Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Tue, 31 Dec 2024 09:15:37 +0000 Subject: [PATCH 9/9] fix globals to fix --- Tools/c-analyzer/cpython/globals-to-fix.tsv | 1 - 1 file changed, 1 deletion(-) diff --git a/Tools/c-analyzer/cpython/globals-to-fix.tsv b/Tools/c-analyzer/cpython/globals-to-fix.tsv index 5f6062458a540d..a74779803228c2 100644 --- a/Tools/c-analyzer/cpython/globals-to-fix.tsv +++ b/Tools/c-analyzer/cpython/globals-to-fix.tsv @@ -444,6 +444,5 @@ Modules/readline.c - completed_input_string - Modules/rotatingtree.c - random_stream - Modules/rotatingtree.c - random_value - Modules/rotatingtree.c - random_mutex - -Modules/socketmodule.c - defaulttimeout - Modules/socketmodule.c - accept4_works - Modules/socketmodule.c - sock_cloexec_works -