Skip to content

Commit 377b934

Browse files
committed
Work around Domain.spawn + Domain.join not keeping stack traces
1 parent abb2fea commit 377b934

File tree

2 files changed

+35
-12
lines changed

2 files changed

+35
-12
lines changed

lib/picos_multififos/picos_multififos.ml

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -402,28 +402,39 @@ let run ?context ?(forbid = false) main =
402402
run_fiber ?context fiber main;
403403
Computation.await computation
404404

405-
let rec run_fiber_on n fiber main context =
405+
let rec run_fiber_on n fiber main runner_main context =
406406
if n <= 1 then run_fiber ~context fiber main
407407
else
408408
let runner =
409-
try Domain.spawn @@ fun () -> runner_on_this_thread context
409+
try Domain.spawn runner_main
410410
with exn ->
411411
let bt = Printexc.get_raw_backtrace () in
412412
run ~context Fun.id;
413413
Printexc.raise_with_backtrace exn bt
414414
in
415-
match run_fiber_on (n - 1) fiber main context with
415+
match run_fiber_on (n - 1) fiber main runner_main context with
416416
| result ->
417-
Domain.join runner;
417+
Option.iter Exn_bt.raise (Domain.join runner);
418418
result
419419
| exception exn ->
420420
let bt = Printexc.get_raw_backtrace () in
421-
Domain.join runner;
421+
Option.iter Exn_bt.raise (Domain.join runner);
422422
Printexc.raise_with_backtrace exn bt
423423

424424
let run_fiber_on ?quota ?fatal_exn_handler ~n_domains fiber main =
425425
if n_domains < 1 then invalid_arg "n_domains must be positive";
426-
run_fiber_on n_domains fiber main (context ?quota ?fatal_exn_handler ())
426+
let context = context ?quota ?fatal_exn_handler () in
427+
let runner_main =
428+
if n_domains = 1 then fun () -> None
429+
else
430+
let bt_status = Printexc.backtrace_status () in
431+
fun () ->
432+
Printexc.record_backtrace bt_status;
433+
match runner_on_this_thread context with
434+
| () -> None
435+
| exception exn -> Some (Exn_bt.get exn)
436+
in
437+
run_fiber_on n_domains fiber main runner_main context
427438

428439
let run_on ?quota ?fatal_exn_handler ~n_domains ?(forbid = false) main =
429440
let computation = Computation.create ~mode:`LIFO () in

lib/picos_randos/picos_randos.ml

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -291,28 +291,40 @@ let run ?context ?(forbid = false) main =
291291
run_fiber ?context fiber main;
292292
Computation.await computation
293293

294-
let rec run_fiber_on n fiber main context =
294+
let rec run_fiber_on n fiber main runner_main context =
295295
if n <= 1 then run_fiber ~context fiber main
296296
else
297297
let runner =
298-
try Domain.spawn @@ fun () -> runner_on_this_thread context
298+
try Domain.spawn runner_main
299299
with exn ->
300300
let bt = Printexc.get_raw_backtrace () in
301301
run ~context Fun.id;
302302
Printexc.raise_with_backtrace exn bt
303303
in
304-
match run_fiber_on (n - 1) fiber main context with
304+
match run_fiber_on (n - 1) fiber main runner_main context with
305305
| result ->
306-
Domain.join runner;
306+
Option.iter Exn_bt.raise (Domain.join runner);
307307
result
308308
| exception exn ->
309309
let bt = Printexc.get_raw_backtrace () in
310-
Domain.join runner;
310+
Option.iter Exn_bt.raise (Domain.join runner);
311311
Printexc.raise_with_backtrace exn bt
312312

313313
let run_fiber_on ?fatal_exn_handler ~n_domains fiber main =
314314
if n_domains < 1 then invalid_arg "n_domains must be positive";
315-
run_fiber_on n_domains fiber main (context ?fatal_exn_handler ())
315+
let context = context ?fatal_exn_handler () in
316+
let runner_main =
317+
if n_domains = 1 then fun () -> None
318+
else
319+
let bt_status = Printexc.backtrace_status () in
320+
fun () ->
321+
Printexc.record_backtrace bt_status;
322+
match runner_on_this_thread context with
323+
| () -> None
324+
| exception exn -> Some (Exn_bt.get exn)
325+
in
326+
327+
run_fiber_on n_domains fiber main runner_main context
316328

317329
let run_on ?fatal_exn_handler ~n_domains ?(forbid = false) main =
318330
let computation = Computation.create ~mode:`LIFO () in

0 commit comments

Comments
 (0)