From d8ff44ce4cd6f3ec0fab5fccda6bf14afcb25c30 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 27 Mar 2020 17:50:42 +0100 Subject: 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. --- Lib/threading.py | 10 +++++++++- .../next/Library/2020-03-27-17-22-34.bpo-40089.-lFsD0.rst | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-03-27-17-22-34.bpo-40089.-lFsD0.rst 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. -- cgit v0.12