From 1c76b7f5e505e370a5e0b840af3002054eda1e0c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 1 Apr 2011 02:28:22 +0200 Subject: [PATCH] Issue #11393: Fix faulthandler_thread(): release cancel lock before join lock If the thread releases the join lock before the cancel lock, the thread may sometimes still be alive at cancel_dump_tracebacks_later() exit. So the cancel lock may be destroyed while the thread is still alive, whereas the thread will try to release the cancel lock, which just crash. Another minor fix: the thread doesn't release the cancel lock if it didn't acquire it. --- Modules/faulthandler.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index e8ed3e8a566..760689e7815 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -401,6 +401,7 @@ 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 */ @@ -419,7 +420,6 @@ faulthandler_thread(void *unused) /* The only way out */ thread.running = 0; PyThread_release_lock(thread.join_event); - PyThread_release_lock(thread.cancel_event); } static void