summaryrefslogtreecommitdiff
path: root/erts/emulator/test/literal_area_collector_test.erl
diff options
context:
space:
mode:
Diffstat (limited to 'erts/emulator/test/literal_area_collector_test.erl')
-rw-r--r--erts/emulator/test/literal_area_collector_test.erl101
1 files changed, 50 insertions, 51 deletions
diff --git a/erts/emulator/test/literal_area_collector_test.erl b/erts/emulator/test/literal_area_collector_test.erl
index fb66add44c..de999931eb 100644
--- a/erts/emulator/test/literal_area_collector_test.erl
+++ b/erts/emulator/test/literal_area_collector_test.erl
@@ -19,62 +19,61 @@
%%
-module(literal_area_collector_test).
--export([check_idle/1]).
+-export([check_idle/0, check_idle/1]).
+
+check_idle() ->
+ check_idle(5000).
check_idle(Timeout) when is_integer(Timeout) > 0 ->
+ ScaledTimeout = Timeout*test_server:timetrap_scale_factor(),
+ Pid = find_literal_area_collector(),
Start = erlang:monotonic_time(millisecond),
- LAC = find_lac(),
- wait_until(fun () ->
- case process_info(LAC, [status,
- current_function,
- current_stacktrace,
- message_queue_len]) of
- [{status,waiting},
- {current_function,
- {erts_literal_area_collector,msg_loop,4}},
- {current_stacktrace,
- [{erts_literal_area_collector,msg_loop,4,_}]},
- {message_queue_len,0}] ->
- true;
- CurrState ->
- Now = erlang:monotonic_time(millisecond),
- case Now - Start > Timeout of
- true ->
- exit({non_idle_literal_area_collecor,
- CurrState});
- false ->
- false
- end
- end
- end),
- ok.
-
-
-find_lac() ->
try
- lists:foreach(fun (P) ->
- case process_info(P, initial_call) of
- {initial_call,
- {erts_literal_area_collector,start,0}} ->
- throw({lac, P});
- _ ->
- ok
- end
- end, processes()),
- exit(no_literal_area_collector)
+ wait_for_idle_literal_collector(Pid, Start, ScaledTimeout, -1, 0)
catch
- throw:{lac, LAC} ->
- LAC
+ throw:done ->
+ ok
+ end.
+
+wait_for_idle_literal_collector(Pid, Start, Timeout, NWaiting, WRedsStart) ->
+ {W, R} = case process_info(Pid, [status, reductions]) of
+ [{status, waiting}, {reductions, Reds}] ->
+ %% Assume that reds aren't bumped more than
+ %% 2 in order to service this process info
+ %% request...
+ case {NWaiting > 100, Reds - WRedsStart =< 2*NWaiting} of
+ {true, true} ->
+ throw(done);
+ {false, true} ->
+ {NWaiting+1, WRedsStart};
+ _ ->
+ {0, Reds}
+ end;
+ _ ->
+ {-1, 0}
+ end,
+ Now = erlang:monotonic_time(millisecond),
+ if Now - Start > Timeout ->
+ error({busy_literal_area_collecor_timout, Timeout});
+ true ->
+ ok
+ end,
+ receive after 1 -> ok end,
+ wait_for_idle_literal_collector(Pid, Start, Timeout, W, R).
+
+find_literal_area_collector() ->
+ case get('__literal_area_collector__') of
+ Pid when is_pid(Pid) ->
+ Pid;
+ _ ->
+ find_save_literal_area_collector(processes()),
+ find_literal_area_collector()
end.
-
-wait_until(Fun) ->
- Res = try
- Fun()
- catch
- T:R -> {T,R}
- end,
- case Res of
- true -> ok;
- _ -> wait_until(Fun)
+find_save_literal_area_collector([P|Ps]) ->
+ case process_info(P, initial_call) of
+ {initial_call,{erts_literal_area_collector,start,0}} ->
+ put('__literal_area_collector__', P);
+ _ ->
+ find_save_literal_area_collector(Ps)
end.