diff options
author | Jesse Noller <jnoller@gmail.com> | 2008-07-17 16:49:17 +0000 |
---|---|---|
committer | Jesse Noller <jnoller@gmail.com> | 2008-07-17 16:49:17 +0000 |
commit | a851397ddcff527881407f25b13f836a3fc57ee5 (patch) | |
tree | ab06e41a055e91afd8beb6edcc6496d6fffffb6a /Lib/threading.py | |
parent | e921e02a2e97cc418a1c8faec135056802849864 (diff) | |
download | cpython-git-a851397ddcff527881407f25b13f836a3fc57ee5.tar.gz |
Merger 65032 to py3k
Diffstat (limited to 'Lib/threading.py')
-rw-r--r-- | Lib/threading.py | 31 |
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(): |