]> granicus.if.org Git - ejabberd/commitdiff
* src/ejabberd_app.erl (prep_stop): Stop modules when stopping
authorBadlop <badlop@process-one.net>
Thu, 28 Feb 2008 00:30:23 +0000 (00:30 +0000)
committerBadlop <badlop@process-one.net>
Thu, 28 Feb 2008 00:30:23 +0000 (00:30 +0000)
ejabberd (EJAB-536)
* src/mod_caps.erl (stop): Probably not needed to stop supervisor
child (EJAB-536)
* src/mod_muc/mod_muc.erl (room_destroyed): Catch message
sending (EJAB-536)
* src/mod_muc/mod_muc_room.erl (init): Ensure rooms are called
when the process dies due to a linked die (EJAB-536)

SVN Revision: 1212

ChangeLog
src/ejabberd_app.erl
src/mod_caps.erl
src/mod_muc/mod_muc.erl
src/mod_muc/mod_muc_room.erl

index dd6343a5dbf0dccc07c6fe7723b9955b49ca01fa..9d210be619dbd55f9bd633d79330107b50af2c5f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2008-02-28  Badlop  <badlop@process-one.net>
+
+       * src/ejabberd_app.erl (prep_stop): Stop modules when stopping
+       ejabberd (EJAB-536)
+       * src/mod_caps.erl (stop): Probably not needed to stop supervisor
+       child (EJAB-536)
+       * src/mod_muc/mod_muc.erl (room_destroyed): Catch message
+       sending (EJAB-536)
+       * src/mod_muc/mod_muc_room.erl (init): Ensure rooms are called
+       when the process dies due to a linked die (EJAB-536)
+
 2008-02-27  Mickael Remond <mremond@process-one.net>
 
        * src/ejabberd_check.erl: Separate config loading from
index d400336e2e7d2073570e2d6b62ec49ca3eb414a0..4c12069d1cd9b83a054f6f4e99154ba04f199c1d 100644 (file)
@@ -1,7 +1,7 @@
 %%%----------------------------------------------------------------------
 %%% File    : ejabberd_app.erl
 %%% Author  : Alexey Shchepin <alexey@process-one.net>
-%%% Purpose : ejabberd OTP application definition.
+%%% Purpose : ejabberd's application callback module
 %%% Created : 31 Jan 2003 by Alexey Shchepin <alexey@process-one.net>
 %%%
 %%%
 
 -behaviour(application).
 
--export([start/2, stop/1, init/0]).
+-export([start/2, prep_stop/1, stop/1, init/0]).
 
 -include("ejabberd.hrl").
 
+
+%%%
+%%% Application API
+%%%
+
 start(normal, _Args) ->
     ejabberd_loglevel:set(4),
     application:start(sasl),
@@ -57,14 +62,27 @@ start(normal, _Args) ->
     %eprof:start(),
     %eprof:profile([self()]),
     %fprof:trace(start, "/tmp/fprof"),
-    load_modules(),
+    start_modules(),
     Sup;
 start(_, _) ->
     {error, badarg}.
 
-stop(_StartArgs) ->
+%% Prepare the application for termination.
+%% This function is called when an application is about to be stopped, 
+%% before shutting down the processes of the application.
+prep_stop(State) ->
+    stop_modules(),
+    State.
+
+%% All the processes were killed when this function is called
+stop(_State) ->
     ok.
 
+
+%%%
+%%% Internal functions
+%%%
+
 start() ->
     spawn_link(?MODULE, init, []).
 
@@ -110,7 +128,8 @@ db_init() ->
     mnesia:start(),
     mnesia:wait_for_tables(mnesia:system_info(local_tables), infinity).
 
-load_modules() ->
+%% Start all the modules in all the hosts
+start_modules() ->
     lists:foreach(
       fun(Host) ->
              case ejabberd_config:get_local_option({modules, Host}) of
@@ -124,6 +143,21 @@ load_modules() ->
              end
       end, ?MYHOSTS).
 
+%% Stop all the modules in all the hosts
+stop_modules() ->
+    lists:foreach(
+      fun(Host) ->
+             case ejabberd_config:get_local_option({modules, Host}) of
+                 undefined ->
+                     ok;
+                 Modules ->
+                     lists:foreach(
+                       fun({Module, _Args}) ->
+                               gen_mod:stop_module(Host, Module)
+                       end, Modules)
+             end
+      end, ?MYHOSTS).
+
 connect_nodes() ->
     case ejabberd_config:get_local_option(cluster_nodes) of
        undefined ->
@@ -134,5 +168,3 @@ connect_nodes() ->
                          end, Nodes)
     end.
 
-
-
index 3734982ebd53eba530a305f6b3bb588a2b1356ef..a337832f08d37e1c508be3adeba582990dc014cc 100644 (file)
@@ -127,8 +127,7 @@ start(Host, Opts) ->
 
 stop(Host) ->
     Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
-    gen_server:call(Proc, stop),
-    supervisor:stop_child(ejabberd_sup, Proc).
+    gen_server:call(Proc, stop).
 
 %%====================================================================
 %% gen_server callbacks
index 58ce97bb45e8d09c6d83f339abf35277e9ef35b5..90a74b70f66c67b6f9970d4dcb0ad396284af975 100644 (file)
@@ -91,8 +91,14 @@ stop(Host) ->
     gen_server:call(Proc, stop),
     supervisor:delete_child(ejabberd_sup, Proc).
 
+%% This function is called by a room in three situations:
+%% A) The owner of the room destroyed it
+%% B) The only participant of a temporary room leaves it
+%% C) mod_muc:stop was called, and each room is being terminated
+%%    In this case, the mod_muc process died before the room processes
+%%    So the message sending must be catched
 room_destroyed(Host, Room, Pid, ServerHost) ->
-    gen_mod:get_module_proc(ServerHost, ?PROCNAME) !
+    catch gen_mod:get_module_proc(ServerHost, ?PROCNAME) !
        {room_destroyed, {Room, Host}, Pid},
     ok.
 
index 1d40736a7363c6bc0a90e491e1cc21dfaead909f..30a9fa2580b0be1c83f8eb63a51b1b6aaf935ad1 100644 (file)
@@ -167,6 +167,7 @@ start_link(Host, ServerHost, Access, Room, HistorySize, RoomShaper, Opts) ->
 %%          {stop, StopReason}
 %%----------------------------------------------------------------------
 init([Host, ServerHost, Access, Room, HistorySize, RoomShaper, Creator, _Nick, DefRoomOpts]) ->
+    process_flag(trap_exit, true),
     Shaper = shaper:new(RoomShaper),
     State = set_affiliation(Creator, owner,
                            #state{host = Host,
@@ -182,6 +183,7 @@ init([Host, ServerHost, Access, Room, HistorySize, RoomShaper, Creator, _Nick, D
              [Room, Host, jlib:jid_to_string(Creator)]),
     {ok, normal_state, State1};
 init([Host, ServerHost, Access, Room, HistorySize, RoomShaper, Opts]) ->
+    process_flag(trap_exit, true),
     Shaper = shaper:new(RoomShaper),
     State = set_opts(Opts, #state{host = Host,
                                  server_host = ServerHost,