From 6318e45bda6c37d5497f33a6039cdb65aa494c93 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Apr 2020 14:35:52 -0700 Subject: bpo-40089: Fix threading._after_fork() (GH-19191) (GH-19194) 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 +++++++++- .../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 2f6ac70..813dae2 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -1421,7 +1421,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