Skip to content

Commit 4dc198d

Browse files
authored
bpo-45847: Fix _multiprocessing on platforms without sem_open (GH-29833)
1 parent 87d5180 commit 4dc198d

File tree

4 files changed

+84
-11
lines changed

4 files changed

+84
-11
lines changed

Modules/_multiprocessing/clinic/semaphore.c.h

Lines changed: 77 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
preserve
33
[clinic start generated code]*/
44

5-
#if defined(MS_WINDOWS)
5+
#if defined(HAVE_MP_SEMAPHORE) && defined(MS_WINDOWS)
66

77
PyDoc_STRVAR(_multiprocessing_SemLock_acquire__doc__,
88
"acquire($self, /, block=True, timeout=None)\n"
@@ -52,9 +52,9 @@ _multiprocessing_SemLock_acquire(SemLockObject *self, PyObject *const *args, Py_
5252
return return_value;
5353
}
5454

55-
#endif /* defined(MS_WINDOWS) */
55+
#endif /* defined(HAVE_MP_SEMAPHORE) && defined(MS_WINDOWS) */
5656

57-
#if defined(MS_WINDOWS)
57+
#if defined(HAVE_MP_SEMAPHORE) && defined(MS_WINDOWS)
5858

5959
PyDoc_STRVAR(_multiprocessing_SemLock_release__doc__,
6060
"release($self, /)\n"
@@ -74,9 +74,9 @@ _multiprocessing_SemLock_release(SemLockObject *self, PyObject *Py_UNUSED(ignore
7474
return _multiprocessing_SemLock_release_impl(self);
7575
}
7676

77-
#endif /* defined(MS_WINDOWS) */
77+
#endif /* defined(HAVE_MP_SEMAPHORE) && defined(MS_WINDOWS) */
7878

79-
#if !defined(MS_WINDOWS)
79+
#if defined(HAVE_MP_SEMAPHORE) && !defined(MS_WINDOWS)
8080

8181
PyDoc_STRVAR(_multiprocessing_SemLock_acquire__doc__,
8282
"acquire($self, /, block=True, timeout=None)\n"
@@ -126,9 +126,9 @@ _multiprocessing_SemLock_acquire(SemLockObject *self, PyObject *const *args, Py_
126126
return return_value;
127127
}
128128

129-
#endif /* !defined(MS_WINDOWS) */
129+
#endif /* defined(HAVE_MP_SEMAPHORE) && !defined(MS_WINDOWS) */
130130

131-
#if !defined(MS_WINDOWS)
131+
#if defined(HAVE_MP_SEMAPHORE) && !defined(MS_WINDOWS)
132132

133133
PyDoc_STRVAR(_multiprocessing_SemLock_release__doc__,
134134
"release($self, /)\n"
@@ -148,7 +148,9 @@ _multiprocessing_SemLock_release(SemLockObject *self, PyObject *Py_UNUSED(ignore
148148
return _multiprocessing_SemLock_release_impl(self);
149149
}
150150

151-
#endif /* !defined(MS_WINDOWS) */
151+
#endif /* defined(HAVE_MP_SEMAPHORE) && !defined(MS_WINDOWS) */
152+
153+
#if defined(HAVE_MP_SEMAPHORE)
152154

153155
static PyObject *
154156
_multiprocessing_SemLock_impl(PyTypeObject *type, int kind, int value,
@@ -208,6 +210,10 @@ _multiprocessing_SemLock(PyTypeObject *type, PyObject *args, PyObject *kwargs)
208210
return return_value;
209211
}
210212

213+
#endif /* defined(HAVE_MP_SEMAPHORE) */
214+
215+
#if defined(HAVE_MP_SEMAPHORE)
216+
211217
PyDoc_STRVAR(_multiprocessing_SemLock__rebuild__doc__,
212218
"_rebuild($type, handle, kind, maxvalue, name, /)\n"
213219
"--\n"
@@ -240,6 +246,10 @@ _multiprocessing_SemLock__rebuild(PyTypeObject *type, PyObject *const *args, Py_
240246
return return_value;
241247
}
242248

249+
#endif /* defined(HAVE_MP_SEMAPHORE) */
250+
251+
#if defined(HAVE_MP_SEMAPHORE)
252+
243253
PyDoc_STRVAR(_multiprocessing_SemLock__count__doc__,
244254
"_count($self, /)\n"
245255
"--\n"
@@ -258,6 +268,10 @@ _multiprocessing_SemLock__count(SemLockObject *self, PyObject *Py_UNUSED(ignored
258268
return _multiprocessing_SemLock__count_impl(self);
259269
}
260270

271+
#endif /* defined(HAVE_MP_SEMAPHORE) */
272+
273+
#if defined(HAVE_MP_SEMAPHORE)
274+
261275
PyDoc_STRVAR(_multiprocessing_SemLock__is_mine__doc__,
262276
"_is_mine($self, /)\n"
263277
"--\n"
@@ -276,6 +290,10 @@ _multiprocessing_SemLock__is_mine(SemLockObject *self, PyObject *Py_UNUSED(ignor
276290
return _multiprocessing_SemLock__is_mine_impl(self);
277291
}
278292

293+
#endif /* defined(HAVE_MP_SEMAPHORE) */
294+
295+
#if defined(HAVE_MP_SEMAPHORE)
296+
279297
PyDoc_STRVAR(_multiprocessing_SemLock__get_value__doc__,
280298
"_get_value($self, /)\n"
281299
"--\n"
@@ -294,6 +312,10 @@ _multiprocessing_SemLock__get_value(SemLockObject *self, PyObject *Py_UNUSED(ign
294312
return _multiprocessing_SemLock__get_value_impl(self);
295313
}
296314

315+
#endif /* defined(HAVE_MP_SEMAPHORE) */
316+
317+
#if defined(HAVE_MP_SEMAPHORE)
318+
297319
PyDoc_STRVAR(_multiprocessing_SemLock__is_zero__doc__,
298320
"_is_zero($self, /)\n"
299321
"--\n"
@@ -312,6 +334,10 @@ _multiprocessing_SemLock__is_zero(SemLockObject *self, PyObject *Py_UNUSED(ignor
312334
return _multiprocessing_SemLock__is_zero_impl(self);
313335
}
314336

337+
#endif /* defined(HAVE_MP_SEMAPHORE) */
338+
339+
#if defined(HAVE_MP_SEMAPHORE)
340+
315341
PyDoc_STRVAR(_multiprocessing_SemLock__after_fork__doc__,
316342
"_after_fork($self, /)\n"
317343
"--\n"
@@ -330,6 +356,10 @@ _multiprocessing_SemLock__after_fork(SemLockObject *self, PyObject *Py_UNUSED(ig
330356
return _multiprocessing_SemLock__after_fork_impl(self);
331357
}
332358

359+
#endif /* defined(HAVE_MP_SEMAPHORE) */
360+
361+
#if defined(HAVE_MP_SEMAPHORE)
362+
333363
PyDoc_STRVAR(_multiprocessing_SemLock___enter____doc__,
334364
"__enter__($self, /)\n"
335365
"--\n"
@@ -348,6 +378,10 @@ _multiprocessing_SemLock___enter__(SemLockObject *self, PyObject *Py_UNUSED(igno
348378
return _multiprocessing_SemLock___enter___impl(self);
349379
}
350380

381+
#endif /* defined(HAVE_MP_SEMAPHORE) */
382+
383+
#if defined(HAVE_MP_SEMAPHORE)
384+
351385
PyDoc_STRVAR(_multiprocessing_SemLock___exit____doc__,
352386
"__exit__($self, exc_type=None, exc_value=None, exc_tb=None, /)\n"
353387
"--\n"
@@ -392,11 +426,45 @@ _multiprocessing_SemLock___exit__(SemLockObject *self, PyObject *const *args, Py
392426
return return_value;
393427
}
394428

429+
#endif /* defined(HAVE_MP_SEMAPHORE) */
430+
395431
#ifndef _MULTIPROCESSING_SEMLOCK_ACQUIRE_METHODDEF
396432
#define _MULTIPROCESSING_SEMLOCK_ACQUIRE_METHODDEF
397433
#endif /* !defined(_MULTIPROCESSING_SEMLOCK_ACQUIRE_METHODDEF) */
398434

399435
#ifndef _MULTIPROCESSING_SEMLOCK_RELEASE_METHODDEF
400436
#define _MULTIPROCESSING_SEMLOCK_RELEASE_METHODDEF
401437
#endif /* !defined(_MULTIPROCESSING_SEMLOCK_RELEASE_METHODDEF) */
402-
/*[clinic end generated code: output=e7fd938150601fe5 input=a9049054013a1b77]*/
438+
439+
#ifndef _MULTIPROCESSING_SEMLOCK__REBUILD_METHODDEF
440+
#define _MULTIPROCESSING_SEMLOCK__REBUILD_METHODDEF
441+
#endif /* !defined(_MULTIPROCESSING_SEMLOCK__REBUILD_METHODDEF) */
442+
443+
#ifndef _MULTIPROCESSING_SEMLOCK__COUNT_METHODDEF
444+
#define _MULTIPROCESSING_SEMLOCK__COUNT_METHODDEF
445+
#endif /* !defined(_MULTIPROCESSING_SEMLOCK__COUNT_METHODDEF) */
446+
447+
#ifndef _MULTIPROCESSING_SEMLOCK__IS_MINE_METHODDEF
448+
#define _MULTIPROCESSING_SEMLOCK__IS_MINE_METHODDEF
449+
#endif /* !defined(_MULTIPROCESSING_SEMLOCK__IS_MINE_METHODDEF) */
450+
451+
#ifndef _MULTIPROCESSING_SEMLOCK__GET_VALUE_METHODDEF
452+
#define _MULTIPROCESSING_SEMLOCK__GET_VALUE_METHODDEF
453+
#endif /* !defined(_MULTIPROCESSING_SEMLOCK__GET_VALUE_METHODDEF) */
454+
455+
#ifndef _MULTIPROCESSING_SEMLOCK__IS_ZERO_METHODDEF
456+
#define _MULTIPROCESSING_SEMLOCK__IS_ZERO_METHODDEF
457+
#endif /* !defined(_MULTIPROCESSING_SEMLOCK__IS_ZERO_METHODDEF) */
458+
459+
#ifndef _MULTIPROCESSING_SEMLOCK__AFTER_FORK_METHODDEF
460+
#define _MULTIPROCESSING_SEMLOCK__AFTER_FORK_METHODDEF
461+
#endif /* !defined(_MULTIPROCESSING_SEMLOCK__AFTER_FORK_METHODDEF) */
462+
463+
#ifndef _MULTIPROCESSING_SEMLOCK___ENTER___METHODDEF
464+
#define _MULTIPROCESSING_SEMLOCK___ENTER___METHODDEF
465+
#endif /* !defined(_MULTIPROCESSING_SEMLOCK___ENTER___METHODDEF) */
466+
467+
#ifndef _MULTIPROCESSING_SEMLOCK___EXIT___METHODDEF
468+
#define _MULTIPROCESSING_SEMLOCK___EXIT___METHODDEF
469+
#endif /* !defined(_MULTIPROCESSING_SEMLOCK___EXIT___METHODDEF) */
470+
/*[clinic end generated code: output=fde05a081b5bdba4 input=a9049054013a1b77]*/

Modules/_multiprocessing/multiprocessing.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,7 @@ static PyMethodDef module_methods[] = {
186186
static int
187187
multiprocessing_exec(PyObject *module)
188188
{
189-
#if defined(MS_WINDOWS) || \
190-
(defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED))
189+
#ifdef HAVE_MP_SEMAPHORE
191190

192191
/* Add _PyMp_SemLock type to module */
193192
if (PyModule_AddType(module, &_PyMp_SemLockType) < 0) {

Modules/_multiprocessing/multiprocessing.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@
2121
# endif
2222
# define SEM_HANDLE HANDLE
2323
# define SEM_VALUE_MAX LONG_MAX
24+
# define HAVE_MP_SEMAPHORE
2425
#else
2526
# include <fcntl.h> /* O_CREAT and O_EXCL */
2627
# if defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED)
28+
# define HAVE_MP_SEMAPHORE
2729
# include <semaphore.h>
2830
typedef sem_t *SEM_HANDLE;
2931
# endif

Modules/_multiprocessing/semaphore.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
#include "multiprocessing.h"
1111

12+
#ifdef HAVE_MP_SEMAPHORE
13+
1214
enum { RECURSIVE_MUTEX, SEMAPHORE };
1315

1416
typedef struct {
@@ -794,3 +796,5 @@ _PyMp_sem_unlink(const char *name)
794796

795797
Py_RETURN_NONE;
796798
}
799+
800+
#endif // HAVE_MP_SEMAPHORE

0 commit comments

Comments
 (0)