From: Badlop Date: Sat, 26 Nov 2011 16:03:24 +0000 (+0100) Subject: Avoid a possible race condition X-Git-Tag: v3.0.0-alpha-5~16 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f7076f49b6bf006ffb1abe9cbd7595a4a6b0aa46;p=ejabberd Avoid a possible race condition --- diff --git a/src/mod_ip_blacklist.erl b/src/mod_ip_blacklist.erl index eac61a766..718a25b1e 100644 --- a/src/mod_ip_blacklist.erl +++ b/src/mod_ip_blacklist.erl @@ -33,6 +33,7 @@ %% API: -export([start/2, + preinit/2, init/1, stop/1]). -export([update_bl_c2s/0]). @@ -49,14 +50,20 @@ -record(bl_c2s, {ip}). %% Start once for all vhost -start(Host, Opts) -> - case whereis(?PROCNAME) of - undefined -> - ?DEBUG("Starting mod_ip_blacklist ~p ~p~n", [Host, Opts]), - register(?PROCNAME, - spawn(?MODULE, init, [#state{}])); - _ -> - ok +start(_Host, _Opts) -> + Pid = spawn(?MODULE, preinit, [self(), #state{}]), + receive {ok, Pid, PreinitResult} -> + PreinitResult + end. + +preinit(Parent, State) -> + Pid = self(), + try register(?PROCNAME, Pid) of + true -> + Parent ! {ok, Pid, true}, + init(State) + catch error:_ -> + Parent ! {ok, Pid, true} end. %% TODO: