[Python-3000-checkins] r64213 - in python/branches/py3k: Include/pythread.h Modules/signalmodule.c Parser/intrcheck.c Python/thread.c
benjamin.peterson
python-3000-checkins at python.org
Fri Jun 13 02:26:50 CEST 2008
Author: benjamin.peterson
Date: Fri Jun 13 02:26:50 2008
New Revision: 64213
Log:
Merged revisions 64212 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r64212 | benjamin.peterson | 2008-06-12 19:09:47 -0500 (Thu, 12 Jun 2008) | 3 lines
#1683 prevent forking from interfering in threading storage
This should prevent some test_multiprocessing failures
........
Modified:
python/branches/py3k/ (props changed)
python/branches/py3k/Include/pythread.h
python/branches/py3k/Modules/signalmodule.c
python/branches/py3k/Parser/intrcheck.c
python/branches/py3k/Python/thread.c
Modified: python/branches/py3k/Include/pythread.h
==============================================================================
--- python/branches/py3k/Include/pythread.h (original)
+++ python/branches/py3k/Include/pythread.h Fri Jun 13 02:26:50 2008
@@ -40,6 +40,9 @@
PyAPI_FUNC(void *) PyThread_get_key_value(int);
PyAPI_FUNC(void) PyThread_delete_key_value(int key);
+/* Cleanup after a fork */
+PyAPI_FUNC(void) PyThread_ReInitTLS(void);
+
#ifdef __cplusplus
}
#endif
Modified: python/branches/py3k/Modules/signalmodule.c
==============================================================================
--- python/branches/py3k/Modules/signalmodule.c (original)
+++ python/branches/py3k/Modules/signalmodule.c Fri Jun 13 02:26:50 2008
@@ -941,5 +941,6 @@
main_thread = PyThread_get_thread_ident();
main_pid = getpid();
_PyImport_ReInitLock();
+ PyThread_ReInitTLS();
#endif
}
Modified: python/branches/py3k/Parser/intrcheck.c
==============================================================================
--- python/branches/py3k/Parser/intrcheck.c (original)
+++ python/branches/py3k/Parser/intrcheck.c Fri Jun 13 02:26:50 2008
@@ -2,6 +2,7 @@
/* Check for interrupts */
#include "Python.h"
+#include "pythread.h"
#ifdef QUICKWIN
@@ -168,5 +169,6 @@
{
#ifdef WITH_THREAD
PyEval_ReInitThreads();
+ PyThread_ReInitTLS();
#endif
}
Modified: python/branches/py3k/Python/thread.c
==============================================================================
--- python/branches/py3k/Python/thread.c (original)
+++ python/branches/py3k/Python/thread.c Fri Jun 13 02:26:50 2008
@@ -377,4 +377,35 @@
PyThread_release_lock(keymutex);
}
+/* Forget everything not associated with the current thread id.
+ * This function is called from PyOS_AfterFork(). It is necessary
+ * because other thread ids which were in use at the time of the fork
+ * may be reused for new threads created in the forked process.
+ */
+void
+PyThread_ReInitTLS(void)
+{
+ long id = PyThread_get_thread_ident();
+ struct key *p, **q;
+
+ if (!keymutex)
+ return;
+
+ /* As with interpreter_lock in PyEval_ReInitThreads()
+ we just create a new lock without freeing the old one */
+ keymutex = PyThread_allocate_lock();
+
+ /* Delete all keys which do not match the current thread id */
+ q = &keyhead;
+ while ((p = *q) != NULL) {
+ if (p->id != id) {
+ *q = p->next;
+ free((void *)p);
+ /* NB This does *not* free p->value! */
+ }
+ else
+ q = &p->next;
+ }
+}
+
#endif /* Py_HAVE_NATIVE_TLS */
More information about the Python-3000-checkins
mailing list