let main_worker_loop
conf yield channel shard_id map_test_cases worker_log_file =
let logger =
let master_logger =
set_shard shard_id
(OUnitLogger.fun_logger
(fun {event = log_ev} -> channel.send_data (Log log_ev))
ignore)
in
let base_logger =
if worker_log_file then
OUnitLoggerStd.create_file_logger conf shard_id
else
OUnitLogger.null_logger
in
OUnitLogger.combine [base_logger; master_logger]
in
let shared =
let try_lock id =
channel.send_data (Lock id);
match channel.receive_data () with
| AckLock b ->
b
| Exit | RunTest _ ->
assert false
in
let rec lock id =
if not (try_lock id) then begin
yield ();
lock id
end else begin
()
end
in
let unlock id =
channel.send_data (Unlock id);
in
let global =
{
OUnitShared.
lock = lock;
try_lock = try_lock;
unlock = unlock;
}
in
{
OUnitShared.
global = global;
process = OUnitShared.noscope_create ();
}
in
let rec loop () =
match channel.receive_data () with
| Exit ->
channel.send_data AckExit
| RunTest test_path ->
let test_path, _, test_fun =
MapPath.find test_path map_test_cases
in
let res = run_one_test conf logger shared test_path test_fun in
channel.send_data (TestDone res);
loop ()
| AckLock _ ->
loop ()
in
loop ()