[Python-checkins] r67736 - in python/branches/release25-maint: Include/pythread.h Misc/NEWS Modules/signalmodule.c Parser/intrcheck.c Python/thread.c

martin.v.loewis python-checkins at python.org
Sat Dec 13 15:59:05 CET 2008


Author: martin.v.loewis
Date: Sat Dec 13 15:59:04 2008
New Revision: 67736
Log:
Backport of r64212
Issue #1683: prevent forking from interfering in threading storage.
Modified:
 python/branches/release25-maint/Include/pythread.h
 python/branches/release25-maint/Misc/NEWS
 python/branches/release25-maint/Modules/signalmodule.c
 python/branches/release25-maint/Parser/intrcheck.c
 python/branches/release25-maint/Python/thread.c
Modified: python/branches/release25-maint/Include/pythread.h
==============================================================================
--- python/branches/release25-maint/Include/pythread.h	(original)
+++ python/branches/release25-maint/Include/pythread.h	Sat Dec 13 15:59:04 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/release25-maint/Misc/NEWS
==============================================================================
--- python/branches/release25-maint/Misc/NEWS	(original)
+++ python/branches/release25-maint/Misc/NEWS	Sat Dec 13 15:59:04 2008
@@ -12,6 +12,8 @@
 Core and builtins
 -----------------
 
+- Issue #1683: prevent forking from interfering in threading storage.
+
 - Issue #4597: Fixed several opcodes that weren't always propagating
 exceptions.
 
Modified: python/branches/release25-maint/Modules/signalmodule.c
==============================================================================
--- python/branches/release25-maint/Modules/signalmodule.c	(original)
+++ python/branches/release25-maint/Modules/signalmodule.c	Sat Dec 13 15:59:04 2008
@@ -693,5 +693,6 @@
 	main_thread = PyThread_get_thread_ident();
 	main_pid = getpid();
 	_PyImport_ReInitLock();
+	PyThread_ReInitTLS();
 #endif
 }
Modified: python/branches/release25-maint/Parser/intrcheck.c
==============================================================================
--- python/branches/release25-maint/Parser/intrcheck.c	(original)
+++ python/branches/release25-maint/Parser/intrcheck.c	Sat Dec 13 15:59:04 2008
@@ -2,6 +2,7 @@
 /* Check for interrupts */
 
 #include "Python.h"
+#include "pythread.h"
 
 #ifdef QUICKWIN
 
@@ -172,5 +173,6 @@
 {
 #ifdef WITH_THREAD
 	PyEval_ReInitThreads();
+	PyThread_ReInitTLS();
 #endif
 }
Modified: python/branches/release25-maint/Python/thread.c
==============================================================================
--- python/branches/release25-maint/Python/thread.c	(original)
+++ python/branches/release25-maint/Python/thread.c	Sat Dec 13 15:59:04 2008
@@ -391,4 +391,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-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /