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
318
318
process (Process. spawn ~sw actions)
319
319
end
320
320
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
+
321
332
let domain_mgr ~run_event_loop = object
322
333
inherit Eio.Domain_manager. t
323
334
324
335
method run_raw fn =
325
336
let domain = ref None in
326
337
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 () )))
328
339
);
329
- Domain. join (Option. get ! domain)
340
+ unwrap_backtrace ( Domain. join (Option. get ! domain) )
330
341
331
342
method run fn =
332
343
let domain = ref None in
@@ -337,12 +348,13 @@ let domain_mgr ~run_event_loop = object
337
348
Fun. protect
338
349
(fun () ->
339
350
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 () )) () ;
341
353
Option. get ! result
342
354
)
343
355
~finally: (fun () -> Sched. enqueue_thread t k () )))
344
356
);
345
- Domain. join (Option. get ! domain)
357
+ unwrap_backtrace ( Domain. join (Option. get ! domain) )
346
358
end
347
359
348
360
let mono_clock = object
Original file line number Diff line number Diff line change @@ -76,24 +76,35 @@ let run_event_loop fn x =
76
76
in
77
77
Sched. run ~extra_effects sched fn x
78
78
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
+
79
90
let v = object
80
91
inherit Eio.Domain_manager. t
81
92
82
93
method run_raw fn =
83
94
let domain = ref None in
84
95
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 () ))))
86
97
);
87
- Domain. join (Option. get ! domain)
98
+ unwrap_backtrace ( Domain. join (Option. get ! domain) )
88
99
89
100
method run fn =
90
101
let domain = ref None in
91
102
Eio.Private.Suspend. enter (fun ctx enqueue ->
92
103
let cancelled, set_cancelled = Promise. create () in
93
104
Eio.Private.Fiber_context. set_cancel_fn ctx (Promise. resolve set_cancelled);
94
105
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 ) ))
96
107
~finally: (fun () -> enqueue (Ok () ))))
97
108
);
98
- Domain. join (Option. get ! domain)
109
+ unwrap_backtrace ( Domain. join (Option. get ! domain) )
99
110
end
Original file line number Diff line number Diff line change @@ -77,24 +77,35 @@ let run_event_loop fn x =
77
77
in
78
78
Sched. run ~extra_effects sched fn x
79
79
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
+
80
91
let v = object
81
92
inherit Eio.Domain_manager. t
82
93
83
94
method run_raw fn =
84
95
let domain = ref None in
85
96
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 () ))))
87
98
);
88
- Domain. join (Option. get ! domain)
99
+ unwrap_backtrace ( Domain. join (Option. get ! domain) )
89
100
90
101
method run fn =
91
102
let domain = ref None in
92
103
Eio.Private.Suspend. enter (fun ctx enqueue ->
93
104
let cancelled, set_cancelled = Promise. create () in
94
105
Eio.Private.Fiber_context. set_cancel_fn ctx (Promise. resolve set_cancelled);
95
106
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 ) ))
97
108
~finally: (fun () -> enqueue (Ok () ))))
98
109
);
99
- Domain. join (Option. get ! domain)
110
+ unwrap_backtrace ( Domain. join (Option. get ! domain) )
100
111
end
You can’t perform that action at this time.
0 commit comments