summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2020-03-27 16:50:42 (GMT)
committerGitHub <noreply@github.com>2020-03-27 16:50:42 (GMT)
commitd8ff44ce4cd6f3ec0fab5fccda6bf14afcb25c30 (patch)
tree009d56fe2dac5c1e920771297c9a08eb38d16ef8
parent5a58c5280b8df4ca5d6a19892b24fff96e9ea868 (diff)
downloadcpython-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.py10
-rw-r--r--Misc/NEWS.d/next/Library/2020-03-27-17-22-34.bpo-40089.-lFsD0.rst3
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.