summaryrefslogtreecommitdiff
path: root/Lib/threading.py
diff options
context:
space:
mode:
authorJesse Noller <jnoller@gmail.com>2008-07-17 16:49:17 +0000
committerJesse Noller <jnoller@gmail.com>2008-07-17 16:49:17 +0000
commita851397ddcff527881407f25b13f836a3fc57ee5 (patch)
treeab06e41a055e91afd8beb6edcc6496d6fffffb6a /Lib/threading.py
parente921e02a2e97cc418a1c8faec135056802849864 (diff)
downloadcpython-git-a851397ddcff527881407f25b13f836a3fc57ee5.tar.gz
Merger 65032 to py3k
Diffstat (limited to 'Lib/threading.py')
-rw-r--r--Lib/threading.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/Lib/threading.py b/Lib/threading.py
index cfa9a106a6..48321014c2 100644
--- a/Lib/threading.py
+++ b/Lib/threading.py
@@ -783,6 +783,37 @@ except ImportError:
from _threading_local import local
+def _after_fork():
+ # This function is called by Python/ceval.c:PyEval_ReInitThreads which
+ # is called from PyOS_AfterFork. Here we cleanup threading module state
+ # that should not exist after a fork.
+
+ # Reset _active_limbo_lock, in case we forked while the lock was held
+ # by another (non-forked) thread. http://bugs.python.org/issue874900
+ global _active_limbo_lock
+ _active_limbo_lock = _allocate_lock()
+
+ # fork() only copied the current thread; clear references to others.
+ new_active = {}
+ current = current_thread()
+ with _active_limbo_lock:
+ for ident, thread in _active.items():
+ if thread is current:
+ # There is only one active thread.
+ new_active[ident] = thread
+ else:
+ # All the others are already stopped.
+ # We don't call _Thread__stop() because it tries to acquire
+ # thread._Thread__block which could also have been held while
+ # we forked.
+ thread._Thread__stopped = True
+
+ _limbo.clear()
+ _active.clear()
+ _active.update(new_active)
+ assert len(_active) == 1
+
+
# Self-test code
def _test():