# HG changeset patch # User Pierre-Yves David # Date 1653379073 -7200 # Node ID eca367970253e6b08fb31bf9163e8895a7822c83 # Parent c95e5ba4de1e8db203eab48bb4bfdd0e07733168 run-tests: send the test result after freeing the channel Sending the message about the test being "done" signals to the main thread that a new test can be started. Before this changeset, we sent this signal before freeing the channel, there is room for a race condition where a new test would search for a channel before the old test freed the one it used. This is an example of the failure it would produce: https://foss.heptapod.net/mercurial/mercurial-devel/-/jobs/552404 diff -r c95e5ba4de1e -r eca367970253 tests/run-tests.py --- a/tests/run-tests.py Tue May 24 09:36:40 2022 +0200 +++ b/tests/run-tests.py Tue May 24 09:57:53 2022 +0200 @@ -2563,19 +2563,21 @@ else: raise ValueError('Could not find output channel') channels[channel] = "=" + test.name[5:].split(".")[0] + + r = None try: test(result) - done.put(None) except KeyboardInterrupt: - done.put(None) + pass except: # re-raises - done.put(('!', test, 'run-test raised an error, see traceback')) + r = ('!', test, 'run-test raised an error, see traceback') raise finally: try: channels[channel] = '' except IndexError: pass + done.put(r) def stat(): count = 0