diff options
author | Rickard Green <[email protected]> | 2013-12-07 00:19:05 +0100 |
---|---|---|
committer | Rickard Green <[email protected]> | 2013-12-07 00:19:05 +0100 |
commit | 9232f50d4cbe7b051dfd3e83625de0b22536c4c4 (patch) | |
tree | f3c52ccc719a9df7a0714de05e2d1e9dde700df0 /erts/emulator/test/code_parallel_load_SUITE.erl | |
parent | 3c00452a81dfde57f85c882029186cfa3c0d348d (diff) | |
parent | 9f1f0bff7f98d62f8406e5ecd76f6eb7c1a66ff3 (diff) | |
download | otp-9232f50d4cbe7b051dfd3e83625de0b22536c4c4.tar.gz otp-9232f50d4cbe7b051dfd3e83625de0b22536c4c4.tar.bz2 otp-9232f50d4cbe7b051dfd3e83625de0b22536c4c4.zip |
Merge branch 'rickard/garbage_collect/OTP-11388'
* rickard/garbage_collect/OTP-11388:
Parallel check_process_code when code_server purge a module
Functionality for disabling garbage collection
Use asynchronous check_process_code in code_parallel_SUITE
Execution of system tasks in context of another process
Conflicts:
bootstrap/lib/kernel/ebin/hipe_unified_loader.beam
erts/preloaded/ebin/erlang.beam
erts/preloaded/ebin/erts_internal.beam
Diffstat (limited to 'erts/emulator/test/code_parallel_load_SUITE.erl')
-rw-r--r-- | erts/emulator/test/code_parallel_load_SUITE.erl | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/erts/emulator/test/code_parallel_load_SUITE.erl b/erts/emulator/test/code_parallel_load_SUITE.erl index 1cfe015ea6..428f1242ab 100644 --- a/erts/emulator/test/code_parallel_load_SUITE.erl +++ b/erts/emulator/test/code_parallel_load_SUITE.erl @@ -159,22 +159,34 @@ setup_checkers(_,0) -> []; setup_checkers(T,N) -> [spawn_link(fun() -> ?model:check(T) end) | setup_checkers(T, N-1)]. check_and_purge_processes_code(Pids, M) -> - check_and_purge_processes_code(Pids, M, []). -check_and_purge_processes_code([], M, []) -> + Tag = make_ref(), + N = request_cpc(Pids, M, Tag), + ok = handle_cpc_responses(N, Tag, M), erlang:purge_module(M), + ok. + +request_cpc(Pid, M, Tag) when is_pid(Pid) -> + erlang:check_process_code(Pid, M, [{async, {Tag, Pid}}]), + 1; +request_cpc(Pids, M, Tag) when is_list(Pids) -> + request_cpc(Pids, M, Tag, 0). + +request_cpc([], _M, _Tag, N) -> + N; +request_cpc([Pid|Pids], M, Tag, N) -> + request_cpc(Pids, M, Tag, N + request_cpc(Pid, M, Tag)). + +handle_cpc_responses(0, _Tag, _Module) -> ok; -check_and_purge_processes_code([], M, Pending) -> - io:format("Processes ~w are still executing old code - retrying.~n", [Pending]), - check_and_purge_processes_code(Pending, M, []); -check_and_purge_processes_code([Pid|Pids], M, Pending) -> - case erlang:check_process_code(Pid, M) of - false -> - check_and_purge_processes_code(Pids, M, Pending); - true -> - check_and_purge_processes_code(Pids, M, [Pid|Pending]) +handle_cpc_responses(N, Tag, Module) -> + receive + {check_process_code, {Tag, _Pid}, false} -> + handle_cpc_responses(N-1, Tag, Module); + {check_process_code, {Tag, Pid}, true} -> + 1 = request_cpc(Pid, Module, Tag), + handle_cpc_responses(N, Tag, Module) end. - generate(Module, Attributes, FunStrings) -> FunForms = function_forms(FunStrings), Forms = [ |