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