@@ -36,7 +36,7 @@ module Run = struct
3636 ; root : string
3737 ; where : Dune_rpc.Where .t
3838 ; server : Csexp_rpc.Server .t Lazy .t
39- ; server_ivar : Csexp_rpc.Server .t Fiber.Ivar .t
39+ ; startup_ivar : ( Csexp_rpc.Server .t , Exn_with_backtrace .t ) result Fiber.Ivar .t
4040 ; registry : [ `Add | `Skip ]
4141 }
4242
@@ -61,8 +61,18 @@ module Run = struct
6161 in
6262 let run () =
6363 let open Fiber.O in
64- let server = Lazy. force t.server in
65- let * () = Fiber.Ivar. fill t.server_ivar server in
64+ let * server =
65+ match Exn_with_backtrace. try_with (fun () -> Lazy. force t.server) with
66+ | Ok server ->
67+ let + () = Fiber.Ivar. fill t.startup_ivar (Ok server) in
68+ server
69+ | Error exn ->
70+ let () =
71+ Dune_trace. emit Rpc (fun () -> Dune_trace.Event.Rpc. startup_failure exn )
72+ in
73+ let * () = Fiber.Ivar. fill t.startup_ivar (Error exn ) in
74+ Exn_with_backtrace. reraise exn
75+ in
6676 Fiber. fork_and_join_unit
6777 (fun () ->
6878 let * sessions = Csexp_rpc.Server. serve server in
@@ -196,15 +206,18 @@ type 'build_arg t =
196206 }
197207
198208let ready (t : _ t ) =
199- let * server = Fiber.Ivar. read t.config.server_ivar in
200- Csexp_rpc.Server. ready server
209+ Fiber.Ivar. read t.config.startup_ivar
210+ >> = function
211+ | Ok server -> Csexp_rpc.Server. ready server
212+ | Error _exn -> raise Dune_util.Report_error. Already_reported
201213;;
202214
203215let stop (t : _ t ) =
204- let * server = Fiber.Ivar. peek t.config.server_ivar in
205- match server with
216+ Fiber.Ivar. peek t.config.startup_ivar
217+ >> = function
206218 | None -> Fiber. return ()
207- | Some server -> Csexp_rpc.Server. stop server
219+ | Some (Error _ ) -> Fiber. return ()
220+ | Some (Ok server ) -> Csexp_rpc.Server. stop server
208221;;
209222
210223let get_current_diagnostic_errors () =
@@ -494,7 +507,7 @@ let create ~lock_timeout ~registry ~root =
494507 ; where
495508 ; server
496509 ; registry
497- ; server_ivar = Fiber.Ivar. create ()
510+ ; startup_ivar = Fiber.Ivar. create ()
498511 }
499512 in
500513 let res = { config; pending_jobs; clients = Clients. empty } in
0 commit comments