diff Python/thread.c @ 50146:8d902c513ba0 2.5

Backport of r64212 Issue #1683: prevent forking from interfering in threading storage.
author Martin v. Löwis <martin@v.loewis.de>
date Sat, 13 Dec 2008 14:59:04 +0000
parents eefe4450f773
children 787b969d37f0
line wrap: on
line diff
--- a/Python/thread.c	Sat Dec 13 14:48:13 2008 +0000
+++ b/Python/thread.c	Sat Dec 13 14:59:04 2008 +0000
@@ -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 */