@@ -402,28 +402,39 @@ let run ?context ?(forbid = false) main =
402
402
run_fiber ?context fiber main;
403
403
Computation. await computation
404
404
405
- let rec run_fiber_on n fiber main context =
405
+ let rec run_fiber_on n fiber main runner_main context =
406
406
if n < = 1 then run_fiber ~context fiber main
407
407
else
408
408
let runner =
409
- try Domain. spawn @@ fun () -> runner_on_this_thread context
409
+ try Domain. spawn runner_main
410
410
with exn ->
411
411
let bt = Printexc. get_raw_backtrace () in
412
412
run ~context Fun. id;
413
413
Printexc. raise_with_backtrace exn bt
414
414
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
416
416
| result ->
417
- Domain. join runner;
417
+ Option. iter Exn_bt. raise ( Domain. join runner) ;
418
418
result
419
419
| exception exn ->
420
420
let bt = Printexc. get_raw_backtrace () in
421
- Domain. join runner;
421
+ Option. iter Exn_bt. raise ( Domain. join runner) ;
422
422
Printexc. raise_with_backtrace exn bt
423
423
424
424
let run_fiber_on ?quota ?fatal_exn_handler ~n_domains fiber main =
425
425
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
427
438
428
439
let run_on ?quota ?fatal_exn_handler ~n_domains ?(forbid = false ) main =
429
440
let computation = Computation. create ~mode: `LIFO () in
0 commit comments