From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Apr 2020 21:36:07 +0000 (-0700) Subject: bpo-40089: Fix threading._after_fork() (GH-19191) (GH-19193) X-Git-Tag: v3.7.8rc1~102 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a514ccb3ea6f01fef850d9465b82a1670d5ace44;p=thirdparty%2FPython%2Fcpython.git bpo-40089: Fix threading._after_fork() (GH-19191) (GH-19193) 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 --- diff --git a/Lib/threading.py b/Lib/threading.py index b597336a1506..b961456fb792 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 000000000000..f5335a33c066 --- /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.