From fa44f865c3fc6253cf4691cf94839c303a3ee40f Mon Sep 17 00:00:00 2001 From: Sverker Eriksson Date: Tue, 15 Dec 2015 20:32:39 +0100 Subject: erts: Make erlang:purge_module/1 safe Problem: erlang:purge_module/1 is not safe in the sense that very bad things may happen if the code to be purged is still referred to by live processes. Introduce erts_internal:purge_module which is the same as the old erlang:purge_module BIF (except it returns false if no such old module). Implement erlang:purge_module in Erlang and let it invoke erts_code_purger for safe purging where all clogging processes first are killed. --- erts/preloaded/src/erts_code_purger.erl | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) (limited to 'erts/preloaded/src/erts_code_purger.erl') diff --git a/erts/preloaded/src/erts_code_purger.erl b/erts/preloaded/src/erts_code_purger.erl index 6bb6e4fcdc..880c86aad1 100644 --- a/erts/preloaded/src/erts_code_purger.erl +++ b/erts/preloaded/src/erts_code_purger.erl @@ -70,12 +70,8 @@ do_purge(Mod) -> true = erlang:copy_literals(Mod, true), DidKill = check_proc_code(erlang:processes(), Mod, true), true = erlang:copy_literals(Mod, false), - try - erlang:purge_module(Mod) - catch - _:_ -> ignore - end, - {true, DidKill} + WasPurged = erts_internal:purge_module(Mod), + {WasPurged, DidKill} end. %% soft_purge(Module) @@ -104,11 +100,7 @@ do_soft_purge(Mod) -> false; true -> true = erlang:copy_literals(Mod, false), - try - erlang:purge_module(Mod) - catch - _:_ -> ignore - end, + erts_internal:purge_module(Mod), true end end. -- cgit v1.2.3