@@ -467,6 +467,7 @@ function runtests(ARGS; testfilter = Returns(true), RecordType = TestRecord,
467467 results = []
468468 tasks = Task[]
469469 running_tests = Dict {String, Tuple{Int, Float64}} () # test => (worker, start_time)
470+ test_lock = ReentrantLock () # to protect crucial access to tests and running_tests
470471
471472 done = false
472473 function stop_work ()
@@ -666,12 +667,17 @@ function runtests(ARGS; testfilter = Returns(true), RecordType = TestRecord,
666667 end
667668
668669 # get a test to run
669- test = popfirst! (tests)
670- wrkr = something (test_worker (test), p)
670+ test, wrkr, test_t0 = Base. @lock test_lock begin
671+ test = popfirst! (tests)
672+ wrkr = something (test_worker (test), p)
673+
674+ test_t0 = time ()
675+ running_tests[test] = (wrkr, test_t0)
676+
677+ test, wrkr, test_t0
678+ end
671679
672680 # run the test
673- test_t0 = time ()
674- running_tests[test] = (wrkr, test_t0)
675681 put! (printer_channel, (:started , test, wrkr))
676682 resp = try
677683 remotecall_fetch (runtest, wrkr, RecordType, test_runners[test], test, init_code)
@@ -728,7 +734,7 @@ function runtests(ARGS; testfilter = Returns(true), RecordType = TestRecord,
728734 if any (istaskfailed, tasks)
729735 println (io_ctx. stderr , " \n Caught an error, stopping..." )
730736 break
731- elseif done || ( isempty (tests) && isempty (running_tests))
737+ elseif done || Base . @lock (test_lock, isempty (tests) && isempty (running_tests))
732738 break
733739 end
734740 sleep (1 )
0 commit comments