diff options
| author | Guido van Rossum <guido@python.org> | 2000-08-27 17:34:07 +0000 |
|---|---|---|
| committer | Guido van Rossum <guido@python.org> | 2000-08-27 17:34:07 +0000 |
| commit | e902a403d5e1b5677efbb4521954e4baa4e1c792 (patch) | |
| tree | 32b8791db35e572511ea2c88d753a21cf03e032c /Python | |
| parent | af2c361275e041aed1c238312b49b2801676dd87 (diff) | |
| download | cpython-e902a403d5e1b5677efbb4521954e4baa4e1c792.tar.gz | |
Charles Waldman's patch to reinitialize the interpreter lock after a
fork. This solves the test_fork1 problem. (ceval.c, signalmodule.c,
intrcheck.c)
SourceForge: [ Patch #101226 ] make threading fork-safe
Diffstat (limited to 'Python')
| -rw-r--r-- | Python/ceval.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index 3488b9c615..2648add558 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -142,6 +142,25 @@ PyEval_ReleaseThread(PyThreadState *tstate) Py_FatalError("PyEval_ReleaseThread: wrong thread state"); PyThread_release_lock(interpreter_lock); } + +/* This function is called from PyOS_AfterFork to ensure that newly + created child processes don't hold locks referring to threads which + are not running in the child process. (This could also be done using + pthread_atfork mechanism, at least for the pthreads implementation.) */ + +void +PyEval_ReInitThreads(void) +{ + if (!interpreter_lock) + return; + /*XXX Can't use PyThread_free_lock here because it does too + much error-checking. Doing this cleanly would require + adding a new function to each thread_*.h. Instead, just + create a new lock and waste a little bit of memory */ + interpreter_lock = PyThread_allocate_lock(); + PyThread_acquire_lock(interpreter_lock, 1); + main_thread = PyThread_get_thread_ident(); +} #endif /* Functions save_thread and restore_thread are always defined so |
