summaryrefslogtreecommitdiff
path: root/src/rebar_utils.erl
diff options
context:
space:
mode:
authorFred Hebert <mononcqc@ferd.ca>2017-12-06 08:53:12 -0500
committerFred Hebert <mononcqc@ferd.ca>2017-12-06 08:53:12 -0500
commitf12871451f2c60bc35da053198ccc48d1b1db687 (patch)
tree0404d9c817ae3de555f1b1cc757d725af2beaf67 /src/rebar_utils.erl
parentd45bacb73bd1a255a5042929a49c81ab298df946 (diff)
Safer purge switch
Rather than the caller having to think of what to purge or not, use erlang:check_process_code/2 to detect if the caller (rebar3) may die because of the operation. If so, do a soft purge with a conditional delete instead of a hard purge with a mandatory delete.
Diffstat (limited to 'src/rebar_utils.erl')
-rw-r--r--src/rebar_utils.erl12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/rebar_utils.erl b/src/rebar_utils.erl
index 64d4952..b633760 100644
--- a/src/rebar_utils.erl
+++ b/src/rebar_utils.erl
@@ -49,7 +49,6 @@
update_code/1,
update_code/2,
remove_from_code_path/1,
- remove_from_code_path/2,
cleanup_code_path/1,
args_to_tasks/1,
expand_env_variable/3,
@@ -754,9 +753,6 @@ update_code(Paths, Opts) ->
end, Paths).
remove_from_code_path(Paths) ->
- remove_from_code_path(Paths, purge).
-
-remove_from_code_path(Paths, Type) when Type == purge; Type == soft_purge ->
lists:foreach(fun(Path) ->
Name = filename:basename(Path, "/ebin"),
App = list_to_atom(Name),
@@ -767,7 +763,13 @@ remove_from_code_path(Paths, Type) when Type == purge; Type == soft_purge ->
ok;
{ok, Modules} ->
application:unload(App),
- [begin code:Type(M), code:delete(M) end || M <- Modules]
+ [case erlang:check_process_code(self(), M) of
+ false ->
+ code:purge(M), code:delete(M);
+ _ ->
+ ?DEBUG("~p can't purge ~p safely, doing a soft purge", [self(), M]),
+ code:soft_purge(M) andalso code:delete(M)
+ end || M <- Modules]
end,
code:del_path(Path)
end, lists:usort(Paths)).