In gen_event, what functional diff does it makes for gen_event:notify & gen_event:call

Ulf Wiger etxuwig@REDACTED
Thu Feb 20 17:19:19 CET 2003


On Thu, 20 Feb 2003, Suresh S wrote:

>Hi,
>
>>> gen_event:call(EntMgr, Handler, Req) -->
>>> M:handle_event(Req, S)
>>
>> No, a call is handled in M:handle_call(Query,State)
>
>i mean to ask for handle_call only , but in a hurry i
>mistyped
>
>Any how in case of M:handle_call(Req, S)
>How do we pass Handler = { M, Id }
>
>what is the need for Id?
>how do i pass the handler i have to handle?

>From the gen_event reference manual:

"Handler is the name of the callback module Module or a
tuple {Module,Id}, where Id is any term. The {Module,Id}
representation makes it possible to identify a specific
event handler when there are several event handlers using
the same callback module."

If you only have one instance of a specific handler, then
Handler becomes simply the module name.

The {Module,Id} construct is for the case that you have lots
of instances of similar handlers, and it's not practical, or
even desired, to implement a module for each instance. Id
can be anything that helps you tell the different handlers
apart in your application.

A very common way to identify the handler is to use the
?MODULE macro. Example from the OTP EVA application:

module eva_snmp_adaptation.erl:

start() ->
    gen_event:add_handler(alarm_handler, ?MODULE, []),
    register_events([{clear_alarm, alarmCleared,
                      snmpTrap, "standard trap",
                      {?MODULE, clear_alarm}}]).

register_events(Events) ->
    gen_event:call(alarm_handler, ?MODULE,
                   {reg_events, Events}).


handle_event({send_event, Event}, S) ->
    case mnesia:dirty_read({eva_snmp_map,
                            {event, Event#event.name}}) of
        [#eva_snmp_map{val = Data}] ->
            send_event(Data, Event);
        _ ->
            ok
    end,
    {ok, S};
...
handle_event(_, S) ->
    {ok, S}.


handle_call({reg_events, Events}, S) ->
    #state{event_struct = EStruct,
           next_event_index = Index} = S,
    {NEStruct, NIndex} = reg_events(Events, EStruct, Index),
    {ok, ok, S#state{event_struct = NEStruct,
next_event_index = NIndex}};


... where events are sent from eva_server.erl using
gen_event:sync_notify(alarm_handler, {send_event, Event})



/Uffe
-- 
Ulf Wiger, Senior Specialist,
   / / /   Architecture & Design of Carrier-Class Software
  / / /    Strategic Product & System Management
 / / /     Ericsson AB, Connectivity and Control Nodes




More information about the erlang-questions mailing list