From 66ca65733a7a3314bbb2fd56d5b66a56ec53b8db Mon Sep 17 00:00:00 2001 From: Feng Date: Fri, 23 Sep 2016 15:29:12 +0800 Subject: [PATCH 1/2] emqttd:run_hooks/2, emqttd_hook:run/2 --- src/emqttd.erl | 6 +++++- src/emqttd_hook.erl | 20 ++++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/emqttd.erl b/src/emqttd.erl index 9c5d652a9..07464ee56 100644 --- a/src/emqttd.erl +++ b/src/emqttd.erl @@ -33,7 +33,7 @@ is_subscribed/2, subscriber_down/1]). %% Hooks API --export([hook/4, hook/3, unhook/2, run_hooks/3]). +-export([hook/4, hook/3, unhook/2, run_hooks/2, run_hooks/3]). %% Debug API -export([dump/0]). @@ -151,6 +151,10 @@ hook(Hook, Function, InitArgs, Priority) -> unhook(Hook, Function) -> emqttd_hook:delete(Hook, Function). +-spec(run_hooks(atom(), list(any())) -> ok | stop). +run_hooks(Hook, Args) -> + emqttd_hook:run(Hook, Args). + -spec(run_hooks(atom(), list(any()), any()) -> {ok | stop, any()}). run_hooks(Hook, Args, Acc) -> emqttd_hook:run(Hook, Args, Acc). diff --git a/src/emqttd_hook.erl b/src/emqttd_hook.erl index f183c98d3..675698688 100644 --- a/src/emqttd_hook.erl +++ b/src/emqttd_hook.erl @@ -24,7 +24,7 @@ -export([start_link/0]). %% Hooks API --export([add/3, add/4, delete/2, run/3, lookup/1]). +-export([add/3, add/4, delete/2, run/2, run/3, lookup/1]). %% gen_server Function Exports -export([init/1, handle_call/3, handle_cast/2, handle_info/2, @@ -63,10 +63,26 @@ add(HookPoint, Function, InitArgs, Priority) -> delete(HookPoint, Function) -> gen_server:call(?MODULE, {delete, HookPoint, Function}). --spec(run(atom(), list(any()), any()) -> any()). +%% @doc Run hooks without Acc. +-spec(run(atom(), list(Arg :: any())) -> ok | stop). +run(HookPoint, Args) -> + run_(lookup(HookPoint), Args). + +-spec(run(atom(), list(Arg :: any()), any()) -> any()). run(HookPoint, Args, Acc) -> run_(lookup(HookPoint), Args, Acc). +%% @private +run_([#callback{function = Fun, init_args = InitArgs} | Callbacks], Args) -> + case apply(Fun, lists:append([Args, InitArgs])) of + ok -> run_(Callbacks, Args); + stop -> stop; + _Any -> run_(Callbacks, Args) + end; + +run_([], _Args) -> + ok. + %% @private run_([#callback{function = Fun, init_args = InitArgs} | Callbacks], Args, Acc) -> case apply(Fun, lists:append([Args, [Acc], InitArgs])) of From 0063895706cdfbc8923a1e7f3edf87c5894623b3 Mon Sep 17 00:00:00 2001 From: Feng Date: Fri, 23 Sep 2016 15:29:39 +0800 Subject: [PATCH 2/2] test emqttd:run_hooks/2 --- test/emqttd_SUITE.erl | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/test/emqttd_SUITE.erl b/test/emqttd_SUITE.erl index 41ad9f60e..0c20b9bd5 100644 --- a/test/emqttd_SUITE.erl +++ b/test/emqttd_SUITE.erl @@ -332,11 +332,16 @@ add_delete_hook(_) -> [] = emqttd_hook:lookup(emqttd_hook). run_hooks(_) -> - emqttd:hook(test_hook, fun ?MODULE:hook_fun3/4, [init]), - emqttd:hook(test_hook, fun ?MODULE:hook_fun4/4, [init]), - emqttd:hook(test_hook, fun ?MODULE:hook_fun5/4, [init]), - {stop, [r3, r2]} = emqttd:run_hooks(test_hook, [arg1, arg2], []), - {ok, []} = emqttd:run_hooks(unknown_hook, [], []). + emqttd:hook(foldl_hook, fun ?MODULE:hook_fun3/4, [init]), + emqttd:hook(foldl_hook, fun ?MODULE:hook_fun4/4, [init]), + emqttd:hook(foldl_hook, fun ?MODULE:hook_fun5/4, [init]), + {stop, [r3, r2]} = emqttd:run_hooks(foldl_hook, [arg1, arg2], []), + {ok, []} = emqttd:run_hooks(unknown_hook, [], []), + + emqttd:hook(foreach_hook, fun ?MODULE:hook_fun6/2, [initArg]), + emqttd:hook(foreach_hook, fun ?MODULE:hook_fun7/2, [initArg]), + emqttd:hook(foreach_hook, fun ?MODULE:hook_fun8/2, [initArg]), + stop = emqttd:run_hooks(foreach_hook, [arg]). hook_fun1([]) -> ok. hook_fun2([]) -> {ok, []}. @@ -345,6 +350,10 @@ hook_fun3(arg1, arg2, _Acc, init) -> ok. hook_fun4(arg1, arg2, Acc, init) -> {ok, [r2 | Acc]}. hook_fun5(arg1, arg2, Acc, init) -> {stop, [r3 | Acc]}. +hook_fun6(arg, initArg) -> ok. +hook_fun7(arg, initArg) -> any. +hook_fun8(arg, initArg) -> stop. + %%-------------------------------------------------------------------- %% HTTP Request Test %%--------------------------------------------------------------------