open Tracer (* A distant server can be given as comand-line argument *) let addr = if Array.length Sys.argv > 1 then (Unix.gethostbyname Sys.argv.(1)).Unix.h_addr_list.(0) else Join.Site.get_local_addr () let addr = Unix.ADDR_INET (addr,12345) (* Die when server dies *) let server = Join.Site.there addr let () = Join.Site.at_fail server (def bye() = exit 0 ; 0 in bye) (* Get register channel *) let ns = Join.Ns.of_site server let rec lookup key = try Join.Ns.lookup ns key with Not_found -> Thread.delay 1.0 ; lookup key let (register : Tracer.agent Join.chan) = lookup "register" (* Create is the agent to be registered - Server will first call it with the scene as argument - Agent will return the acual worker *) def create (scene,ss,n) = (* I have the scene, I can build the actual worker *) let f = Tracer.create_ray_trace scene ss n in (* And warp it as a sync channel that computes a line *) def worker(y) = let r = String.create n in for x = 0 to n-1 do r.[x] <- f x y done ; reply r to worker in reply worker to create (* Now register the agent *) let () = spawn register(create) (* Deadlock *) def dead() & never() = reply to dead let () = dead()