sig
  exception SocketConnectFailure
  exception SocketBindFailure
  exception BadMessage
  exception InvalidProcessName
  exception NotInitialized
  module type RelayMessage =
    sig
      type t
      val message_of_strings : (unit -> string) -> Messaging.RelayMessage.t
      val strings_of_message : Messaging.RelayMessage.t -> string list
      val pp_print_message :
        Format.formatter -> Messaging.RelayMessage.t -> unit
    end
  module type S =
    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
  module Make :
    functor (T : RelayMessage->
      sig
        type relay_message = T.t
        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 output_message
          | ControlMessage of control_message
          | RelayMessage of int * relay_message
        type ctx
        type socket
        type thread
        val init_im : unit -> (ctx * socket * socket) * (string * string)
        val init_worker :
          Lib.kind_module -> string -> string -> ctx * socket * socket
        val run_im :
          ctx * socket * socket ->
          (int * Lib.kind_module) list -> (exn -> unit) -> unit
        val run_worker :
          ctx * socket * socket -> Lib.kind_module -> (exn -> unit) -> thread
        val send_relay_message : relay_message -> unit
        val send_output_message : output_message -> unit
        val send_term_message : unit -> unit
        val recv : unit -> (Lib.kind_module * message) list
        val update_child_processes_list :
          (int * Lib.kind_module) list -> unit
        val check_termination : unit -> bool
        val exit : thread -> unit
      end
end