# HG changeset patch # User Joerg Sonnenberger # Date 2020-12-28 00:05:09 # Node ID a42502e9ae6d1273b293b3367c91200c38ba2f82 # Parent d159d0fafa78eee8c7f6ac8a3693e9baa548ee4f worker: POSIX only supports workers from main thread (issue6460) The POSIX backend sets signal handlers for SIGINT (maybe avoidable) and SIGCHLD (necessary for waitpid). Python up to 3.9 only allow this from the main thread, so disable the worker feature otherwise. Differential Revision: https://phab.mercurial-scm.org/D9660 diff --git a/mercurial/worker.py b/mercurial/worker.py --- a/mercurial/worker.py +++ b/mercurial/worker.py @@ -67,6 +67,9 @@ def _numworkers(ui): if pycompat.ispy3: + def ismainthread(): + return threading.current_thread() == threading.main_thread() + class _blockingreader(object): def __init__(self, wrapped): self._wrapped = wrapped @@ -100,6 +103,9 @@ if pycompat.ispy3: else: + def ismainthread(): + return isinstance(threading.current_thread(), threading._MainThread) + def _blockingreader(wrapped): return wrapped @@ -155,6 +161,11 @@ def worker( release the GIL. """ enabled = ui.configbool(b'worker', b'enabled') + if enabled and _platformworker is _posixworker and not ismainthread(): + # The POSIX worker has to install a handler for SIGCHLD. + # Python up to 3.9 only allows this in the main thread. + enabled = False + if enabled and worthwhile(ui, costperarg, len(args), threadsafe=threadsafe): return _platformworker(ui, func, staticargs, args, hasretval) return func(*staticargs + (args,))