aboutsummaryrefslogtreecommitdiff
path: root/src/gen_iq_handler.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/gen_iq_handler.erl')
-rw-r--r--src/gen_iq_handler.erl18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/gen_iq_handler.erl b/src/gen_iq_handler.erl
index f0c77f78c..63f4e357c 100644
--- a/src/gen_iq_handler.erl
+++ b/src/gen_iq_handler.erl
@@ -49,6 +49,17 @@ add_iq_handler(Component, Host, NS, Module, Function, Type) ->
[Host, Module, Function]),
Component:register_iq_handler(Host, NS, Module, Function,
{one_queue, Pid});
+ {queues, N} ->
+ Pids =
+ lists:map(
+ fun(_) ->
+ {ok, Pid} = supervisor:start_child(
+ ejabberd_iq_sup,
+ [Host, Module, Function]),
+ Pid
+ end, lists:seq(1, N)),
+ Component:register_iq_handler(Host, NS, Module, Function,
+ {queues, Pids});
parallel ->
Component:register_iq_handler(Host, NS, Module, Function, parallel)
end.
@@ -60,6 +71,10 @@ stop_iq_handler(_Module, _Function, Opts) ->
case Opts of
{one_queue, Pid} ->
gen_server:call(Pid, stop);
+ {queues, Pids} ->
+ lists:foreach(fun(Pid) ->
+ catch gen_server:call(Pid, stop)
+ end, Pids);
_ ->
ok
end.
@@ -70,6 +85,9 @@ handle(Host, Module, Function, Opts, From, To, IQ) ->
process_iq(Host, Module, Function, From, To, IQ);
{one_queue, Pid} ->
Pid ! {process_iq, From, To, IQ};
+ {queues, Pids} ->
+ Pid = lists:nth(erlang:phash(now(), length(Pids)), Pids),
+ Pid ! {process_iq, From, To, IQ};
parallel ->
spawn(?MODULE, process_iq, [Host, Module, Function, From, To, IQ]);
_ ->