aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_hooks.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_hooks.erl')
-rw-r--r--src/ejabberd_hooks.erl29
1 files changed, 19 insertions, 10 deletions
diff --git a/src/ejabberd_hooks.erl b/src/ejabberd_hooks.erl
index 589b0d6a3..9f782b235 100644
--- a/src/ejabberd_hooks.erl
+++ b/src/ejabberd_hooks.erl
@@ -326,10 +326,9 @@ run1([{_Seq, Node, Module, Function} | Ls], Hook, Args) ->
run1(Ls, Hook, Args)
end;
run1([{_Seq, Module, Function} | Ls], Hook, Args) ->
- Res = safe_apply(Module, Function, Args),
+ Res = safe_apply(Hook, Module, Function, Args),
case Res of
- {'EXIT', Reason} ->
- ?ERROR_MSG("~p~nrunning hook: ~p", [Reason, {Hook, Args}]),
+ 'EXIT' ->
run1(Ls, Hook, Args);
stop ->
ok;
@@ -362,10 +361,9 @@ run_fold1([{_Seq, Node, Module, Function} | Ls], Hook, Val, Args) ->
run_fold1(Ls, Hook, NewVal, Args)
end;
run_fold1([{_Seq, Module, Function} | Ls], Hook, Val, Args) ->
- Res = safe_apply(Module, Function, [Val | Args]),
+ Res = safe_apply(Hook, Module, Function, [Val | Args]),
case Res of
- {'EXIT', Reason} ->
- ?ERROR_MSG("~p~nrunning hook: ~p", [Reason, {Hook, Args}]),
+ 'EXIT' ->
run_fold1(Ls, Hook, Val, Args);
stop ->
stopped;
@@ -375,9 +373,20 @@ run_fold1([{_Seq, Module, Function} | Ls], Hook, Val, Args) ->
run_fold1(Ls, Hook, NewVal, Args)
end.
-safe_apply(Module, Function, Args) ->
- if is_function(Function) ->
- catch apply(Function, Args);
+safe_apply(Hook, Module, Function, Args) ->
+ try if is_function(Function) ->
+ apply(Function, Args);
true ->
- catch apply(Module, Function, Args)
+ apply(Module, Function, Args)
+ end
+ catch E:R when E /= exit, R /= normal ->
+ ?ERROR_MSG("Hook ~p crashed when running ~p:~p/~p:~n"
+ "** Reason = ~p~n"
+ "** Arguments = ~p",
+ [Hook, Module, Function, length(Args),
+ {E, R, get_stacktrace()}, Args]),
+ 'EXIT'
end.
+
+get_stacktrace() ->
+ [{Mod, Fun, Loc, Args} || {Mod, Fun, Args, Loc} <- erlang:get_stacktrace()].