From a4d4f1b4cb9f6038f865f86e1aa93169fc54dbaf Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 1 Apr 2011 03:00:05 +0200 Subject: Issue #11393: New try to fix faulthandler_thread() Always release the cancel join. Fix also another corner case: _PyFaulthandler_Fini() called after setting running variable to zero, but before releasing the join lock. --- Modules/faulthandler.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index 760689e..f8b9fb6 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -401,7 +401,6 @@ faulthandler_thread(void *unused) thread.timeout_ms, 0); if (st == PY_LOCK_ACQUIRED) { /* Cancelled by user */ - PyThread_release_lock(thread.cancel_event); break; } /* Timeout => dump traceback */ @@ -418,8 +417,9 @@ faulthandler_thread(void *unused) } while (ok && thread.repeat); /* The only way out */ - thread.running = 0; + PyThread_release_lock(thread.cancel_event); PyThread_release_lock(thread.join_event); + thread.running = 0; } static void @@ -428,11 +428,11 @@ faulthandler_cancel_dump_tracebacks_later(void) if (thread.running) { /* Notify cancellation */ PyThread_release_lock(thread.cancel_event); - /* Wait for thread to join */ - PyThread_acquire_lock(thread.join_event, 1); - assert(thread.running == 0); - PyThread_release_lock(thread.join_event); } + /* Wait for thread to join */ + PyThread_acquire_lock(thread.join_event, 1); + assert(thread.running == 0); + PyThread_release_lock(thread.join_event); Py_CLEAR(thread.file); } -- cgit v0.12