aboutsummaryrefslogtreecommitdiff
path: root/src/gen_mod.erl
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2005-05-23 00:30:29 +0000
committerAlexey Shchepin <alexey@process-one.net>2005-05-23 00:30:29 +0000
commit820c78484aba666685304fb7fb5af8d85ce56cac (patch)
tree6ac1e93d3598629d024e5e72511747af9af8cca9 /src/gen_mod.erl
parent* src/web/ejabberd_http.erl: "Connection:" header value now (diff)
* 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
Diffstat (limited to 'src/gen_mod.erl')
-rw-r--r--src/gen_mod.erl39
1 files changed, 38 insertions, 1 deletions
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