@@ -603,7 +603,8 @@ safe_apply(M, F, A) ->
603
603
% % concurrent tasks.</li>
604
604
% % <li>`Result' specifies the outcome of the attemp to serialize command
605
605
% % execution, based on the results observed. It can be one of the following:
606
- % % <ul><li> `ok' </li><li> `no_possible_interleaving' </li></ul> </li>
606
+ % % <ul><li> `ok' </li><li> `no_possible_interleaving' </li>
607
+ % % <li> `{exception, Kind, Reason, StackTrace}' </li></ul> </li>
607
608
% % </ul>
608
609
609
610
-spec run_parallel_commands (mod_name (), parallel_testcase ()) ->
@@ -622,28 +623,42 @@ run_parallel_commands(Mod, {Sequential, Parallel}, Env) ->
622
623
case run (Mod , Sequential , Env ) of
623
624
{{Seq_history , State , ok }, SeqEnv } ->
624
625
F = fun (T ) -> execute (T , SeqEnv , Mod ) end ,
625
- Parallel_history = pmap (F , Parallel ),
626
+ case pmap (F , Parallel ) of
627
+ {ok , Parallel_history } ->
626
628
case check (Mod , State , SeqEnv , false , [], Parallel_history ) of
627
629
true ->
628
630
{Seq_history , Parallel_history , ok };
629
631
false ->
630
632
{Seq_history , Parallel_history , no_possible_interleaving }
631
633
end ;
634
+ {error , Exc , Parallel_history } ->
635
+ {Seq_history , Parallel_history , Exc }
636
+ end ;
632
637
{{Seq_history , _ , Res }, _ } ->
633
638
{Seq_history , [], Res }
634
639
end .
635
640
636
641
% % @private
637
642
-spec execute (command_list (), proper_symb :var_values (), mod_name ()) ->
638
- parallel_history ().
639
- execute ([], _Env , _Mod ) -> [];
640
- execute ([{set , {var ,V }, {call ,M ,F ,A }} = Cmd |Rest ], Env , Mod ) ->
643
+ {ok , parallel_history ()} | {error , any , parallel_history ()}.
644
+ execute (Cmds , Env , Mod ) -> execute (Cmds , Env , Mod , []).
645
+
646
+ -spec execute (command_list (), proper_symb :var_values (), mod_name (),
647
+ parallel_history ()) -> {ok , parallel_history ()} |
648
+ {error , proper :exception (), parallel_history ()}.
649
+ execute ([], _Env , _Mod , Hist ) -> {ok ,lists :reverse (Hist )};
650
+ execute ([{set , {var ,V }, {call ,M ,F ,A }} = Cmd |Rest ], Env , Mod , Hist ) ->
641
651
M2 = proper_symb :eval (Env , M ),
642
652
F2 = proper_symb :eval (Env , F ),
643
653
A2 = proper_symb :eval (Env , A ),
644
- Res = apply (M2 , F2 , A2 ),
654
+
655
+ case safe_apply (M2 , F2 , A2 ) of
656
+ {ok ,Res } ->
645
657
Env2 = [{V ,Res }|Env ],
646
- [{Cmd ,Res }|execute (Rest , Env2 , Mod )].
658
+ execute (Rest , Env2 , Mod , [{Cmd ,Res }|Hist ]);
659
+ {error , Exc } ->
660
+ {error , Exc , lists :reverse (Hist )}
661
+ end .
647
662
648
663
-spec pmap (fun ((command_list ()) -> parallel_history ()), [command_list ()]) ->
649
664
[parallel_history ()].
@@ -654,18 +669,28 @@ pmap(F, L) ->
654
669
[command_list ()]) -> [pid ()].
655
670
spawn_jobs (F , L ) ->
656
671
Parent = self (),
657
- [spawn_link_cp (fun () -> Parent ! {self (),catch {ok ,F (X )}} end ) || X <- L ].
658
-
659
- -spec await ([pid ()]) -> [parallel_history ()].
660
- await ([]) -> [];
661
- await ([H |T ]) ->
672
+ [spawn_link_cp (fun () -> Parent ! {self (), F (X )} end ) || X <- L ].
673
+
674
+ -spec await ([pid ()]) ->
675
+ {ok , [parallel_history ()]} |
676
+ {error , proper :exception (), [parallel_history ()]}.
677
+ await (Pids ) -> await (Pids , [], false ).
678
+
679
+ -spec await ([pid ()], [parallel_history ()], false | proper :exception ()) ->
680
+ {ok , [parallel_history ()]} |
681
+ {error , proper :exception (), [parallel_history ()]}.
682
+ await ([], Hist , false ) -> {ok , lists :reverse (Hist )};
683
+ await ([], Hist , Exc ) -> {error , Exc , lists :reverse (Hist )};
684
+ await ([H |T ], Hist , MaybeExc ) ->
662
685
receive
663
686
{H , {ok , Res }} ->
664
- [Res |await (T )];
665
- {H , {'EXIT' ,_ } = Err } ->
666
- _ = [exit (Pid , kill ) || Pid <- T ],
667
- _ = [receive {P ,_ } -> d_ after 0 -> i_ end || P <- T ],
668
- erlang :error (Err )
687
+ await (T , [Res |Hist ], MaybeExc );
688
+ {H , {error , Exc , Res }} ->
689
+ Exc2 = case MaybeExc of
690
+ false -> Exc ;
691
+ E -> E
692
+ end ,
693
+ await (T , [Res |Hist ], Exc2 )
669
694
end .
670
695
671
696
% % @private
0 commit comments