[erlang-questions] Question about gen_event
Martin Bjorklund
mbj@REDACTED
Thu Oct 2 16:38:11 CEST 2008
Hi,
Kostis Sagonas <kostis@REDACTED> wrote:
> I've been staring at the code of 'gen_event' and I cannot make much
> sense of how the code for swapping handlers works. In fact, I am quite
> convinced there is a bug in there but it is being silenced by the use of
> a catch. Can somebody please confirm that this is a bug or enlighten me
> on what's happening?
>
> The code of gen_event:do_swap/7 reads:
>
> do_swap(Mod1,Handler1,Args1,State1,Handler2,Args2,SName) ->
> %% finalise the existing handler
> State2 = do_terminate(...),
> {Mod2,Handler} = new_handler(Handler2, Handler1), %% <---
This is correct; the module is extracted from Handler2, and the
#handler{} is updated.
> case catch Mod2:init({Args2, State2}) of
> {ok, State2a} ->
> {ok, Handler#handler{state = State2a}};
> Other ->
> report_terminate(Handler2, crash, ...), %% <---
But this is wrong; Handler2 should be Handler here. Handler2 is
either a module name (atom()) or a tuple {ModuleName, Id} ({atom(),
term()}). But report_terminate wants a #handler{}.
The variable names are pretty confusing... I suspect that once upon a
time, Handler was just a modulename or the 2-tuple, and it has evolved
into a record...
/martin
More information about the erlang-questions
mailing list