diff options
Diffstat (limited to 'src/cowboy_tracer_h.erl')
-rw-r--r-- | src/cowboy_tracer_h.erl | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/cowboy_tracer_h.erl b/src/cowboy_tracer_h.erl index 1f054e3..b69faf4 100644 --- a/src/cowboy_tracer_h.erl +++ b/src/cowboy_tracer_h.erl @@ -80,7 +80,7 @@ init_tracer(StreamID, Req, Opts=#{tracer_match_specs := List, tracer_callback := start_tracer(StreamID, Req, Opts) end; %% When the options tracer_match_specs or tracer_callback -%% arenot provided we do not enable tracing. +%% are not provided we do not enable tracing. init_tracer(_, _, _) -> no_tracing. @@ -138,6 +138,8 @@ start_tracer(StreamID, Req, Opts) -> -spec tracer_process(_, _, _) -> no_return(). tracer_process(StreamID, Req=#{pid := Parent}, Opts=#{tracer_callback := Fun}) -> + %% This is necessary because otherwise the tracer could stop + %% before it has finished processing the events in its queue. process_flag(trap_exit, true), State = Fun(init, {StreamID, Req, Opts}), tracer_loop(Parent, Fun, State). @@ -148,7 +150,7 @@ tracer_loop(Parent, Fun, State) -> Fun(Msg, State), tracer_loop(Parent, Fun, State); {'EXIT', Parent, Reason} -> - exit(Reason); + tracer_terminate(Reason, Fun, State); {system, From, Request} -> sys:handle_system_msg(Request, From, Parent, ?MODULE, [], {Fun, State}); Msg -> @@ -157,6 +159,10 @@ tracer_loop(Parent, Fun, State) -> tracer_loop(Parent, Fun, State) end. +tracer_terminate(Reason, Fun, State) -> + _ = Fun(terminate, State), + exit(Reason). + %% System callbacks. -spec system_continue(pid(), _, {fun(), any()}) -> no_return(). @@ -164,8 +170,8 @@ system_continue(Parent, _, {Fun, State}) -> tracer_loop(Parent, Fun, State). -spec system_terminate(any(), _, _, _) -> no_return(). -system_terminate(Reason, _, _, _) -> - exit(Reason). +system_terminate(Reason, _, _, {Fun, State}) -> + tracer_terminate(Reason, Fun, State). -spec system_code_change(Misc, _, _, _) -> {ok, Misc} when Misc::any(). system_code_change(Misc, _, _, _) -> |