From 820c78484aba666685304fb7fb5af8d85ce56cac Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Mon, 23 May 2005 00:30:29 +0000 Subject: * src/web/ejabberd_web_admin.erl: Updated CSS, added modules management (thanks to Sergei Golovan) * src/gen_mod.erl: Added function loaded_modules_with_opts/0, new API for module stopping (thanks to Sergei Golovan) * src/mod_muc/mod_muc.erl: Moved a process name to a macros, updated module stopping (thanks to Sergei Golovan) * src/mod_irc/mod_irc.erl: Likewise * src/mod_pubsub/mod_pubsub.erl: Likewise * src/mod_announce.erl: Updated module stopping (thanks to Sergei Golovan) * src/mod_echo.erl: Likewise * src/mod_offline.erl: Likewise SVN Revision: 354 --- src/gen_mod.erl | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) (limited to 'src/gen_mod.erl') diff --git a/src/gen_mod.erl b/src/gen_mod.erl index 205c843c8..768869d52 100644 --- a/src/gen_mod.erl +++ b/src/gen_mod.erl @@ -17,6 +17,7 @@ get_opt/3, get_module_opt/3, loaded_modules/0, + loaded_modules_with_opts/0, get_hosts/2]). -export([behaviour_info/1]). @@ -52,11 +53,39 @@ stop_module(Module) -> case catch Module:stop() of {'EXIT', Reason} -> ?ERROR_MSG("~p", [Reason]); + {wait, ProcList} when is_list(ProcList) -> + lists:foreach(fun wait_for_process/1, ProcList), + ets:delete(ejabberd_modules, Module), + ok; + {wait, Process} -> + wait_for_process(Process), + ets:delete(ejabberd_modules, Module), + ok; _ -> ets:delete(ejabberd_modules, Module), ok end. +wait_for_process(Process) -> + MonitorReference = erlang:monitor(process, Process), + wait_for_stop(Process, MonitorReference). + +wait_for_stop(Process, MonitorReference) -> + receive + {'DOWN', MonitorReference, _Type, _Object, _Info} -> + ok + after 5000 -> + catch exit(whereis(Process), kill), + wait_for_stop1(MonitorReference) + end. + +wait_for_stop1(MonitorReference) -> + receive + {'DOWN', MonitorReference, _Type, _Object, _Info} -> + ok + after 5000 -> + ok + end. get_opt(Opt, Opts) -> case lists:keysearch(Opt, 1, Opts) of @@ -86,7 +115,15 @@ get_module_opt(Module, Opt, Default) -> loaded_modules() -> ets:select(ejabberd_modules, - [{#ejabberd_module{_ = '_', module = '$1'}, [],['$1']}]). + [{#ejabberd_module{_ = '_', module = '$1'}, + [], + ['$1']}]). + +loaded_modules_with_opts() -> + ets:select(ejabberd_modules, + [{#ejabberd_module{_ = '_', module = '$1', opts = '$2'}, + [], + [{{'$1', '$2'}}]}]). get_hosts(Opts, Prefix) -> case catch gen_mod:get_opt(hosts, Opts) of -- cgit v1.2.3