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