From fef8a18bfb8c3a09395d91fdab97985ed6cd97e6 Mon Sep 17 00:00:00 2001 From: Thales Macedo Garitezi Date: Fri, 17 Dec 2021 16:31:04 -0300 Subject: [PATCH] chore(update_appup): insert `load_module`s after `application:stop` If there is already any `application:stop(Application)` call in the appup instructions, we prefer to add `load_module` instructions after it, so we can be sure that the load is replaced safely. --- scripts/update_appup.escript | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/scripts/update_appup.escript b/scripts/update_appup.escript index 530f15072..efd98b046 100755 --- a/scripts/update_appup.escript +++ b/scripts/update_appup.escript @@ -298,8 +298,11 @@ do_merge_update_actions(App, Vsn, {New0, Changed0, Deleted0}, OldActions) -> Reloads = [{load_module, M, brutal_purge, soft_purge, []} || not contains_restart_application(App, OldActions), M <- Changed ++ New], - Reloads ++ - OldActions ++ + {OldActionsWithStop, OldActionsAfterStop} = + find_application_stop_instruction(App, OldActions), + OldActionsWithStop ++ + Reloads ++ + OldActionsAfterStop ++ [{delete_module, M} || M <- Deleted] ++ AppSpecific. @@ -308,6 +311,23 @@ do_merge_update_actions(App, Vsn, {New0, Changed0, Deleted0}, OldActions) -> contains_restart_application(Application, Actions) -> lists:member({restart_application, Application}, Actions). +%% If there is an `application:stop(Application)' call in the +%% instructions, we insert `load_module' instructions after it. +find_application_stop_instruction(Application, Actions) -> + {Before, After0} = + lists:splitwith( + fun({apply, {application, stop, [Application]}}) -> + false; + (_) -> + true + end, Actions), + case After0 of + [StopInst | After] -> + {Before ++ [StopInst], After}; + [] -> + {[], Before} + end. + %% @doc Process the existing actions to exclude modules that are %% already handled process_old_action({purge, Modules}) ->