diff options
author | Victor Stinner <vstinner@python.org> | 2020-03-27 16:50:42 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-27 16:50:42 (GMT) |
commit | d8ff44ce4cd6f3ec0fab5fccda6bf14afcb25c30 (patch) | |
tree | 009d56fe2dac5c1e920771297c9a08eb38d16ef8 | |
parent | 5a58c5280b8df4ca5d6a19892b24fff96e9ea868 (diff) | |
download | cpython-d8ff44ce4cd6f3ec0fab5fccda6bf14afcb25c30.zip cpython-d8ff44ce4cd6f3ec0fab5fccda6bf14afcb25c30.tar.gz cpython-d8ff44ce4cd6f3ec0fab5fccda6bf14afcb25c30.tar.bz2 |
bpo-40089: Fix threading._after_fork() (GH-19191)
If fork was not called by a thread spawned by threading.Thread,
threading._after_fork() now creates a _MainThread instance for
_main_thread, instead of a _DummyThread instance.
-rw-r--r-- | Lib/threading.py | 10 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2020-03-27-17-22-34.bpo-40089.-lFsD0.rst | 3 |
2 files changed, 12 insertions, 1 deletions
diff --git a/Lib/threading.py b/Lib/threading.py index 5932367..46eb1b9 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -1423,7 +1423,15 @@ def _after_fork(): # fork() only copied the current thread; clear references to others. new_active = {} - current = current_thread() + + try: + current = _active[get_ident()] + except KeyError: + # fork() was called in a thread which was not spawned + # by threading.Thread. For example, a thread spawned + # by thread.start_new_thread(). + current = _MainThread() + _main_thread = current # reset _shutdown() locks: threads re-register their _tstate_lock below diff --git a/Misc/NEWS.d/next/Library/2020-03-27-17-22-34.bpo-40089.-lFsD0.rst b/Misc/NEWS.d/next/Library/2020-03-27-17-22-34.bpo-40089.-lFsD0.rst new file mode 100644 index 0000000..f5335a3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-03-27-17-22-34.bpo-40089.-lFsD0.rst @@ -0,0 +1,3 @@ +Fix threading._after_fork(): if fork was not called by a thread spawned by +threading.Thread, threading._after_fork() now creates a _MainThread instance +for _main_thread, instead of a _DummyThread instance. |