]> granicus.if.org Git - python/commitdiff
Issue #11393: Fix faulthandler_thread(): release cancel lock before join lock
authorVictor Stinner <victor.stinner@haypocalc.com>
Fri, 1 Apr 2011 00:28:22 +0000 (02:28 +0200)
committerVictor Stinner <victor.stinner@haypocalc.com>
Fri, 1 Apr 2011 00:28:22 +0000 (02:28 +0200)
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

index e8ed3e8a56685b18c4acdd57cf396d0d058b47aa..760689e7815b44bf7b404daa9b60ac6766f88012 100644 (file)
@@ -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