summaryrefslogtreecommitdiffstats
path: root/Modules/_multiprocessing/semaphore.c
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-04-04 18:09:38 (GMT)
committerGitHub <noreply@github.com>2024-04-04 18:09:38 (GMT)
commitde5ca0bf71760aad8f2b8449c89242498bff64c8 (patch)
treeb50ecf16ae524ab7e181215a18f5ec7ee8d021a1 /Modules/_multiprocessing/semaphore.c
parent04697bcfaf5dd34c9312f4f405083b6d33b3511f (diff)
downloadcpython-de5ca0bf71760aad8f2b8449c89242498bff64c8.zip
cpython-de5ca0bf71760aad8f2b8449c89242498bff64c8.tar.gz
cpython-de5ca0bf71760aad8f2b8449c89242498bff64c8.tar.bz2
gh-117435: Make `SemLock` thread-safe in free-threaded build (#117436)
Use critical sections to make acquire, release, and _count thread-safe without the GIL.
Diffstat (limited to 'Modules/_multiprocessing/semaphore.c')
-rw-r--r--Modules/_multiprocessing/semaphore.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/Modules/_multiprocessing/semaphore.c b/Modules/_multiprocessing/semaphore.c
index f8f2afd..5bb055f 100644
--- a/Modules/_multiprocessing/semaphore.c
+++ b/Modules/_multiprocessing/semaphore.c
@@ -81,6 +81,7 @@ _GetSemaphoreValue(HANDLE handle, long *value)
}
/*[clinic input]
+@critical_section
_multiprocessing.SemLock.acquire
block as blocking: bool = True
@@ -92,7 +93,7 @@ Acquire the semaphore/lock.
static PyObject *
_multiprocessing_SemLock_acquire_impl(SemLockObject *self, int blocking,
PyObject *timeout_obj)
-/*[clinic end generated code: output=f9998f0b6b0b0872 input=e5b45f5cbb775166]*/
+/*[clinic end generated code: output=f9998f0b6b0b0872 input=079ca779975f3ad6]*/
{
double timeout;
DWORD res, full_msecs, nhandles;
@@ -172,6 +173,7 @@ _multiprocessing_SemLock_acquire_impl(SemLockObject *self, int blocking,
}
/*[clinic input]
+@critical_section
_multiprocessing.SemLock.release
Release the semaphore/lock.
@@ -179,7 +181,7 @@ Release the semaphore/lock.
static PyObject *
_multiprocessing_SemLock_release_impl(SemLockObject *self)
-/*[clinic end generated code: output=b22f53ba96b0d1db input=ba7e63a961885d3d]*/
+/*[clinic end generated code: output=b22f53ba96b0d1db input=9bd62d3645e7a531]*/
{
if (self->kind == RECURSIVE_MUTEX) {
if (!ISMINE(self)) {
@@ -297,6 +299,7 @@ sem_timedwait_save(sem_t *sem, struct timespec *deadline, PyThreadState *_save)
#endif /* !HAVE_SEM_TIMEDWAIT */
/*[clinic input]
+@critical_section
_multiprocessing.SemLock.acquire
block as blocking: bool = True
@@ -308,7 +311,7 @@ Acquire the semaphore/lock.
static PyObject *
_multiprocessing_SemLock_acquire_impl(SemLockObject *self, int blocking,
PyObject *timeout_obj)
-/*[clinic end generated code: output=f9998f0b6b0b0872 input=e5b45f5cbb775166]*/
+/*[clinic end generated code: output=f9998f0b6b0b0872 input=079ca779975f3ad6]*/
{
int res, err = 0;
struct timespec deadline = {0};
@@ -382,6 +385,7 @@ _multiprocessing_SemLock_acquire_impl(SemLockObject *self, int blocking,
}
/*[clinic input]
+@critical_section
_multiprocessing.SemLock.release
Release the semaphore/lock.
@@ -389,7 +393,7 @@ Release the semaphore/lock.
static PyObject *
_multiprocessing_SemLock_release_impl(SemLockObject *self)
-/*[clinic end generated code: output=b22f53ba96b0d1db input=ba7e63a961885d3d]*/
+/*[clinic end generated code: output=b22f53ba96b0d1db input=9bd62d3645e7a531]*/
{
if (self->kind == RECURSIVE_MUTEX) {
if (!ISMINE(self)) {
@@ -583,6 +587,7 @@ semlock_dealloc(SemLockObject* self)
}
/*[clinic input]
+@critical_section
_multiprocessing.SemLock._count
Num of `acquire()`s minus num of `release()`s for this process.
@@ -590,7 +595,7 @@ Num of `acquire()`s minus num of `release()`s for this process.
static PyObject *
_multiprocessing_SemLock__count_impl(SemLockObject *self)
-/*[clinic end generated code: output=5ba8213900e517bb input=36fc59b1cd1025ab]*/
+/*[clinic end generated code: output=5ba8213900e517bb input=9fa6e0b321b16935]*/
{
return PyLong_FromLong((long)self->count);
}