From 8d58051ac6ea3032cf673f3ba75d79ff8b8457a1 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 27 Mar 2020 17:50:42 +0100 Subject: [PATCH] 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. (cherry picked from commit d8ff44ce4cd6f3ec0fab5fccda6bf14afcb25c30) Co-authored-by: Victor Stinner --- Lib/threading.py | 10 +++++++++- .../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 b597336a150677..b961456fb792a2 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -1340,7 +1340,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 00000000000000..f5335a33c066ca --- /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.