Skip to content

Commit d42285f

Browse files
committed
Protect against race between executor and monitor.
1 parent a8958af commit d42285f

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

src/ParallelTestRunner.jl

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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, "\nCaught 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

Comments
 (0)