let unwind_protect f x g y =
  try let v = f x in g yv with z -> g yraise z;;

let establish_fixed_thread_number_server n f port =
  let socket_server = open_server port in
  let mutex = Mutex.create() in
  let exclusive_accept () =
    try
      Mutex.lock mutex;
      let socket_connectionclient_addr =
        unwind_protect accept socket_server Mutex.unlock mutex in
      Printf.eprintf "Connection from %s.\n"
        (string_of_sockaddr client_addr);
      Pervasives.flush Pervasives.stderr;
      f socket_connection
    with
      Unix_error(EINTR,_,_) -> ()
    | _ ->
        prerr_endline "Unrecoverable error";
        exit(1);
  in
  let become_server () = while true do exclusive_accept () done in
  for i = 1 to n-1 do ignore (Thread.create become_server ()) done;
  become_server();;