summaryrefslogtreecommitdiff
path: root/erts/emulator/test/literal_area_collector_test.erl
diff options
context:
space:
mode:
authorRickard Green <rickard@erlang.org>2019-11-06 12:16:33 +0100
committerRickard Green <rickard@erlang.org>2019-11-06 12:16:33 +0100
commit169dd58ed870997923f04242aef3a2e52df346b3 (patch)
treed830234fab8fa80785a0cd20168fbe9f758c844d /erts/emulator/test/literal_area_collector_test.erl
parent1d1ee8f87ae2b651dbb2502fc19577a6a3a6f34b (diff)
parent4a59ebeb43184fb9dcdb3d2b4aeb454a2caed700 (diff)
downloaderlang-169dd58ed870997923f04242aef3a2e52df346b3.tar.gz
Merge branch 'rickard/proc-exit-lit-area-20/OTP-16193' into rickard/proc-exit-lit-area-20-patch/OTP-16193
* rickard/proc-exit-lit-area-20/OTP-16193: Fix release of literal areas
Diffstat (limited to 'erts/emulator/test/literal_area_collector_test.erl')
-rw-r--r--erts/emulator/test/literal_area_collector_test.erl80
1 files changed, 80 insertions, 0 deletions
diff --git a/erts/emulator/test/literal_area_collector_test.erl b/erts/emulator/test/literal_area_collector_test.erl
new file mode 100644
index 0000000000..fb66add44c
--- /dev/null
+++ b/erts/emulator/test/literal_area_collector_test.erl
@@ -0,0 +1,80 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2019. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(literal_area_collector_test).
+
+-export([check_idle/1]).
+
+check_idle(Timeout) when is_integer(Timeout) > 0 ->
+ 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)
+ catch
+ throw:{lac, LAC} ->
+ LAC
+ end.
+
+
+wait_until(Fun) ->
+ Res = try
+ Fun()
+ catch
+ T:R -> {T,R}
+ end,
+ case Res of
+ true -> ok;
+ _ -> wait_until(Fun)
+ end.