File tree Expand file tree Collapse file tree 3 files changed +46
-12
lines changed Expand file tree Collapse file tree 3 files changed +46
-12
lines changed Original file line number Diff line number Diff line change @@ -318,15 +318,26 @@ let process_mgr = object
318318 process (Process. spawn ~sw actions)
319319end
320320
321+ let wrap_backtrace fn x =
322+ match fn x with
323+ | x -> Ok x
324+ | exception ex ->
325+ let bt = Printexc. get_raw_backtrace () in
326+ Error (ex, bt)
327+
328+ let unwrap_backtrace = function
329+ | Ok x -> x
330+ | Error (ex , bt ) -> Printexc. raise_with_backtrace ex bt
331+
321332let domain_mgr ~run_event_loop = object
322333 inherit Eio.Domain_manager. t
323334
324335 method run_raw fn =
325336 let domain = ref None in
326337 Sched. enter (fun t k ->
327- domain := Some (Domain. spawn (fun () -> Fun. protect fn ~finally: (fun () -> Sched. enqueue_thread t k () )))
338+ domain := Some (Domain. spawn (fun () -> Fun. protect (wrap_backtrace fn) ~finally: (fun () -> Sched. enqueue_thread t k () )))
328339 );
329- Domain. join (Option. get ! domain)
340+ unwrap_backtrace ( Domain. join (Option. get ! domain) )
330341
331342 method run fn =
332343 let domain = ref None in
@@ -337,12 +348,13 @@ let domain_mgr ~run_event_loop = object
337348 Fun. protect
338349 (fun () ->
339350 let result = ref None in
340- run_event_loop (fun () -> result := Some (fn ~cancelled )) () ;
351+ let fn = wrap_backtrace (fun () -> fn ~cancelled ) in
352+ run_event_loop (fun () -> result := Some (fn () )) () ;
341353 Option. get ! result
342354 )
343355 ~finally: (fun () -> Sched. enqueue_thread t k () )))
344356 );
345- Domain. join (Option. get ! domain)
357+ unwrap_backtrace ( Domain. join (Option. get ! domain) )
346358end
347359
348360let mono_clock = object
Original file line number Diff line number Diff line change @@ -76,24 +76,35 @@ let run_event_loop fn x =
7676 in
7777 Sched. run ~extra_effects sched fn x
7878
79+ let wrap_backtrace fn x =
80+ match fn x with
81+ | x -> Ok x
82+ | exception ex ->
83+ let bt = Printexc. get_raw_backtrace () in
84+ Error (ex, bt)
85+
86+ let unwrap_backtrace = function
87+ | Ok x -> x
88+ | Error (ex , bt ) -> Printexc. raise_with_backtrace ex bt
89+
7990let v = object
8091 inherit Eio.Domain_manager. t
8192
8293 method run_raw fn =
8394 let domain = ref None in
8495 Eio.Private.Suspend. enter (fun _ctx enqueue ->
85- domain := Some (Domain. spawn (fun () -> Fun. protect fn ~finally: (fun () -> enqueue (Ok () ))))
96+ domain := Some (Domain. spawn (fun () -> Fun. protect (wrap_backtrace fn) ~finally: (fun () -> enqueue (Ok () ))))
8697 );
87- Domain. join (Option. get ! domain)
98+ unwrap_backtrace ( Domain. join (Option. get ! domain) )
8899
89100 method run fn =
90101 let domain = ref None in
91102 Eio.Private.Suspend. enter (fun ctx enqueue ->
92103 let cancelled, set_cancelled = Promise. create () in
93104 Eio.Private.Fiber_context. set_cancel_fn ctx (Promise. resolve set_cancelled);
94105 domain := Some (Domain. spawn (fun () ->
95- Fun. protect (run_event_loop (fun () -> fn ~cancelled ))
106+ Fun. protect (run_event_loop (wrap_backtrace ( fun () -> fn ~cancelled ) ))
96107 ~finally: (fun () -> enqueue (Ok () ))))
97108 );
98- Domain. join (Option. get ! domain)
109+ unwrap_backtrace ( Domain. join (Option. get ! domain) )
99110end
Original file line number Diff line number Diff line change @@ -77,24 +77,35 @@ let run_event_loop fn x =
7777 in
7878 Sched. run ~extra_effects sched fn x
7979
80+ let wrap_backtrace fn x =
81+ match fn x with
82+ | x -> Ok x
83+ | exception ex ->
84+ let bt = Printexc. get_raw_backtrace () in
85+ Error (ex, bt)
86+
87+ let unwrap_backtrace = function
88+ | Ok x -> x
89+ | Error (ex , bt ) -> Printexc. raise_with_backtrace ex bt
90+
8091let v = object
8192 inherit Eio.Domain_manager. t
8293
8394 method run_raw fn =
8495 let domain = ref None in
8596 Eio.Private.Suspend. enter (fun _ctx enqueue ->
86- domain := Some (Domain. spawn (fun () -> Fun. protect fn ~finally: (fun () -> enqueue (Ok () ))))
97+ domain := Some (Domain. spawn (fun () -> Fun. protect (wrap_backtrace fn) ~finally: (fun () -> enqueue (Ok () ))))
8798 );
88- Domain. join (Option. get ! domain)
99+ unwrap_backtrace ( Domain. join (Option. get ! domain) )
89100
90101 method run fn =
91102 let domain = ref None in
92103 Eio.Private.Suspend. enter (fun ctx enqueue ->
93104 let cancelled, set_cancelled = Promise. create () in
94105 Eio.Private.Fiber_context. set_cancel_fn ctx (Promise. resolve set_cancelled);
95106 domain := Some (Domain. spawn (fun () ->
96- Fun. protect (run_event_loop (fun () -> fn ~cancelled ))
107+ Fun. protect (run_event_loop (wrap_backtrace ( fun () -> fn ~cancelled ) ))
97108 ~finally: (fun () -> enqueue (Ok () ))))
98109 );
99- Domain. join (Option. get ! domain)
110+ unwrap_backtrace ( Domain. join (Option. get ! domain) )
100111end
You can’t perform that action at this time.
0 commit comments