1gen_event(3)               Erlang Module Definition               gen_event(3)
2
3
4

NAME

6       gen_event - Generic event handling behavior.
7

DESCRIPTION

9       This behavior module provides event handling functionality. It consists
10       of a generic event manager process with any number  of  event  handlers
11       that are added and deleted dynamically.
12
13       An  event  manager  implemented using this module has a standard set of
14       interface functions and includes functionality for  tracing  and  error
15       reporting. It also fits into an OTP supervision tree. For more informa‐
16       tion, see OTP Design Principles.
17
18       Each event handler is implemented as a callback module exporting a pre‐
19       defined  set  of functions. The relationship between the behavior func‐
20       tions and the callback functions is as follows:
21
22       gen_event module                   Callback module
23       ----------------                   ---------------
24       gen_event:start
25       gen_event:start_monitor
26       gen_event:start_link       ----->  -
27
28       gen_event:add_handler
29       gen_event:add_sup_handler  ----->  Module:init/1
30
31       gen_event:notify
32       gen_event:sync_notify      ----->  Module:handle_event/2
33
34       gen_event:send_request
35       gen_event:call             ----->  Module:handle_call/2
36
37       -                          ----->  Module:handle_info/2
38
39       gen_event:delete_handler   ----->  Module:terminate/2
40
41       gen_event:swap_handler
42       gen_event:swap_sup_handler ----->  Module1:terminate/2
43                                          Module2:init/1
44
45       gen_event:which_handlers   ----->  -
46
47       gen_event:stop             ----->  Module:terminate/2
48
49       -                          ----->  Module:code_change/3
50
51       As each event handler is one callback module, an event manager has many
52       callback  modules  that are added and deleted dynamically. gen_event is
53       therefore more tolerant of callback module errors than the other behav‐
54       iors.  If a callback function for an installed event handler fails with
55       Reason, or returns a bad value Term, the event manager does  not  fail.
56       It deletes the event handler by calling callback function Module:termi‐
57       nate/2, giving as  argument  {error,{'EXIT',Reason}}  or  {error,Term},
58       respectively. No other event handler is affected.
59
60       A gen_event process handles system messages as described in sys(3). The
61       sys module can be used for debugging an event manager.
62
63       Notice that an event manager does trap exit signals automatically.
64
65       The gen_event process can go into hibernation (see  erlang:hibernate/3)
66       if  a  callback function in a handler module specifies hibernate in its
67       return value. This can be useful if the server is expected to  be  idle
68       for  a  long  time. However, use this feature with care, as hibernation
69       implies at least two garbage collections (when hibernating and  shortly
70       after waking up) and is not something you want to do between each event
71       handled by a busy event manager.
72
73       Notice that when multiple event handlers are invoked, it is  sufficient
74       that one single event handler returns a hibernate request for the whole
75       event manager to go into hibernation.
76
77       Unless otherwise stated, all functions in this module fail if the spec‐
78       ified event manager does not exist or if bad arguments are specified.
79

DATA TYPES

81       handler() = atom() | {atom(), term()}
82
83       handler_args() = term()
84
85       add_handler_ret() = ok | term() | {'EXIT', term()}
86
87       del_handler_ret() = ok | term() | {'EXIT', term()}
88
89       request_id() = term()
90
91              A request handle, see send_request/3 for details.
92

EXPORTS

94       add_handler(EventMgrRef, Handler, Args) -> Result
95
96              Types:
97
98                 EventMgrRef  =  Name  |  {Name,Node}  | {global,GlobalName} |
99                 {via,Module,ViaName} | pid()
100                  Name = Node = atom()
101                  GlobalName = ViaName = term()
102                 Handler = Module | {Module,Id}
103                  Module = atom()
104                  Id = term()
105                 Args = term()
106                 Result = ok | {'EXIT',Reason} | term()
107                  Reason = term()
108
109              Adds a new event handler to event manager EventMgrRef. The event
110              manager  calls  Module:init/1  to initiate the event handler and
111              its internal state.
112
113              EventMgrRef can be any of the following:
114
115                * The pid
116
117                * Name, if the event manager is locally registered
118
119                * {Name,Node}, if the event manager is locally  registered  at
120                  another node
121
122                * {global,GlobalName}, if the event manager is globally regis‐
123                  tered
124
125                * {via,Module,ViaName}, if the  event  manager  is  registered
126                  through an alternative process registry
127
128              Handler  is  the  name  of the callback module Module or a tuple
129              {Module,Id}, where Id is any term. The  {Module,Id}  representa‐
130              tion makes it possible to identify a specific event handler when
131              many event handlers use the same callback module.
132
133              Args is any  term  that  is  passed  as  the  argument  to  Mod‐
134              ule:init/1.
135
136              If  Module:init/1  returns a correct value indicating successful
137              completion, the event manager adds the event  handler  and  this
138              function  returns  ok.  If  Module:init/1  fails  with Reason or
139              returns {error,Reason}, the event handler is  ignored  and  this
140              function  returns  {'EXIT',Reason}  or  {error,Reason},  respec‐
141              tively.
142
143       add_sup_handler(EventMgrRef, Handler, Args) -> Result
144
145              Types:
146
147                 EventMgrRef = Name  |  {Name,Node}  |  {global,GlobalName}  |
148                 {via,Module,ViaName} | pid()
149                  Name = Node = atom()
150                  GlobalName = ViaName = term()
151                 Handler = Module | {Module,Id}
152                  Module = atom()
153                  Id = term()
154                 Args = term()
155                 Result = ok | {'EXIT',Reason} | term()
156                  Reason = term()
157
158              Adds  a  new event handler in the same way as add_handler/3, but
159              also supervises the connection between the event handler and the
160              calling process.
161
162                * If  the  calling  process  later terminates with Reason, the
163                  event manager deletes the  event  handler  by  calling  Mod‐
164                  ule:terminate/2 with {stop,Reason} as argument.
165
166                * If  the  event  handler  is deleted later, the event manager
167                  sends a message {gen_event_EXIT,Handler,Reason} to the call‐
168                  ing process. Reason is one of the following:
169
170                  * normal, if the event handler has been removed because of a
171                    call  to  delete_handler/3,  or  remove_handler  has  been
172                    returned by a callback function (see below).
173
174                  * shutdown,  if  the  event handler has been removed because
175                    the event manager is terminating.
176
177                  * {swapped,NewHandler,Pid}, if the process Pid has  replaced
178                    the  event  handler  with another event handler NewHandler
179                    using a call to swap_handler/3 or swap_sup_handler/3.
180
181                  * A term, if the event handler  is  removed  because  of  an
182                    error. Which term depends on the error.
183
184              For  a  description  of  the  arguments  and  return values, see
185              add_handler/3.
186
187       call(EventMgrRef, Handler, Request) -> Result
188       call(EventMgrRef, Handler, Request, Timeout) -> Result
189
190              Types:
191
192                 EventMgrRef = Name  |  {Name,Node}  |  {global,GlobalName}  |
193                 {via,Module,ViaName} | pid()
194                  Name = Node = atom()
195                  GlobalName = ViaName = term()
196                 Handler = Module | {Module,Id}
197                  Module = atom()
198                  Id = term()
199                 Request = term()
200                 Timeout = int()>0 | infinity
201                 Result = Reply | {error,Error}
202                  Reply = term()
203                  Error = bad_module | {'EXIT',Reason} | term()
204                  Reason = term()
205
206              Makes  a  synchronous call to event handler Handler installed in
207              event manager EventMgrRef by sending a request and waiting until
208              a  reply  arrives  or a time-out occurs. The event manager calls
209              Module:handle_call/2 to handle the request.
210
211              For a description of EventMgrRef and Handler, see add_handler/3.
212
213              Request is any term that is passed as one of  the  arguments  to
214              Module:handle_call/2.
215
216              Timeout  is an integer greater than zero that specifies how many
217              milliseconds to wait for a reply, or the atom infinity  to  wait
218              indefinitely.  Defaults  to 5000. If no reply is received within
219              the specified time, the function call fails.
220
221              The return value Reply is defined in the return  value  of  Mod‐
222              ule:handle_call/2.   If  the  specified  event  handler  is  not
223              installed, the function returns {error,bad_module}. If the call‐
224              back  function  fails with Reason or returns an unexpected value
225              Term,   this   function   returns   {error,{'EXIT',Reason}}   or
226              {error,Term}, respectively.
227
228       check_response(Msg, RequestId) -> Result
229
230              Types:
231
232                 Msg = term()
233                 RequestId = request_id()
234                 Result = {reply, Reply} | no_reply | {error, Error}
235                 Reply = Error = term()
236
237              This function is used to check if a previously received message,
238              for example by receive  or  handle_info/2,  is  a  result  of  a
239              request  made with send_request/3. If Msg is a reply to the han‐
240              dle RequestId the result of the request is  returned  in  Reply.
241              Otherwise  returns no_reply and no cleanup is done, and thus the
242              function shall be invoked repeatedly until a reply is returned.
243
244              If the specified event handler is not  installed,  the  function
245              returns  {error,bad_module}. If the callback function fails with
246              Reason or  returns  an  unexpected  value  Term,  this  function
247              returns  {error,{'EXIT',Reason}}  or {error,Term}, respectively.
248              If the event manager dies before  or  during  the  request  this
249              function returns {error,{Reason, EventMgrRef}}.
250
251       delete_handler(EventMgrRef, Handler, Args) -> Result
252
253              Types:
254
255                 EventMgrRef  =  Name  |  {Name,Node}  | {global,GlobalName} |
256                 {via,Module,ViaName} | pid()
257                  Name = Node = atom()
258                  GlobalName = ViaName = term()
259                 Handler = Module | {Module,Id}
260                  Module = atom()
261                  Id = term()
262                 Args = term()
263                 Result = term() | {error,module_not_found} | {'EXIT',Reason}
264                  Reason = term()
265
266              Deletes an event handler from  event  manager  EventMgrRef.  The
267              event  manager  calls  Module:terminate/2 to terminate the event
268              handler.
269
270              For a description of EventMgrRef and Handler, see add_handler/3.
271
272              Args is any term that is passed as one of the arguments to  Mod‐
273              ule:terminate/2.
274
275              The  return  value is the return value of Module:terminate/2. If
276              the specified event  handler  is  not  installed,  the  function
277              returns {error,module_not_found}. If the callback function fails
278              with Reason, the function returns {'EXIT',Reason}.
279
280       notify(EventMgrRef, Event) -> ok
281       sync_notify(EventMgrRef, Event) -> ok
282
283              Types:
284
285                 EventMgrRef = Name  |  {Name,Node}  |  {global,GlobalName}  |
286                 {via,Module,ViaName} | pid()
287                  Name = Node = atom()
288                  GlobalName = ViaName = term()
289                 Event = term()
290
291              Sends  an  event  notification to event manager EventMgrRef. The
292              event manager calls  Module:handle_event/2  for  each  installed
293              event handler to handle the event.
294
295              notify/2 is asynchronous and returns immediately after the event
296              notification has been sent. sync_notify/2 is synchronous in  the
297              sense that it returns ok after the event has been handled by all
298              event handlers.
299
300              For a description of EventMgrRef, see add_handler/3.
301
302              Event is any term that is passed as one of the arguments to Mod‐
303              ule:handle_event/2.
304
305              notify/1  does not fail even if the specified event manager does
306              not exist, unless it is specified as Name.
307
308       send_request(EventMgrRef, Handler, Request) -> RequestId
309
310              Types:
311
312                 EventMgrRef = Name | {Name,Node} | {global,GlobalName}
313                  | {via,Module,ViaName} | pid()
314                  Node = atom()
315                  GlobalName = ViaName = term()
316                 Handler = Module | {Module,Id}
317                  Module = atom()
318                  Id = term()
319                 Request = term()
320                 RequestId = request_id()
321
322              Sends a request to event handler Handler installed in event man‐
323              ager  EventMgrRef  and  returns  a  handle RequestId. The return
324              value RequestId shall later  be  used  with  wait_response/2  or
325              check_response/2  in the same process to fetch the actual result
326              of the request.
327
328              The call  gen_event:wait_response(gen_event:send_request(EventM‐
329              grRef,Handler,Request),  Timeout)  can  be seen as equivalent to
330              gen_event:call(EventMgrRef,Handler,Request,Timeout),    ignoring
331              the error handling.
332
333              The  event  manager  calls  Module:handle_call/2  to  handle the
334              request.
335
336              Request is any term that is passed as one of  the  arguments  to
337              Module:handle_call/3.
338
339       start() -> Result
340       start(EventMgrName | Options) -> Result
341       start(EventMgrName, Options) -> Result
342
343              Types:
344
345                 EventMgrName = {local,Name} | {global,GlobalName} | {via,Mod‐
346                 ule,ViaName}
347                  Name = atom()
348                  GlobalName = ViaName = term()
349                 Options = [Option]
350                  Option   =   {debug,Dbgs}   |   {timeout,Time}   |   {hiber‐
351                 nate_after,HibernateAfterTimeout} | {spawn_opt,SOpts}
352                  Dbgs = [Dbg]
353                  Dbg  =  trace  | log | statistics | {log_to_file,FileName} |
354                 {install,{Func,FuncState}}
355                  SOpts = [term()]
356                 Result = {ok,Pid} | {error,{already_started,Pid}}
357                  Pid = pid()
358
359              Creates a stand-alone event manager process, that is,  an  event
360              manager  that  is not part of a supervision tree and thus has no
361              supervisor.
362
363              For a description  of  the  arguments  and  return  values,  see
364              start_link/0,1.
365
366       start_link() -> Result
367       start_link(EventMgrName | Options) -> Result
368       start_link(EventMgrName, Options) -> Result
369
370              Types:
371
372                 EventMgrName = {local,Name} | {global,GlobalName} | {via,Mod‐
373                 ule,ViaName}
374                  Name = atom()
375                  GlobalName = ViaName = term()
376                 Options = [Option]
377                  Option   =   {debug,Dbgs}   |   {timeout,Time}   |   {hiber‐
378                 nate_after,HibernateAfterTimeout} | {spawn_opt,SOpts}
379                  Dbgs = [Dbg]
380                  Dbg  =  trace  | log | statistics | {log_to_file,FileName} |
381                 {install,{Func,FuncState}}
382                  SOpts = [term()]
383                 Result = {ok,Pid} | {error,{already_started,Pid}}
384                  Pid = pid()
385
386              Creates an event manager process as part of a supervision  tree.
387              The  function  is  to  be called, directly or indirectly, by the
388              supervisor. For example, it ensures that the  event  manager  is
389              linked to the supervisor.
390
391                * If  EventMgrName={local,Name},  the  event manager is regis‐
392                  tered locally as Name using register/2.
393
394                * If EventMgrName={global,GlobalName}, the  event  manager  is
395                  registered   globally   as  GlobalName  using  global:regis‐
396                  ter_name/2. If no name is provided, the event manager is not
397                  registered.
398
399                * If EventMgrName={via,Module,ViaName}, the event manager reg‐
400                  isters with the registry represented by Module.  The  Module
401                  callback  is to export the functions register_name/2, unreg‐
402                  ister_name/1,  whereis_name/1,  and  send/2,  which  are  to
403                  behave  as  the  corresponding  functions  in  global. Thus,
404                  {via,global,GlobalName} is a valid reference.
405
406                * If   option    {hibernate_after,HibernateAfterTimeout}    is
407                  present, the gen_event process awaits any message for Hiber‐
408                  nateAfterTimeout milliseconds and if no message is received,
409                  the  process goes into hibernation automatically (by calling
410                  proc_lib:hibernate/3).
411
412              If the event  manager  is  successfully  created,  the  function
413              returns  {ok,Pid}, where Pid is the pid of the event manager. If
414              a process with the specified EventMgrName  exists  already,  the
415              function returns {error,{already_started,Pid}}, where Pid is the
416              pid of that process.
417
418       start_monitor() -> Result
419       start_monitor(EventMgrName | Options) -> Result
420       start_monitor(EventMgrName, Options) -> Result
421
422              Types:
423
424                 EventMgrName = {local,Name} | {global,GlobalName} | {via,Mod‐
425                 ule,ViaName}
426                  Name = atom()
427                  GlobalName = ViaName = term()
428                 Options = [Option]
429                  Option   =   {debug,Dbgs}   |   {timeout,Time}   |   {hiber‐
430                 nate_after,HibernateAfterTimeout} | {spawn_opt,SOpts}
431                  Dbgs = [Dbg]
432                  Dbg = trace | log | statistics  |  {log_to_file,FileName}  |
433                 {install,{Func,FuncState}}
434                  SOpts = [term()]
435                 Result = {ok,{Pid,Mon}} | {error,{already_started,Pid}}
436                  Pid = pid()
437
438              Creates  a  stand-alone event manager process, that is, an event
439              manager that is not part of a supervision tree (and thus has  no
440              supervisor)  and  atomically sets up a monitor to the newly cre‐
441              ated process.
442
443              For a description  of  the  arguments  and  return  values,  see
444              start_link/0,1.  Note  that the return value on successful start
445              differs  from  start_link/3,4.  start_monitor/3,4  will   return
446              {ok,{Pid,Mon}}  where  Pid  is  the  process  identifier  of the
447              process, and Mon is a reference to the monitor set up to monitor
448              the  process. If the start is not successful, the caller will be
449              blocked until the DOWN message has  been  received  and  removed
450              from the message queue.
451
452       stop(EventMgrRef) -> ok
453       stop(EventMgrRef, Reason, Timeout) -> ok
454
455              Types:
456
457                 EventMgrRef  =  Name  |  {Name,Node}  | {global,GlobalName} |
458                 {via,Module,ViaName} | pid()
459                 Name = Node = atom()
460                 GlobalName = ViaName = term()
461                 Reason = term()
462                 Timeout = int()>0 | infinity
463
464              Orders event manager EventMgrRef to exit with the specifies Rea‐
465              son and waits for it to terminate. Before terminating, gen_event
466              calls Module:terminate(stop,...) for each installed  event  han‐
467              dler.
468
469              The function returns ok if the event manager terminates with the
470              expected reason. Any other  reason  than  normal,  shutdown,  or
471              {shutdown,Term}  causes  an error report to be issued using log‐
472              ger(3). The default Reason is normal.
473
474              Timeout is an integer greater than zero that specifies how  many
475              milliseconds  to wait for the event manager to terminate, or the
476              atom infinity to wait indefinitely. Defaults to infinity. If the
477              event  manager  has  not terminated within the specified time, a
478              timeout exception is raised.
479
480              If the process does not exist, a noproc exception is raised.
481
482              For a description of EventMgrRef, see add_handler/3.
483
484       swap_handler(EventMgrRef, {Handler1,Args1}, {Handler2,Args2}) -> Result
485
486              Types:
487
488                 EventMgrRef = Name  |  {Name,Node}  |  {global,GlobalName}  |
489                 {via,Module,ViaName} | pid()
490                  Name = Node = atom()
491                  GlobalName = ViaName = term()
492                 Handler1 = Handler2 = Module | {Module,Id}
493                  Module = atom()
494                  Id = term()
495                 Args1 = Args2 = term()
496                 Result = ok | {error,Error}
497                  Error = {'EXIT',Reason} | term()
498                  Reason = term()
499
500              Replaces  an old event handler with a new event handler in event
501              manager EventMgrRef.
502
503              For a description of the arguments, see add_handler/3.
504
505              First the old event handler Handler1 is deleted. The event  man‐
506              ager  calls  Module1:terminate(Args1, ...), where Module1 is the
507              callback module of Handler1, and collects the return value.
508
509              Then the new event handler Handler2 is added  and  initiated  by
510              calling  Module2:init({Args2,Term}),  where Module2 is the call‐
511              back module of Handler2 and Term is the  return  value  of  Mod‐
512              ule1:terminate/2. This makes it possible to transfer information
513              from Handler1 to Handler2.
514
515              The new handler is added even if the  the  specified  old  event
516              handler  is  not installed, in which case Term=error, or if Mod‐
517              ule1:terminate/2   fails   with   Reason,    in    which    case
518              Term={'EXIT',Reason}.  The  old  handler is deleted even if Mod‐
519              ule2:init/1 fails.
520
521              If there was a supervised  connection  between  Handler1  and  a
522              process  Pid,  there is a supervised connection between Handler2
523              and Pid instead.
524
525              If Module2:init/1 returns a correct value, this function returns
526              ok. If Module2:init/1 fails with Reason or returns an unexpected
527              value Term, this  function  returns  {error,{'EXIT',Reason}}  or
528              {error,Term}, respectively.
529
530       swap_sup_handler(EventMgrRef,  {Handler1,Args1},  {Handler2,Args2})  ->
531       Result
532
533              Types:
534
535                 EventMgrRef = Name  |  {Name,Node}  |  {global,GlobalName}  |
536                 {via,Module,ViaName} | pid()
537                  Name = Node = atom()
538                  GlobalName = ViaName = term()
539                 Handler1 = Handler 2 = Module | {Module,Id}
540                  Module = atom()
541                  Id = term()
542                 Args1 = Args2 = term()
543                 Result = ok | {error,Error}
544                  Error = {'EXIT',Reason} | term()
545                  Reason = term()
546
547              Replaces  an  event  handler in event manager EventMgrRef in the
548              same way as swap_handler/3, but also supervises  the  connection
549              between Handler2 and the calling process.
550
551              For  a  description  of  the  arguments  and  return values, see
552              swap_handler/3.
553
554       wait_response(RequestId, Timeout) -> Result
555
556              Types:
557
558                 RequestId = request_id()
559                 Reply = term()
560                 Timeout = timeout()
561                 Result = {reply, Reply} | timeout | {error, Error}
562                 Reply = Error = term()
563
564              This function is used to wait for a reply of a request made with
565              send_request/3  from  the  event  manager. This function must be
566              called from the same process from which send_request/3 was made.
567
568              Timeout is an integer greater then or equal to zero that  speci‐
569              fies  how  many  milliseconds  to wait for an reply, or the atom
570              infinity to wait indefinitely. If no reply  is  received  within
571              the  specified time, the function returns timeout and no cleanup
572              is done, and thus the function must be invoked repeatedly  until
573              a reply is returned.
574
575              The  return  value  Reply is defined in the return value of Mod‐
576              ule:handle_call/3.
577
578              If the specified event handler is not  installed,  the  function
579              returns  {error,bad_module}. If the callback function fails with
580              Reason or  returns  an  unexpected  value  Term,  this  function
581              returns  {error,{'EXIT',Reason}}  or {error,Term}, respectively.
582              If the event manager dies before  or  during  the  request  this
583              function returns {error,{Reason, EventMgrRef}}.
584
585       which_handlers(EventMgrRef) -> [Handler]
586
587              Types:
588
589                 EventMgrRef  =  Name  |  {Name,Node}  | {global,GlobalName} |
590                 {via,Module,ViaName} | pid()
591                  Name = Node = atom()
592                  GlobalName = ViaName = term()
593                 Handler = Module | {Module,Id}
594                  Module = atom()
595                  Id = term()
596
597              Returns a list of all event handlers installed in event  manager
598              EventMgrRef.
599
600              For a description of EventMgrRef and Handler, see add_handler/3.
601

CALLBACK FUNCTIONS

603       The  following  functions  are to be exported from a gen_event callback
604       module.
605

EXPORTS

607       Module:code_change(OldVsn, State, Extra) -> {ok, NewState}
608
609              Types:
610
611                 OldVsn = Vsn | {down, Vsn}
612                  Vsn = term()
613                 State = NewState = term()
614                 Extra = term()
615
616          Note:
617              This callback is optional, so callback modules need  not  export
618              it.  If a release upgrade/downgrade with Change={advanced,Extra}
619              specified in the .appup file is made  when  code_change/3  isn't
620              implemented  the  event  handler  will crash with an undef error
621              reason.
622
623
624              This function is called for an installed event handler  that  is
625              to update its internal state during a release upgrade/downgrade,
626              that is, when the instruction {update,Module,Change,...},  where
627              Change={advanced,Extra},  is  specified  in the .appup file. For
628              more information, see OTP Design Principles.
629
630              For an upgrade, OldVsn is Vsn, and for a  downgrade,  OldVsn  is
631              {down,Vsn}.  Vsn  is  defined by the vsn attribute(s) of the old
632              version of the callback module Module. If no such  attribute  is
633              defined, the version is the checksum of the Beam file.
634
635              State is the internal state of the event handler.
636
637              Extra  is  passed  "as is" from the {advanced,Extra} part of the
638              update instruction.
639
640              The function is to return the updated internal state.
641
642       Module:format_status(Opt, [PDict, State]) -> Status
643
644              Types:
645
646                 Opt = normal | terminate
647                 PDict = [{Key, Value}]
648                 State = term()
649                 Status = term()
650
651          Note:
652              This callback is optional, so event  handler  modules  need  not
653              export  it.  If  a  handler  does  not export this function, the
654              gen_event module uses the handler state directly  for  the  pur‐
655              poses described below.
656
657
658              This  function is called by a gen_event process in the following
659              situations:
660
661                * One of sys:get_status/1,2 is invoked to  get  the  gen_event
662                  status. Opt is set to the atom normal for this case.
663
664                * The  event  handler terminates abnormally and gen_event logs
665                  an error. Opt is set to the atom terminate for this case.
666
667              This function is useful for changing the form and appearance  of
668              the  event handler state for these cases. An event handler call‐
669              back module wishing to change the the sys:get_status/1,2  return
670              value  as  well  as  how  its state appears in termination error
671              logs, exports an instance of format_status/2 that returns a term
672              describing the current state of the event handler.
673
674              PDict  is  the  current  value  of  the  process  dictionary  of
675              gen_event.
676
677              State is the internal state of the event handler.
678
679              The function is to return Status, a term that change the details
680              of  the  current state of the event handler. Any term is allowed
681              for Status. The gen_event module uses Status as follows:
682
683                * When sys:get_status/1,2 is called,  gen_event  ensures  that
684                  its  return value contains Status in place of the state term
685                  of the event handler.
686
687                * When an event handler terminates abnormally, gen_event  logs
688                  Status in place of the state term of the event handler.
689
690              One use for this function is to return compact alternative state
691              representations to avoid that large state terms are  printed  in
692              log files.
693
694       Module:handle_call(Request, State) -> Result
695
696              Types:
697
698                 Request = term()
699                 State = term()
700                 Result = {ok,Reply,NewState} | {ok,Reply,NewState,hibernate}
701                  | {swap_handler,Reply,Args1,NewState,Handler2,Args2}
702                  | {remove_handler, Reply}
703                  Reply = term()
704                  NewState = term()
705                  Args1 = Args2 = term()
706                  Handler2 = Module2 | {Module2,Id}
707                  Module2 = atom()
708                  Id = term()
709
710              Whenever   an  event  manager  receives  a  request  sent  using
711              call/3,4, this function is called for the specified  event  han‐
712              dler to handle the request.
713
714              Request is the Request argument of call/3,4.
715
716              State is the internal state of the event handler.
717
718              The  return  values  are  the  same as for Module:handle_event/2
719              except that they also contain a term Reply, which is  the  reply
720              to the client as the return value of call/3,4.
721
722       Module:handle_event(Event, State) -> Result
723
724              Types:
725
726                 Event = term()
727                 State = term()
728                 Result = {ok,NewState} | {ok,NewState,hibernate}
729                  | {swap_handler,Args1,NewState,Handler2,Args2} | remove_han‐
730                 dler
731                  NewState = term()
732                  Args1 = Args2 = term()
733                  Handler2 = Module2 | {Module2,Id}
734                  Module2 = atom()
735                  Id = term()
736
737              Whenever an event manager receives an event sent using  notify/2
738              or  sync_notify/2,  this  function  is called for each installed
739              event handler to handle the event.
740
741              Event is the Event argument of notify/2/sync_notify/2.
742
743              State is the internal state of the event handler.
744
745                * If {ok,NewState} or {ok,NewState,hibernate} is returned, the
746                  event handler remains in the event manager with the possible
747                  updated internal state NewState.
748
749                * If {ok,NewState,hibernate} is returned,  the  event  manager
750                  also  goes  into  hibernation  (by  calling  proc_lib:hiber‐
751                  nate/3), waiting for the next event to occur. It  is  suffi‐
752                  cient  that  one  of  the  event  handlers  return  {ok,New‐
753                  State,hibernate} for the  whole  event  manager  process  to
754                  hibernate.
755
756                * If {swap_handler,Args1,NewState,Handler2,Args2} is returned,
757                  the event handler is replaced by Handler2 by  first  calling
758                  Module:terminate(Args1,NewState)      and      then     Mod‐
759                  ule2:init({Args2,Term}), where Term is the return  value  of
760                  Module:terminate/2.  For  more  information,  see  swap_han‐
761                  dler/3.
762
763                * If remove_handler is returned, the event handler is  deleted
764                  by calling Module:terminate(remove_handler,State).
765
766       Module:handle_info(Info, State) -> Result
767
768              Types:
769
770                 Info = term()
771                 State = term()
772                 Result = {ok,NewState} | {ok,NewState,hibernate}
773                  | {swap_handler,Args1,NewState,Handler2,Args2} | remove_han‐
774                 dler
775                  NewState = term()
776                  Args1 = Args2 = term()
777                  Handler2 = Module2 | {Module2,Id}
778                  Module2 = atom()
779                  Id = term()
780
781          Note:
782              This callback is optional, so callback modules need  not  export
783              it.  The  gen_event  module provides a default implementation of
784              this function that logs about the unexpected Info message, drops
785              it and returns {ok, State}.
786
787
788              This function is called for each installed event handler when an
789              event manager receives any other message than an event or a syn‐
790              chronous request (or a system message).
791
792              Info is the received message.
793
794              For  a description of State and possible return values, see Mod‐
795              ule:handle_event/2.
796
797       Module:init(InitArgs)   ->   {ok,State}   |   {ok,State,hibernate}    |
798       {error,Reason}
799
800              Types:
801
802                 InitArgs = Args | {Args,Term}
803                  Args = Term = term()
804                 State = term()
805                 Reason = term()
806
807              Whenever  a new event handler is added to an event manager, this
808              function is called to initialize the event handler.
809
810              If the event handler is added because of a call to add_handler/3
811              or  add_sup_handler/3,  InitArgs  is  the Args argument of these
812              functions.
813
814              If the event handler replaces another event handler because of a
815              call  to  swap_handler/3  or swap_sup_handler/3, or because of a
816              swap return tuple from one of the other callback functions, Ini‐
817              tArgs  is  a  tuple {Args,Term}, where Args is the argument pro‐
818              vided in the function call/return tuple and Term is  the  result
819              of terminating the old event handler, see swap_handler/3.
820
821              If    successful,    the    function   returns   {ok,State}   or
822              {ok,State,hibernate}, where State is the initial internal  state
823              of the event handler.
824
825              If {ok,State,hibernate} is returned, the event manager goes into
826              hibernation (by calling proc_lib:hibernate/3), waiting  for  the
827              next event to occur.
828
829       Module:terminate(Arg, State) -> term()
830
831              Types:
832
833                 Arg = Args | {stop,Reason} | stop | remove_handler
834                  | {error,{'EXIT',Reason}} | {error,Term}
835                  Args = Reason = Term = term()
836
837          Note:
838              This  callback  is optional, so callback modules need not export
839              it. The gen_event module provides a default implementation with‐
840              out cleanup.
841
842
843              Whenever an event handler is deleted from an event manager, this
844              function is called. It is to be the  opposite  of  Module:init/1
845              and do any necessary cleaning up.
846
847              If the event handler is deleted because of a call to delete_han‐
848              dler/3, swap_handler/3, or swap_sup_handler/3, Arg is  the  Args
849              argument of this function call.
850
851              Arg={stop,Reason}  if the event handler has a supervised connec‐
852              tion to a process that has terminated with reason Reason.
853
854              Arg=stop if the event handler is deleted because the event  man‐
855              ager is terminating.
856
857              The event manager terminates if it is part of a supervision tree
858              and it is ordered by its supervisor to terminate. Even if it  is
859              not  part of a supervision tree, it terminates if it receives an
860              'EXIT' message from its parent.
861
862              Arg=remove_handler if  the  event  handler  is  deleted  because
863              another   callback   function  has  returned  remove_handler  or
864              {remove_handler,Reply}.
865
866              Arg={error,Term} if the event handler is deleted because a call‐
867              back   function   returned   an   unexpected   value   Term,  or
868              Arg={error,{'EXIT',Reason}} if a callback function failed.
869
870              State is the internal state of the event handler.
871
872              The function can return  any  term.  If  the  event  handler  is
873              deleted  because  of  a  call to gen_event:delete_handler/3, the
874              return value of that function becomes the return value  of  this
875              function.  If  the  event handler is to be replaced with another
876              event handler because of a swap, the return value is  passed  to
877              the init function of the new event handler. Otherwise the return
878              value is ignored.
879

SEE ALSO

881       supervisor(3), sys(3)
882
883
884
885Ericsson AB                      stdlib 3.14.1                    gen_event(3)
Impressum