Skip to content

Commit b4b3540

Browse files
authored
Merge pull request #571 from talex5/domain-backtraces
Preserve backtraces across Domain_manager.run
2 parents bd4cf9f + 091316a commit b4b3540

File tree

3 files changed

+46
-12
lines changed

3 files changed

+46
-12
lines changed

lib_eio_linux/eio_linux.ml

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -318,15 +318,26 @@ let process_mgr = object
318318
process (Process.spawn ~sw actions)
319319
end
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+
321332
let 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))
346358
end
347359

348360
let mono_clock = object

lib_eio_posix/domain_mgr.ml

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff 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+
7990
let 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))
99110
end

lib_eio_windows/domain_mgr.ml

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff 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+
8091
let 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))
100111
end

0 commit comments

Comments
 (0)