diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2007-01-04 21:06:12 +0000 |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2007-01-04 21:06:12 +0000 |
commit | 507761da13923f44032fe4ed8e366c377c14eff4 (patch) | |
tree | be2df66e0d1e766a3a21f600dc6fb738e819a4be /Modules/main.c | |
parent | 27049ba151595990400d6accc473910787e1144c (diff) | |
download | cpython-507761da13923f44032fe4ed8e366c377c14eff4.tar.gz |
Bug #1566280: Explicitly invoke threading._shutdown from Py_Main,
to avoid relying on atexit.
Will backport to 2.5.
Diffstat (limited to 'Modules/main.c')
-rw-r--r-- | Modules/main.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/Modules/main.c b/Modules/main.c index 2224dfe2f0..dc46d550c6 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -177,6 +177,33 @@ static int RunModule(char *module) 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 @@ Py_Main(int argc, char **argv) /* XXX */ sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0; + WaitForThreadShutdown(); + Py_Finalize(); #ifdef RISCOS if (Py_RISCOSWimpFlag) |