sig
  type relay_message
  type output_message =
      Log of int * string
    | Stat of string
    | Progress of int
  type control_message = Ready | Ping | Terminate | Resend of int
  type message =
      OutputMessage of Messaging.S.output_message
    | ControlMessage of Messaging.S.control_message
    | RelayMessage of int * Messaging.S.relay_message
  type ctx
  type socket
  type thread
  val init_im :
    unit ->
    (Messaging.S.ctx * Messaging.S.socket * Messaging.S.socket) *
    (string * string)
  val init_worker :
    Lib.kind_module ->
    string ->
    string -> Messaging.S.ctx * Messaging.S.socket * Messaging.S.socket
  val run_im :
    Messaging.S.ctx * Messaging.S.socket * Messaging.S.socket ->
    (int * Lib.kind_module) list -> (exn -> unit) -> unit
  val run_worker :
    Messaging.S.ctx * Messaging.S.socket * Messaging.S.socket ->
    Lib.kind_module -> (exn -> unit) -> Messaging.S.thread
  val send_relay_message : Messaging.S.relay_message -> unit
  val send_output_message : Messaging.S.output_message -> unit
  val send_term_message : unit -> unit
  val recv : unit -> (Lib.kind_module * Messaging.S.message) list
  val update_child_processes_list : (int * Lib.kind_module) list -> unit
  val check_termination : unit -> bool
  val exit : Messaging.S.thread -> unit
end