summaryrefslogtreecommitdiffstats
path: root/Modules/clinic
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-07-11 14:21:09 (GMT)
committerGitHub <noreply@github.com>2024-07-11 14:21:09 (GMT)
commit44937d11a6a045a624918db78aa36e715ffabcd4 (patch)
treed071b71be090d80846445617923e276b78f5da46 /Modules/clinic
parente6264b44dc7221c713b14dfa0f5929b33d362829 (diff)
downloadcpython-44937d11a6a045a624918db78aa36e715ffabcd4.zip
cpython-44937d11a6a045a624918db78aa36e715ffabcd4.tar.gz
cpython-44937d11a6a045a624918db78aa36e715ffabcd4.tar.bz2
gh-121592: Make select.poll() and related objects thread-safe (#121594)
This makes select.poll() and kqueue() objects thread-safe in the free-threaded build. Note that calling close() concurrently with other functions is still not thread-safe due to races on file descriptors (gh-121544).
Diffstat (limited to 'Modules/clinic')
-rw-r--r--Modules/clinic/selectmodule.c.h51
1 files changed, 46 insertions, 5 deletions
diff --git a/Modules/clinic/selectmodule.c.h b/Modules/clinic/selectmodule.c.h
index dc7d3fb..0ccbf63 100644
--- a/Modules/clinic/selectmodule.c.h
+++ b/Modules/clinic/selectmodule.c.h
@@ -6,6 +6,7 @@ preserve
# include "pycore_gc.h" // PyGC_Head
# include "pycore_runtime.h" // _Py_ID()
#endif
+#include "pycore_critical_section.h"// Py_BEGIN_CRITICAL_SECTION()
#include "pycore_long.h" // _PyLong_UnsignedShort_Converter()
#include "pycore_modsupport.h" // _PyArg_CheckPositional()
@@ -110,7 +111,9 @@ select_poll_register(pollObject *self, PyObject *const *args, Py_ssize_t nargs)
goto exit;
}
skip_optional:
+ Py_BEGIN_CRITICAL_SECTION(self);
return_value = select_poll_register_impl(self, fd, eventmask);
+ Py_END_CRITICAL_SECTION();
exit:
return return_value;
@@ -155,7 +158,9 @@ select_poll_modify(pollObject *self, PyObject *const *args, Py_ssize_t nargs)
if (!_PyLong_UnsignedShort_Converter(args[1], &eventmask)) {
goto exit;
}
+ Py_BEGIN_CRITICAL_SECTION(self);
return_value = select_poll_modify_impl(self, fd, eventmask);
+ Py_END_CRITICAL_SECTION();
exit:
return return_value;
@@ -187,7 +192,9 @@ select_poll_unregister(pollObject *self, PyObject *arg)
if (fd < 0) {
goto exit;
}
+ Py_BEGIN_CRITICAL_SECTION(self);
return_value = select_poll_unregister_impl(self, fd);
+ Py_END_CRITICAL_SECTION();
exit:
return return_value;
@@ -230,7 +237,9 @@ select_poll_poll(pollObject *self, PyObject *const *args, Py_ssize_t nargs)
}
timeout_obj = args[0];
skip_optional:
+ Py_BEGIN_CRITICAL_SECTION(self);
return_value = select_poll_poll_impl(self, timeout_obj);
+ Py_END_CRITICAL_SECTION();
exit:
return return_value;
@@ -281,7 +290,9 @@ select_devpoll_register(devpollObject *self, PyObject *const *args, Py_ssize_t n
goto exit;
}
skip_optional:
+ Py_BEGIN_CRITICAL_SECTION(self);
return_value = select_devpoll_register_impl(self, fd, eventmask);
+ Py_END_CRITICAL_SECTION();
exit:
return return_value;
@@ -332,7 +343,9 @@ select_devpoll_modify(devpollObject *self, PyObject *const *args, Py_ssize_t nar
goto exit;
}
skip_optional:
+ Py_BEGIN_CRITICAL_SECTION(self);
return_value = select_devpoll_modify_impl(self, fd, eventmask);
+ Py_END_CRITICAL_SECTION();
exit:
return return_value;
@@ -364,7 +377,9 @@ select_devpoll_unregister(devpollObject *self, PyObject *arg)
if (fd < 0) {
goto exit;
}
+ Py_BEGIN_CRITICAL_SECTION(self);
return_value = select_devpoll_unregister_impl(self, fd);
+ Py_END_CRITICAL_SECTION();
exit:
return return_value;
@@ -407,7 +422,9 @@ select_devpoll_poll(devpollObject *self, PyObject *const *args, Py_ssize_t nargs
}
timeout_obj = args[0];
skip_optional:
+ Py_BEGIN_CRITICAL_SECTION(self);
return_value = select_devpoll_poll_impl(self, timeout_obj);
+ Py_END_CRITICAL_SECTION();
exit:
return return_value;
@@ -434,7 +451,13 @@ select_devpoll_close_impl(devpollObject *self);
static PyObject *
select_devpoll_close(devpollObject *self, PyObject *Py_UNUSED(ignored))
{
- return select_devpoll_close_impl(self);
+ PyObject *return_value = NULL;
+
+ Py_BEGIN_CRITICAL_SECTION(self);
+ return_value = select_devpoll_close_impl(self);
+ Py_END_CRITICAL_SECTION();
+
+ return return_value;
}
#endif /* (defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL)) && defined(HAVE_SYS_DEVPOLL_H) */
@@ -456,7 +479,13 @@ select_devpoll_fileno_impl(devpollObject *self);
static PyObject *
select_devpoll_fileno(devpollObject *self, PyObject *Py_UNUSED(ignored))
{
- return select_devpoll_fileno_impl(self);
+ PyObject *return_value = NULL;
+
+ Py_BEGIN_CRITICAL_SECTION(self);
+ return_value = select_devpoll_fileno_impl(self);
+ Py_END_CRITICAL_SECTION();
+
+ return return_value;
}
#endif /* (defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL)) && defined(HAVE_SYS_DEVPOLL_H) */
@@ -615,7 +644,13 @@ select_epoll_close_impl(pyEpoll_Object *self);
static PyObject *
select_epoll_close(pyEpoll_Object *self, PyObject *Py_UNUSED(ignored))
{
- return select_epoll_close_impl(self);
+ PyObject *return_value = NULL;
+
+ Py_BEGIN_CRITICAL_SECTION(self);
+ return_value = select_epoll_close_impl(self);
+ Py_END_CRITICAL_SECTION();
+
+ return return_value;
}
#endif /* defined(HAVE_EPOLL) */
@@ -1108,7 +1143,13 @@ select_kqueue_close_impl(kqueue_queue_Object *self);
static PyObject *
select_kqueue_close(kqueue_queue_Object *self, PyObject *Py_UNUSED(ignored))
{
- return select_kqueue_close_impl(self);
+ PyObject *return_value = NULL;
+
+ Py_BEGIN_CRITICAL_SECTION(self);
+ return_value = select_kqueue_close_impl(self);
+ Py_END_CRITICAL_SECTION();
+
+ return return_value;
}
#endif /* defined(HAVE_KQUEUE) */
@@ -1319,4 +1360,4 @@ exit:
#ifndef SELECT_KQUEUE_CONTROL_METHODDEF
#define SELECT_KQUEUE_CONTROL_METHODDEF
#endif /* !defined(SELECT_KQUEUE_CONTROL_METHODDEF) */
-/*[clinic end generated code: output=4fc17ae9b6cfdc86 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=f31e724f492225b1 input=a9049054013a1b77]*/