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 ()