]> granicus.if.org Git - python/commitdiff
SF bug #516372: test_thread: unhandled exc. in thread
authorTim Peters <tim.peters@gmail.com>
Sat, 16 Feb 2002 07:26:27 +0000 (07:26 +0000)
committerTim Peters <tim.peters@gmail.com>
Sat, 16 Feb 2002 07:26:27 +0000 (07:26 +0000)
Fix exit races in test_thread.py and test_threaded_import.py.
I suspect the bug is provokable only under Linux (where child threads
seem to get lots of cycles before they get killed after the main thread
exits), or on multi-processor machines running other OSes.
Bugfix candidate.

Lib/test/test_thread.py
Lib/test/test_threaded_import.py

index 02da94e75d131e1f1022e74aee762cab3f3b9929..a45fb2fd5b3f9dc3d9260e46393ea6ce1425dfa5 100644 (file)
@@ -97,10 +97,14 @@ def task2(ident):
         if verbose:
             print 'task', ident, 'leaving barrier', i
     mutex.acquire()
-    running = running - 1
-    if running == 0:
-        done.release()
+    running -= 1
+    # Must release mutex before releasing done, else the main thread can
+    # exit and set mutex to None as part of global teardown; then
+    # mutex.release() raises AttributeError.
+    finished = running == 0
     mutex.release()
+    if finished:
+        done.release()
 
 print '\n*** Barrier Test ***'
 if done.acquire(0):
index e022c5fe924118de39498fe0e2c0d6becfd0b566..d9f3d705738d6b752be830a615b9b12484fdd9fa 100644 (file)
@@ -17,9 +17,13 @@ def task():
     x = random.randrange(1, 3)
     critical_section.acquire()
     N -= 1
-    if N == 0:
-        done.release()
+    # Must release critical_section before releasing done, else the main
+    # thread can exit and set critical_section to None as part of global
+    # teardown; then critical_section.release() raises AttributeError.
+    finished = N == 0
     critical_section.release()
+    if finished:
+        done.release()
 
 # Tricky:  When regrtest imports this module, the thread running regrtest
 # grabs the import lock and won't let go of it until this module returns.