diff options
author | Björn Gustavsson <[email protected]> | 2011-08-26 11:40:33 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2011-08-26 11:40:33 +0200 |
commit | 67f89ecba0ef3a1f707c6c3b40d32605b7e2b352 (patch) | |
tree | 659895bb3f9d5947646c0305e516fdb04aaa53f5 /lib/kernel/src | |
parent | d48eaa0731017e5cdadca0af77ac14cd949b6c67 (diff) | |
parent | 4275ca6ecfa35554416bdb517999642b242e9776 (diff) | |
download | otp-67f89ecba0ef3a1f707c6c3b40d32605b7e2b352.tar.gz otp-67f89ecba0ef3a1f707c6c3b40d32605b7e2b352.tar.bz2 otp-67f89ecba0ef3a1f707c6c3b40d32605b7e2b352.zip |
Merge branch 'bjorn/erts/old-code-checking-improvements/OTP-9495' into dev
* bjorn/erts/old-code-checking-improvements/OTP-9495:
code: Optimize purge/1 and soft_purge/1 using check_old_code/1
Add erlang:check_old_code/1
check_process_code/2: Quickly return 'false' if there is no old code
Diffstat (limited to 'lib/kernel/src')
-rw-r--r-- | lib/kernel/src/code_server.erl | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/lib/kernel/src/code_server.erl b/lib/kernel/src/code_server.erl index 4a1fc7df34..85bbff9cc3 100644 --- a/lib/kernel/src/code_server.erl +++ b/lib/kernel/src/code_server.erl @@ -1379,8 +1379,12 @@ absname_vr([[X, $:]|Name], _, _AbsBase) -> %% Kill all processes running code from *old* Module, and then purge the %% module. Return true if any processes killed, else false. -do_purge(Mod) -> - do_purge(processes(), to_atom(Mod), false). +do_purge(Mod0) -> + Mod = to_atom(Mod0), + case erlang:check_old_code(Mod) of + false -> false; + true -> do_purge(processes(), Mod, false) + end. do_purge([P|Ps], Mod, Purged) -> case erlang:check_process_code(P, Mod) of @@ -1399,16 +1403,19 @@ do_purge([], Mod, Purged) -> Purged. %% do_soft_purge(Module) -%% Purge old code only if no procs remain that run old code +%% Purge old code only if no procs remain that run old code. %% Return true in that case, false if procs remain (in this %% case old code is not purged) do_soft_purge(Mod) -> - catch do_soft_purge(processes(), Mod). + case erlang:check_old_code(Mod) of + false -> true; + true -> do_soft_purge(processes(), Mod) + end. do_soft_purge([P|Ps], Mod) -> case erlang:check_process_code(P, Mod) of - true -> throw(false); + true -> false; false -> do_soft_purge(Ps, Mod) end; do_soft_purge([], Mod) -> |