Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:19
erlang
2107-Add-module_status-0-and-make-module_status...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 2107-Add-module_status-0-and-make-module_status-1-accept-.patch of Package erlang
From fe9b29382853e31c930f1442afd6e514dca12345 Mon Sep 17 00:00:00 2001 From: Richard Carlsson <richardc@klarna.com> Date: Mon, 10 Jun 2019 12:04:52 +0200 Subject: [PATCH] Add module_status/0 and make module_status/1 accept a list of modules This allows checking the statuses of a large number of modules without performing an excessive amount of file system operations. --- lib/kernel/doc/src/code.xml | 17 +++++++++++++++-- lib/kernel/src/code.erl | 19 +++++++++++++++---- lib/kernel/test/code_SUITE.erl | 10 ++++++++++ 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/lib/kernel/doc/src/code.xml b/lib/kernel/doc/src/code.xml index 4aa9e8b9d2..268eb5e839 100644 --- a/lib/kernel/doc/src/code.xml +++ b/lib/kernel/doc/src/code.xml @@ -314,6 +314,9 @@ zip:create("mnesia-4.4.7.ez", <datatype> <name name="load_error_rsn"/> </datatype> + <datatype> + <name name="module_status"/> + </datatype> <datatype> <name name="prepared_code"/> <desc><p>An opaque term holding prepared code.</p></desc> @@ -900,11 +903,21 @@ rpc:call(Node, code, load_binary, [Module, Filename, Binary]), identical names and writes a report to <c>stdout</c>.</p> </desc> </func> + <func> + <name name="module_status" arity="0"/> + <fsummary>Return the statuses of all loaded modules.</fsummary> + <type name="module_status"/> + <desc> + <p>See <seealso marker="#module_status/1"><c>module_status/1</c></seealso> and <seealso marker="#all_loaded/0"><c>all_loaded/0</c></seealso> for details.</p> + </desc> + </func> <func> <name name="module_status" arity="1"/> - <fsummary>Return the status of the module in relation to object file on disk.</fsummary> + <fsummary>Return the status of a module or modules in relation to the + object files on disk.</fsummary> + <type name="module_status"/> <desc> - <p>Returns:</p> + <p>The status of a module can be one of:</p> <taglist> <tag><c>not_loaded</c></tag> <item><p>If <c><anno>Module</anno></c> is not currently loaded.</p></item> diff --git a/lib/kernel/src/code.erl b/lib/kernel/src/code.erl index 964ede9bc9..f8893ede36 100644 --- a/lib/kernel/src/code.erl +++ b/lib/kernel/src/code.erl @@ -72,6 +72,7 @@ where_is_file/2, set_primary_archive/4, clash/0, + module_status/0, module_status/1, modified_modules/0, get_mode/0]). @@ -80,6 +81,7 @@ -export_type([load_error_rsn/0, load_ret/0]). -export_type([prepared_code/0]). +-export_type([module_status/0]). -include_lib("kernel/include/file.hrl"). @@ -915,8 +917,19 @@ load_all_native_1([{Mod,BeamFilename}|T], ChunkTag) -> load_all_native_1([], _) -> ok. +-type module_status() :: not_loaded | loaded | modified | removed. + +%% Returns the list of all loaded modules and their current status +-spec module_status() -> [{module(), module_status()}]. +module_status() -> + module_status([M || {M, _} <- all_loaded()]). + %% Returns the status of the module in relation to object file on disk. --spec module_status(Module :: module()) -> not_loaded | loaded | modified | removed. +-spec module_status (Module :: module() | [module()]) -> + module_status() | [{module(), module_status()}]. +module_status(Modules) when is_list(Modules) -> + PathFiles = path_files(), + [{M, module_status(M, PathFiles)} || M <- Modules]; module_status(Module) -> module_status(Module, code:get_path()). @@ -991,9 +1004,7 @@ get_beam_chunk(Path, Chunk) -> %% Returns a list of all modules modified on disk. -spec modified_modules() -> [module()]. modified_modules() -> - PathFiles = path_files(), - [M || {M, _} <- code:all_loaded(), - module_status(M, PathFiles) =:= modified]. + [M || {M, modified} <- module_status()]. %% prefetch the directory contents of code path directories path_files() -> diff --git a/lib/kernel/test/code_SUITE.erl b/lib/kernel/test/code_SUITE.erl index 6b133f8d6b..665f9061d7 100644 --- a/lib/kernel/test/code_SUITE.erl +++ b/lib/kernel/test/code_SUITE.erl @@ -1880,6 +1880,11 @@ module_status() -> loaded = code:module_status(erlang), % preloaded loaded = code:module_status(?MODULE), % normal known loaded + %% module_status/0 returns status for each loaded module + true = (lists:sort([{M, code:module_status(M)} + || {M, _} <- code:all_loaded()]) + =:= lists:sort(code:module_status())), + non_existing = code:which(?TESTMOD), % verify dummy name not in path code:purge(?TESTMOD), % ensure no previous version in memory code:delete(?TESTMOD), @@ -1892,6 +1897,11 @@ module_status() -> "" = code:which(?TESTMOD), % verify empty string for source file loaded = code:module_status(?TESTMOD), + %% module_status/1 also accepts a list of modules + [] = code:module_status([]), + [{erlang, loaded},{?MODULE,loaded},{?TESTMOD,loaded}] = + code:module_status([erlang, ?MODULE, ?TESTMOD]), + %% deleting generated code true = code:delete(?TESTMOD), non_existing = code:which(?TESTMOD), % verify still not in path -- 2.16.4
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor