Skip to content

Commit f137177

Browse files
author
Paul Jones
committed
Changed hook function to be a {M,F,A} set instead
1 parent de9507b commit f137177

File tree

2 files changed

+31
-26
lines changed

2 files changed

+31
-26
lines changed

src/rabbit_hooks.erl

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,8 @@
3838

3939
-ifdef(use_specs).
4040

41-
-type(hookfun() :: fun((list()) -> 'ok')).
42-
4341
-spec(start/0 :: () -> 'ok').
44-
-spec(subscribe/3 :: (atom(), atom(), hookfun()) -> 'ok').
42+
-spec(subscribe/3 :: (atom(), atom(), {atom(), atom(), list()}) -> 'ok').
4543
-spec(unsubscribe/2 :: (atom(), atom()) -> 'ok').
4644
-spec(trigger/2 :: (atom(), list()) -> 'ok').
4745

@@ -61,10 +59,10 @@ unsubscribe(Hook, HandlerName) ->
6159

6260
trigger(Hook, Args) ->
6361
Hooks = ets:lookup(?TableName, Hook),
64-
[case catch H(Args) of
62+
[case catch apply(M, F, [Hook, Name, Args | A]) of
6563
{'EXIT', Reason} ->
6664
rabbit_log:warning("Failed to execute handler ~p for hook ~p: ~p",
6765
[Name, Hook, Reason]);
6866
_ -> ok
69-
end || {_, Name, H} <- Hooks],
67+
end || {_, Name, {M, F, A}} <- Hooks],
7068
ok.

src/rabbit_tests.erl

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@
3333

3434
-export([all_tests/0, test_parsing/0]).
3535

36+
%% Exported so the hook mechanism can call back
37+
-export([handle_hook/3, bad_handle_hook/3, extra_arg_hook/5]).
38+
3639
-import(lists).
3740

3841
-include("rabbit.hrl").
@@ -604,36 +607,32 @@ test_server_status() ->
604607

605608
test_hooks() ->
606609
%% Firing of hooks calls all hooks in an isolated manner
607-
rabbit_hooks:subscribe(test_hook, test,
608-
fun(Args) ->
609-
put(fired_testhook_handler, Args)
610-
end),
611-
rabbit_hooks:subscribe(test_hook, test2,
612-
fun(Args) ->
613-
put(fired_testhook_handler2, Args)
614-
end),
615-
rabbit_hooks:subscribe(test_hook2, test2,
616-
fun(Args) ->
617-
put(fired_testhook2_handler, Args)
618-
end),
610+
rabbit_hooks:subscribe(test_hook, test, {rabbit_tests, handle_hook, []}),
611+
rabbit_hooks:subscribe(test_hook, test2, {rabbit_tests, handle_hook, []}),
612+
rabbit_hooks:subscribe(test_hook2, test2, {rabbit_tests, handle_hook, []}),
619613
rabbit_hooks:trigger(test_hook, [arg1, arg2]),
620-
[arg1, arg2] = get(fired_testhook_handler),
621-
[arg1, arg2] = get(fired_testhook_handler2),
622-
undefined = get(fired_testhook2_handler),
614+
[arg1, arg2] = get(test_hook_test_fired),
615+
[arg1, arg2] = get(test_hook_test2_fired),
616+
undefined = get(test_hook2_test2_fired),
623617

624618
%% Hook Deletion works
625-
put(fired_testhook_handler, undefined),
626-
put(fired_testhook_handler2, undefined),
619+
put(test_hook_test_fired, undefined),
620+
put(test_hook_test2_fired, undefined),
627621
rabbit_hooks:unsubscribe(test_hook, test),
628622
rabbit_hooks:trigger(test_hook, [arg3, arg4]),
629-
undefined = get(fired_testhook_handler),
630-
[arg3, arg4] = get(fired_testhook_handler2),
631-
undefined = get(fired_testhook2_handler),
623+
undefined = get(test_hook_test_fired),
624+
[arg3, arg4] = get(test_hook_test2_fired),
625+
undefined = get(test_hook2_test2_fired),
632626

633627
%% Catches exceptions from bad hooks
634-
rabbit_hooks:subscribe(test_hook3, test, fun(Args) -> bad:bad() end),
628+
rabbit_hooks:subscribe(test_hook3, test, {rabbit_tests, bad_handle_hook, []}),
635629
ok = rabbit_hooks:trigger(test_hook3, []),
636630

631+
%% Passing extra arguments to hooks
632+
rabbit_hooks:subscribe(arg_hook, test, {rabbit_tests, extra_arg_hook, [1, 3]}),
633+
rabbit_hooks:trigger(arg_hook, [arg1, arg2]),
634+
{[arg1, arg2], 1, 3} = get(arg_hook_test_fired),
635+
637636
passed.
638637

639638
%---------------------------------------------------------------------
@@ -719,3 +718,11 @@ delete_log_handlers(Handlers) ->
719718
[[] = error_logger:delete_report_handler(Handler) ||
720719
Handler <- Handlers],
721720
ok.
721+
722+
handle_hook(HookName, Handler, Args) ->
723+
A = atom_to_list(HookName) ++ "_" ++ atom_to_list(Handler) ++ "_fired",
724+
put(list_to_atom(A), Args).
725+
bad_handle_hook(_, _, _) ->
726+
bad:bad().
727+
extra_arg_hook(Hookname, Handler, Args, Extra1, Extra2) ->
728+
handle_hook(Hookname, Handler, {Args, Extra1, Extra2}).

0 commit comments

Comments
 (0)