sig
  type message_to_worker = Exit | AckLock of bool | RunTest of OUnitTest.path
  val string_of_message_to_worker :
    OUnitRunner.GenericWorker.message_to_worker -> string
  type message_from_worker =
      AckExit
    | Log of OUnitTest.log_event_t
    | Lock of int
    | Unlock of int
    | TestDone of (OUnitTest.result_full * OUnitTest.result_list)
  val string_of_message_from_worker :
    OUnitRunner.GenericWorker.message_from_worker -> string
  module MapPath :
    sig
      type key = OUnitTest.path
      type +'a t
      val empty : 'a t
      val is_empty : 'a t -> bool
      val mem : key -> 'a t -> bool
      val add : key -> '-> 'a t -> 'a t
      val singleton : key -> '-> 'a t
      val remove : key -> 'a t -> 'a t
      val merge :
        (key -> 'a option -> 'b option -> 'c option) -> 'a t -> 'b t -> 'c t
      val union : (key -> '-> '-> 'a option) -> 'a t -> 'a t -> 'a t
      val compare : ('-> '-> int) -> 'a t -> 'a t -> int
      val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
      val iter : (key -> '-> unit) -> 'a t -> unit
      val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
      val for_all : (key -> '-> bool) -> 'a t -> bool
      val exists : (key -> '-> bool) -> 'a t -> bool
      val filter : (key -> '-> bool) -> 'a t -> 'a t
      val partition : (key -> '-> bool) -> 'a t -> 'a t * 'a t
      val cardinal : 'a t -> int
      val bindings : 'a t -> (key * 'a) list
      val min_binding : 'a t -> key * 'a
      val max_binding : 'a t -> key * 'a
      val choose : 'a t -> key * 'a
      val split : key -> 'a t -> 'a t * 'a option * 'a t
      val find : key -> 'a t -> 'a
      val map : ('-> 'b) -> 'a t -> 'b t
      val mapi : (key -> '-> 'b) -> 'a t -> 'b t
    end
  type ('a, 'b) channel = {
    send_data : '-> unit;
    receive_data : unit -> 'b;
    close : unit -> unit;
  }
  val wrap_channel :
    string ->
    ('-> string) ->
    ('-> string) ->
    ('b, 'a) OUnitRunner.GenericWorker.channel ->
    ('b, 'a) OUnitRunner.GenericWorker.channel
  val main_worker_loop :
    OUnitConf.conf ->
    (unit -> 'a) ->
    (OUnitRunner.GenericWorker.message_from_worker,
     OUnitRunner.GenericWorker.message_to_worker)
    OUnitRunner.GenericWorker.channel ->
    string ->
    (OUnitTest.path * 'b * (OUnitTest.ctxt -> 'c))
    OUnitRunner.GenericWorker.MapPath.t -> bool -> unit
  type 'a worker = {
    channel :
      (OUnitRunner.GenericWorker.message_to_worker,
       OUnitRunner.GenericWorker.message_from_worker)
      OUnitRunner.GenericWorker.channel;
    close_worker : unit -> string option;
    select_fd : 'a;
    shard_id : string;
    is_running : unit -> bool;
  }
  val runner :
    (OUnitConf.conf ->
     (OUnitRunner.GenericWorker.MapPath.key * OUnitTest.test_length *
      OUnitTest.test_fun)
     OUnitRunner.GenericWorker.MapPath.t ->
     string -> string -> bool -> 'OUnitRunner.GenericWorker.worker) ->
    ('OUnitRunner.GenericWorker.worker list ->
     float -> 'OUnitRunner.GenericWorker.worker list) ->
    OUnitConf.conf ->
    (OUnitTest.path, OUnitTest.result) OUnitLogger.logger ->
    OUnitChooser.chooser ->
    (OUnitTest.path * OUnitTest.test_length * OUnitTest.test_fun) list ->
    OUnitTest.result_full list
end