Skip to content

Commit 1daf130

Browse files
authored
Some cleanups in the parallel code (#275)
1 parent 6302ea0 commit 1daf130

File tree

1 file changed

+30
-44
lines changed

1 file changed

+30
-44
lines changed

src/proper.erl

+30-44
Original file line numberDiff line numberDiff line change
@@ -1440,9 +1440,10 @@ perform(NumTests, Test, Opts) ->
14401440
perform(Passed, NumTests, Test, Opts) ->
14411441
Size = size_at_nth_test(Passed, Opts),
14421442
put('$size', Size),
1443-
%% When working on parallelizing PropEr initially we used to hit too easily
1444-
%% the default maximum number of tries that PropEr had, so when running on parallel
1445-
%% it has a higher than usual max number of tries.The number was picked after testing locally
1443+
%% When working on parallelizing PropEr initially we used to hit
1444+
%% too easily the default maximum number of tries that PropEr had,
1445+
%% so when running on parallel it has a higher than usual max
1446+
%% number of tries. The number was picked after testing locally
14461447
%% with different values.
14471448
perform(Passed, NumTests, 3 * ?MAX_TRIES_FACTOR * NumTests, Test, none, none, Opts).
14481449

@@ -1597,14 +1598,12 @@ perform_search(Steps, NumSteps, TriesLeft, Target, DTest,
15971598
Error
15981599
end.
15991600

1600-
16011601
-spec add_samples([sample()], [sample()] | 'none') -> [sample()].
16021602
add_samples(MoreSamples, none) ->
16031603
MoreSamples;
16041604
add_samples(MoreSamples, Samples) ->
16051605
[M ++ S || {M, S} <- proper_arith:safe_zip(MoreSamples, Samples)].
16061606

1607-
16081607
%% Evaluated only for its side-effects.
16091608
-spec gen_and_print_samples(proper_types:raw_type(),
16101609
proper_gen:size(), proper_gen:size()) -> 'ok'.
@@ -2190,29 +2189,24 @@ apply_skip(Args, Prop) ->
21902189
%% Output functions
21912190
%%-----------------------------------------------------------------------------
21922191

2193-
-spec aggregate_imm_result(list(pid()), imm_result()) -> imm_result().
2192+
-spec aggregate_imm_result([pid()], imm_result()) -> imm_result().
21942193
aggregate_imm_result([], ImmResult) ->
21952194
ImmResult;
21962195
aggregate_imm_result(WorkerList, #pass{performed = Passed, samples = Samples} = ImmResult) ->
21972196
Id = get('$property_id'),
21982197
receive
21992198
%% if we haven't received anything yet we use the first pass we get
2200-
{worker_msg, #pass{} = Received, From, Id} when Passed == undefined ->
2199+
{worker_msg, #pass{} = Received, From, Id} when Passed =:= undefined ->
22012200
aggregate_imm_result(WorkerList -- [From], Received);
22022201
%% from that moment on, we accumulate the count of passed tests
2203-
{worker_msg, #pass{performed = PassedRcvd, samples = SamplesRcvd}, From, Id}
2204-
when Samples == [none] ->
2205-
NewImmResult = ImmResult#pass{performed = Passed + PassedRcvd,
2206-
samples = SamplesRcvd},
2207-
aggregate_imm_result(WorkerList -- [From], NewImmResult);
22082202
{worker_msg, #pass{performed = PassedRcvd, samples = SamplesRcvd}, From, Id} ->
22092203
NewImmResult = ImmResult#pass{performed = Passed + PassedRcvd,
22102204
samples = Samples ++ SamplesRcvd},
22112205
aggregate_imm_result(WorkerList -- [From], NewImmResult);
22122206
{worker_msg, #fail{performed = FailedOn} = Received, From, Id} ->
22132207
lists:foreach(fun(P) ->
2214-
P ! {worker_msg, {failed_test, self()}, Id} end,
2215-
WorkerList -- [From]),
2208+
P ! {worker_msg, {failed_test, self()}, Id}
2209+
end, WorkerList -- [From]),
22162210
Performed = lists:foldl(fun(Worker, Acc) ->
22172211
receive
22182212
{worker_msg, {performed, undefined, Id}} -> Acc;
@@ -2386,20 +2380,19 @@ default_strategy_fun() ->
23862380
1 -> 0;
23872381
_ -> 1
23882382
end,
2389-
Seq = lists:seq(1, NumWorkers),
2390-
lists:map(fun(X) ->
2391-
L2 = lists:seq(X - 1, NumTests - Decr, NumWorkers),
2392-
{_Start, _NumTests} = {hd(L2), lists:last(L2)}
2393-
end, Seq)
2383+
[begin
2384+
L2 = lists:seq(X - 1, NumTests - Decr, NumWorkers),
2385+
{hd(L2), lists:last(L2)} % {_Start, _NumTests}
2386+
end || X <- lists:seq(1, NumWorkers)]
23942387
end.
23952388

23962389
%% @private
2397-
-spec update_worker_node_ref({node(), {already_running, boolean()}}) -> list(node()).
2390+
-spec update_worker_node_ref({node(), {already_running, boolean()}}) -> [node()].
23982391
update_worker_node_ref(NodeName) ->
23992392
NewMap = case get(worker_nodes) of
2400-
undefined -> [NodeName];
2401-
Map -> [NodeName|Map]
2402-
end,
2393+
undefined -> [NodeName];
2394+
Map -> [NodeName|Map]
2395+
end,
24032396
put(worker_nodes, NewMap).
24042397

24052398
%% @private
@@ -2457,27 +2450,23 @@ maybe_load_binary(Nodes, Module) ->
24572450
%% @private
24582451
-spec ensure_code_loaded([node()]) -> 'ok'.
24592452
ensure_code_loaded(Nodes) ->
2460-
%% we get all the files that need to be loaded from the current directory
2453+
%% get all the files that need to be loaded from the current directory
24612454
Files = filelib:wildcard("**/*.beam"),
24622455
%% but we only care about the filename, without the .beam extension
2463-
Modules = [erlang:list_to_atom(filename:basename(File, ".beam")) || File <- Files],
2464-
2465-
%% call the functions needed to ensure that all modules are available on the nodes
2456+
Modules = [list_to_atom(filename:basename(File, ".beam")) || File <- Files],
2457+
%% ensure that all modules are available on the nodes
24662458
lists:foreach(fun(Module) -> maybe_load_binary(Nodes, Module) end, Modules),
2467-
lists:foreach(fun(P) -> rpc:multicall(Nodes, code, add_patha, [P]) end, code:get_path()),
2459+
lists:foreach(fun(P) -> rpc:multicall(Nodes, code, add_patha, [P]) end,
2460+
code:get_path()),
24682461
_ = rpc:multicall(Nodes, code, ensure_modules_loaded, [Modules]),
24692462
ok.
24702463

24712464
%% @private
24722465
%% @doc Starts multiple (NumNodes) remote nodes.
2473-
-spec start_nodes(non_neg_integer()) -> list(node()).
2466+
-spec start_nodes(non_neg_integer()) -> [node()].
24742467
start_nodes(NumNodes) ->
2475-
StartNodeFun =
2476-
fun(N) ->
2477-
SlaveName = list_to_atom("proper_slave_" ++ integer_to_list(N)),
2478-
_ = start_node(SlaveName)
2479-
end,
2480-
lists:map(StartNodeFun, lists:seq(1, NumNodes)).
2468+
[start_node(list_to_atom("proper_slave_" ++ integer_to_list(N)))
2469+
|| N <- lists:seq(1, NumNodes)].
24812470

24822471
%% @private
24832472
%% @doc Stops all the registered (started) nodes.
@@ -2486,23 +2475,20 @@ stop_nodes() ->
24862475
case get(worker_nodes) of
24872476
undefined -> ok;
24882477
Nodes ->
2489-
NodesToStop = lists:filter(fun({_N, {already_running, Bool}}) -> not Bool end, Nodes),
2490-
lists:foreach(fun({Node, _}) -> slave:stop(Node) end, NodesToStop),
2478+
StopFun = fun({Node, {already_running, false}}) -> slave:stop(Node);
2479+
({_Node, {already_running, true}}) -> ok
2480+
end,
2481+
lists:foreach(StopFun, Nodes),
24912482
_ = net_kernel:stop(),
24922483
erase(worker_nodes),
24932484
ok
24942485
end.
24952486

24962487
%% @private
24972488
%% @doc Unlinks and kills all the workers.
2498-
-spec kill_workers(list(pid())) -> ok.
2489+
-spec kill_workers([pid()]) -> ok.
24992490
kill_workers(WorkerList) ->
2500-
UnlinkAndKill =
2501-
fun(P) ->
2502-
unlink(P),
2503-
exit(P, kill)
2504-
end,
2505-
lists:foreach(UnlinkAndKill, WorkerList).
2491+
lists:foreach(fun(P) -> unlink(P), exit(P, kill) end, WorkerList).
25062492

25072493
%%-----------------------------------------------------------------------------
25082494
%% Stats printing functions

0 commit comments

Comments
 (0)