summaryrefslogtreecommitdiffstats
path: root/Lib/multiprocessing
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2023-08-30 20:36:26 (GMT)
committerGitHub <noreply@github.com>2023-08-30 20:36:26 (GMT)
commit385b1952f0817fd302ecebb8644f21b4e04a1462 (patch)
tree4d314f559702994f0bed85d65550465bc1f6342e /Lib/multiprocessing
parent6f24420cbf1fe31d212497fea024965b36987307 (diff)
downloadcpython-385b1952f0817fd302ecebb8644f21b4e04a1462.zip
cpython-385b1952f0817fd302ecebb8644f21b4e04a1462.tar.gz
cpython-385b1952f0817fd302ecebb8644f21b4e04a1462.tar.bz2
[3.11] gh-108520: Fix bad fork detection in nested multiprocessing use case (GH-108568) (#108692)
gh-107275 introduced a regression where a SemLock would fail being passed along nested child processes, as the `is_fork_ctx` attribute would be left missing after the first deserialization. --------- (cherry picked from commit add8d45cbe46581b9748909fbbf60fdc8ee8f71e) Co-authored-by: albanD <desmaison.alban@gmail.com> Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: Antoine Pitrou <pitrou@free.fr>
Diffstat (limited to 'Lib/multiprocessing')
-rw-r--r--Lib/multiprocessing/synchronize.py8
1 files changed, 5 insertions, 3 deletions
diff --git a/Lib/multiprocessing/synchronize.py b/Lib/multiprocessing/synchronize.py
index 2328d33..3ccbfe3 100644
--- a/Lib/multiprocessing/synchronize.py
+++ b/Lib/multiprocessing/synchronize.py
@@ -50,8 +50,8 @@ class SemLock(object):
def __init__(self, kind, value, maxvalue, *, ctx):
if ctx is None:
ctx = context._default_context.get_context()
- self.is_fork_ctx = ctx.get_start_method() == 'fork'
- unlink_now = sys.platform == 'win32' or self.is_fork_ctx
+ self._is_fork_ctx = ctx.get_start_method() == 'fork'
+ unlink_now = sys.platform == 'win32' or self._is_fork_ctx
for i in range(100):
try:
sl = self._semlock = _multiprocessing.SemLock(
@@ -103,7 +103,7 @@ class SemLock(object):
if sys.platform == 'win32':
h = context.get_spawning_popen().duplicate_for_child(sl.handle)
else:
- if self.is_fork_ctx:
+ if self._is_fork_ctx:
raise RuntimeError('A SemLock created in a fork context is being '
'shared with a process in a spawn context. This is '
'not supported. Please use the same context to create '
@@ -115,6 +115,8 @@ class SemLock(object):
self._semlock = _multiprocessing.SemLock._rebuild(*state)
util.debug('recreated blocker with handle %r' % state[0])
self._make_methods()
+ # Ensure that deserialized SemLock can be serialized again (gh-108520).
+ self._is_fork_ctx = False
@staticmethod
def _make_name():