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_internal.erl | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'erts/preloaded/src/erts_internal.erl') diff --git a/erts/preloaded/src/erts_internal.erl b/erts/preloaded/src/erts_internal.erl index 426749264f..6e649e8395 100644 --- a/erts/preloaded/src/erts_internal.erl +++ b/erts/preloaded/src/erts_internal.erl @@ -38,6 +38,7 @@ -export([request_system_task/3]). -export([check_process_code/2]). +-export([purge_module/1]). -export([flush_monitor_messages/3]). @@ -204,6 +205,11 @@ request_system_task(_Pid, _Prio, _Request) -> check_process_code(_Module, _OptionList) -> erlang:nif_error(undefined). +-spec purge_module(Module) -> boolean() when + Module :: module(). +purge_module(_Module) -> + erlang:nif_error(undefined). + %% term compare where integer() < float() = true -spec cmp_term(A,B) -> Result when -- cgit v1.2.3