]> granicus.if.org Git - python/commitdiff
Charles Waldman's patch to reinitialize the interpreter lock after a
authorGuido van Rossum <guido@python.org>
Sun, 27 Aug 2000 17:34:07 +0000 (17:34 +0000)
committerGuido van Rossum <guido@python.org>
Sun, 27 Aug 2000 17:34:07 +0000 (17:34 +0000)
fork.  This solves the test_fork1 problem.  (ceval.c, signalmodule.c,
intrcheck.c)

SourceForge: [ Patch #101226 ] make threading fork-safe

Modules/signalmodule.c
Parser/intrcheck.c
Python/ceval.c

index 4b9876f497696d9d764eefbb31e7bc4ed62762ed..368955e0c596e2d5b33cc9d461737d0ffd98b448 100644 (file)
@@ -667,6 +667,7 @@ void
 PyOS_AfterFork(void)
 {
 #ifdef WITH_THREAD
+       PyEval_ReInitThreads();
        main_thread = PyThread_get_thread_ident();
        main_pid = getpid();
 #endif
index 519f40400bbe9dbaef7e5aaa52426c3d0a39df03..d20ed6100b0b1da76b97231221db6082790f9951 100644 (file)
@@ -195,4 +195,7 @@ PyOS_InterruptOccurred(void)
 void
 PyOS_AfterFork(void)
 {
+#ifdef WITH_THREAD
+       PyEval_ReInitThreads();
+#endif
 }
index 3488b9c61523aad815eb383ee96a4f784281d296..2648add5584e2a30b9cfcf67b522092539d3e0ed 100644 (file)
@@ -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