From: Victor Stinner Date: Fri, 1 Apr 2011 01:16:51 +0000 (+0200) Subject: Issue #11393: fix usage of locks in faulthandler X-Git-Tag: v3.3.0a1~2703 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f309134effa997b19e202c9b580d3332952f65a4;p=python Issue #11393: fix usage of locks in faulthandler * faulthandler_cancel_dump_tracebacks_later() is responsible to set running to zero (so we don't need the volatile keyword anymore) * release locks if PyThread_start_new_thread() fails assert(thread.running == 0) was wrong in a corner case --- diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index f8b9fb6639..6e3ed7c51b 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -48,7 +48,7 @@ static struct { int fd; PY_TIMEOUT_T timeout_ms; /* timeout in microseconds */ int repeat; - volatile int running; + int running; PyInterpreterState *interp; int exit; /* released by parent thread when cancel request */ @@ -419,7 +419,6 @@ faulthandler_thread(void *unused) /* The only way out */ PyThread_release_lock(thread.cancel_event); PyThread_release_lock(thread.join_event); - thread.running = 0; } static void @@ -431,8 +430,8 @@ faulthandler_cancel_dump_tracebacks_later(void) } /* Wait for thread to join */ PyThread_acquire_lock(thread.join_event, 1); - assert(thread.running == 0); PyThread_release_lock(thread.join_event); + thread.running = 0; Py_CLEAR(thread.file); } @@ -486,6 +485,8 @@ faulthandler_dump_traceback_later(PyObject *self, thread.running = 1; if (PyThread_start_new_thread(faulthandler_thread, NULL) == -1) { thread.running = 0; + PyThread_release_lock(thread.join_event); + PyThread_release_lock(thread.cancel_event); Py_CLEAR(thread.file); PyErr_SetString(PyExc_RuntimeError, "unable to start watchdog thread");