From: Michael W. Hudson Date: Fri, 22 Feb 2002 13:29:32 +0000 (+0000) Subject: backport tim_one's checkin of X-Git-Tag: v2.2.1c1~193 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bccffe226a020e89b7c78871bd46db0924be24e1;p=thirdparty%2FPython%2Fcpython.git backport tim_one's checkin of revision 1.10 of test_thread.py revision 1.5 of test_threaded_import.py SF bug #516372: test_thread: unhandled exc. in thread 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. --- diff --git a/Lib/test/test_thread.py b/Lib/test/test_thread.py index 02da94e75d13..a45fb2fd5b3f 100644 --- a/Lib/test/test_thread.py +++ b/Lib/test/test_thread.py @@ -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): diff --git a/Lib/test/test_threaded_import.py b/Lib/test/test_threaded_import.py index e022c5fe9241..d9f3d705738d 100644 --- a/Lib/test/test_threaded_import.py +++ b/Lib/test/test_threaded_import.py @@ -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.