[Python-checkins] r53249 - in python/trunk: Lib/threading.py Misc/NEWS Modules/main.c
martin.v.loewis
python-checkins at python.org
Thu Jan 4 22:06:13 CET 2007
Author: martin.v.loewis
Date: Thu Jan 4 22:06:12 2007
New Revision: 53249
Modified:
python/trunk/Lib/threading.py
python/trunk/Misc/NEWS
python/trunk/Modules/main.c
Log:
Bug #1566280: Explicitly invoke threading._shutdown from Py_Main,
to avoid relying on atexit.
Will backport to 2.5.
Modified: python/trunk/Lib/threading.py
==============================================================================
--- python/trunk/Lib/threading.py (original)
+++ python/trunk/Lib/threading.py Thu Jan 4 22:06:12 2007
@@ -636,13 +636,11 @@
_active_limbo_lock.acquire()
_active[_get_ident()] = self
_active_limbo_lock.release()
- import atexit
- atexit.register(self.__exitfunc)
def _set_daemon(self):
return False
- def __exitfunc(self):
+ def _exitfunc(self):
self._Thread__stop()
t = _pickSomeNonDaemonThread()
if t:
@@ -715,9 +713,11 @@
from thread import stack_size
-# Create the main thread object
+# Create the main thread object,
+# and make it available for the interpreter
+# (Py_Main) as threading._shutdown.
-_MainThread()
+_shutdown = _MainThread()._exitfunc
# get thread-local implementation, either from the thread
# module, or from the python fallback
Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS (original)
+++ python/trunk/Misc/NEWS Thu Jan 4 22:06:12 2007
@@ -12,6 +12,9 @@
Core and builtins
-----------------
+- Bug #1566280: Explicitly invoke threading._shutdown from Py_Main,
+ to avoid relying on atexit.
+
- Bug #1590891: random.randrange don't return correct value for big number
- Patch #1586791: Better exception messages for some operations on strings,
Modified: python/trunk/Modules/main.c
==============================================================================
--- python/trunk/Modules/main.c (original)
+++ python/trunk/Modules/main.c Thu Jan 4 22:06:12 2007
@@ -177,6 +177,33 @@
return 0;
}
+/* Wait until threading._shutdown completes, provided
+ the threading module was imported in the first place.
+ The shutdown routine will wait until all non-daemon
+ "threading" threads have completed. */
+#include "abstract.h"
+static void
+WaitForThreadShutdown()
+{
+#ifdef WITH_THREAD
+ PyObject *result;
+ PyThreadState *tstate = PyThreadState_GET();
+ PyObject *threading = PyMapping_GetItemString(tstate->interp->modules,
+ "threading");
+ if (threading == NULL) {
+ /* threading not imported */
+ PyErr_Clear();
+ return;
+ }
+ result = PyObject_CallMethod(threading, "_shutdown", "");
+ if (result == NULL)
+ PyErr_WriteUnraisable(threading);
+ else
+ Py_DECREF(result);
+ Py_DECREF(threading);
+#endif
+}
+
/* Main program */
int
@@ -514,6 +541,8 @@
/* XXX */
sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
+ WaitForThreadShutdown();
+
Py_Finalize();
#ifdef RISCOS
if (Py_RISCOSWimpFlag)
More information about the Python-checkins
mailing list