diff options
author | albanD <desmaison.alban@gmail.com> | 2023-08-30 17:07:41 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-30 17:07:41 (GMT) |
commit | add8d45cbe46581b9748909fbbf60fdc8ee8f71e (patch) | |
tree | eeaffda1c22e7c99be3c23a22d04d6e2866ebd5f /Lib/multiprocessing | |
parent | 2a3926fa51b7264787d5988abf083d8c4328f4ad (diff) | |
download | cpython-add8d45cbe46581b9748909fbbf60fdc8ee8f71e.zip cpython-add8d45cbe46581b9748909fbbf60fdc8ee8f71e.tar.gz cpython-add8d45cbe46581b9748909fbbf60fdc8ee8f71e.tar.bz2 |
gh-108520: Fix bad fork detection in nested multiprocessing use case (#108568)
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.
---------
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.py | 8 |
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(): |