]> granicus.if.org Git - python/commitdiff
Issue #11393: fix usage of locks in faulthandler
authorVictor Stinner <victor.stinner@haypocalc.com>
Fri, 1 Apr 2011 01:16:51 +0000 (03:16 +0200)
committerVictor Stinner <victor.stinner@haypocalc.com>
Fri, 1 Apr 2011 01:16:51 +0000 (03:16 +0200)
 * 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

Modules/faulthandler.c

index f8b9fb663977a7169ae5bdf6ccc084f97b8b0a85..6e3ed7c51b6381278b912b16109794a841d97f70 100644 (file)
@@ -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");