let unwind_protect f x g y = try let v = f x in g y; v with z -> g y; raise 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_connection, client_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();; |