gen_event feature request
Serge Aleynikov
serge@REDACTED
Sat Sep 24 18:39:50 CEST 2005
Current implementation of gen_event doesn't have an option to atomically
check for an installed duplicate event handler before adding a new event
handler. The common practice seems to be:
case lists:member(NewHandler, gen_event:which_handlers(EventMgr)) of
true ->
ok;
false ->
gen_event:add_handler(EventMgr, NewHandler)
end.
Apparently this approach has a race condition. Secondly, when an
existing event handler is being replaced by a new one using
gen_event:swap_handler/3 this option also does not check if the
NewHandler is already installed, which results in a duplicate handler
added. As example of this can be found in the error_logger module:
swap_handler(tty) ->
gen_event:swap_handler(error_logger, {error_logger, swap},
{error_logger_tty_h, []}),
simple_logger().
When you call error_logger:swap_handler(tty) multiple times you'll find
that multiple copies of error_logger_tty_h get installed (which is not
intuitive).
In order to overcome these issues I would recommend to add new features:
1. gen_event:add_handler_unique(EventMgrRef, NewHandler, Args) -> Result
Result = ok | already_installed | {'EXIT',Reason} | term()
2. gen_event:swap_handler_unique(
EventMgrRef, {OldHandler,Args1}, {NewHandler,Args2}) -> Result
Result = ok | already_installed | {error, Reason} | term()
'already_installed' is returned if the NewHandler is already installed.
Thoughts?
Serge
More information about the erlang-questions
mailing list