diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2011-04-01 03:00:05 +0200 |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2011-04-01 03:00:05 +0200 |
commit | 77e1aeaf9cedd48ad1df88ca8155dc5791a04c39 (patch) | |
tree | ae416edf932b1a9009cb1c555b11abd719a4db61 | |
parent | 4a338d66c6ab8d9d27ae54b624011b974f3e731d (diff) | |
download | cpython-77e1aeaf9cedd48ad1df88ca8155dc5791a04c39.tar.gz |
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.
-rw-r--r-- | Modules/faulthandler.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index 760689e781..f8b9fb6639 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); } |