Provided by: erlang-manpages_24.2.1+dfsg-1ubuntu0.5_all bug

NAME

       gen_server - Generic server behavior.

DESCRIPTION

       This  behavior  module  provides  the  server  of  a  client-server  relation.  A  generic server process
       (gen_server) implemented using this module has  a  standard  set  of  interface  functions  and  includes
       functionality  for  tracing  and  error  reporting.  It  also fits into an OTP supervision tree. For more
       information, see section  gen_server Behaviour in OTP Design Principles.

       A gen_server process assumes all specific parts to be located in a callback module exporting a predefined
       set of functions. The relationship between the behavior  functions  and  the  callback  functions  is  as
       follows:

       gen_server module            Callback module
       -----------------            ---------------
       gen_server:start
       gen_server:start_monitor
       gen_server:start_link -----> Module:init/1

       gen_server:stop       -----> Module:terminate/2

       gen_server:call
       gen_server:send_request
       gen_server:multi_call -----> Module:handle_call/3

       gen_server:cast
       gen_server:abcast     -----> Module:handle_cast/2

       -                     -----> Module:handle_info/2

       -                     -----> Module:handle_continue/2

       -                     -----> Module:terminate/2

       -                     -----> Module:code_change/3

       If a callback function fails or returns a bad value, the gen_server process terminates.

       A  gen_server  process  handles system messages as described in sys(3erl). The sys module can be used for
       debugging a gen_server process.

       Notice that a gen_server process does not trap  exit  signals  automatically,  this  must  be  explicitly
       initiated in the callback module.

       Unless  otherwise  stated, all functions in this module fail if the specified gen_server process does not
       exist or if bad arguments are specified.

       The gen_server process can go into hibernation (see erlang:hibernate/3) if a callback function  specifies
       'hibernate'  instead  of  a time-out value. This can be useful if the server is expected to be idle for a
       long time. However, use this feature with care, as hibernation implies at least two  garbage  collections
       (when hibernating and shortly after waking up) and is not something you want to do between each call to a
       busy server.

       If  the  gen_server  process  needs to perform an action immediately after initialization or to break the
       execution of a callback into multiple steps, it can return {continue,Continue} in place of  the  time-out
       or hibernation value, which will immediately invoke the handle_continue/2 callback.

       If  the  gen_server  process  terminates, e.g. as a result of a function in the callback module returning
       {stop,Reason,NewState}, an exit signal with this Reason is  sent  to  linked  processes  and  ports.  See
       Processes in the Reference Manual for details regarding error handling using exit signals.

EXPORTS

       abcast(Name, Request) -> abcast
       abcast(Nodes, Name, Request) -> abcast

              Types:

                 Nodes = [Node]
                  Node = atom()
                 Name = atom()
                 Request = term()

              Sends  an  asynchronous  request  to  the  gen_server  processes locally registered as Name at the
              specified nodes. The function returns immediately and ignores nodes that do not  exist,  or  where
              the  gen_server  Name does not exist. The gen_server processes call Module:handle_cast/2 to handle
              the request.

              For a description of the arguments, see multi_call/2,3,4.

       call(ServerRef, Request) -> Reply
       call(ServerRef, Request, Timeout) -> Reply

              Types:

                 ServerRef = Name | {Name,Node} | {global,GlobalName}
                  | {via,Module,ViaName} | pid()
                  Node = atom()
                  GlobalName = ViaName = term()
                 Request = term()
                 Timeout = int()>0 | infinity
                 Reply = term()

              Makes a synchronous call to the ServerRef of the gen_server  process  by  sending  a  request  and
              waiting   until   a   reply   arrives   or   a  time-out  occurs.  The  gen_server  process  calls
              Module:handle_call/3 to handle the request.

              ServerRef can be any of the following:

                * The pid

                * Name, if the gen_server process is locally registered

                * {Name,Node}, if the gen_server process is locally registered at another node

                * {global,GlobalName}, if the gen_server process is globally registered

                * {via,Module,ViaName}, if the gen_server process is registered through an  alternative  process
                  registry

              Request is any term that is passed as the first argument to Module:handle_call/3.

              Timeout  is an integer greater than zero that specifies how many milliseconds to wait for a reply,
              or the atom infinity to wait indefinitely. Defaults to 5000. If no reply is  received  within  the
              specified  time, the function call fails. If the caller catches the failure and continues running,
              and the server is just late with the reply, it can arrive at any time later into the message queue
              of the caller. The caller must in this case be prepared for this  and  discard  any  such  garbage
              messages that are two element tuples with a reference as the first element.

              The return value Reply is defined in the return value of Module:handle_call/3.

              The  call  can  fail  for many reasons, including time-out and the called gen_server process dying
              before or during the call.

       cast(ServerRef, Request) -> ok

              Types:

                 ServerRef = Name | {Name,Node} | {global,GlobalName}
                  | {via,Module,ViaName} | pid()
                  Node = atom()
                  GlobalName = ViaName = term()
                 Request = term()

              Sends an asynchronous  request  to  the  ServerRef  of  the  gen_server  process  and  returns  ok
              immediately, ignoring if the destination node or gen_server process does not exist. The gen_server
              process calls Module:handle_cast/2 to handle the request.

              For a description of ServerRef, see call/2,3.

              Request is any term that is passed as one of the arguments to Module:handle_cast/2.

       check_response(Msg, RequestId) -> Result

              Types:

                 RequestId = term()
                 Result = {reply, Reply} | no_reply | {error, {Reason, ServerRef}}
                 Msg = Reply = term()
                 Timeout = timeout()
                 Reason = term()
                 ServerRef = Name | {Name,Node} | {global,GlobalName}
                  | {via,Module,ViaName} | pid()
                  Node = atom()
                  GlobalName = ViaName = term()

              This  function  is  used  to  check  if  a  previously received message, for example by receive or
              handle_info/2, is a result of a request made with send_request/2. If Msg is a reply to the  handle
              RequestId  the  result  of  the  request  is  returned in Reply. Otherwise returns no_reply and no
              cleanup is done, and thus the function must be invoked repeatedly until a reply is returned.

              The return value Reply is defined in the return value of Module:handle_call/3.

              The function returns an error if the gen_server dies before or during this request.

       enter_loop(Module, Options, State)
       enter_loop(Module, Options, State, ServerName)
       enter_loop(Module, Options, State, Timeout)
       enter_loop(Module, Options, State, ServerName, Timeout)

              Types:

                 Module = atom()
                 Options = [Option]
                  Option = {debug,Dbgs} | {hibernate_after,HibernateAfterTimeout}
                  Dbgs = [Dbg]
                  Dbg = trace | log | statistics
                  | {log_to_file,FileName} | {install,{Func,FuncState}}
                 State = term()
                 ServerName = {local,Name} | {global,GlobalName}
                  | {via,Module,ViaName}
                  Name = atom()
                  GlobalName = ViaName = term()
                 Timeout = int() | infinity

              Makes an existing process into a gen_server process. Does not return, instead the calling  process
              enters the gen_server process receive loop and becomes a gen_server process. The process must have
              been  started  using one of the start functions in proc_lib(3erl). The user is responsible for any
              initialization of the process, including registering a name for it.

              This function is useful when a more complex initialization procedure is needed than the gen_server
              process behavior provides.

              Module, Options, and ServerName have the same meanings as when calling  start[_link|_monitor]/3,4.
              However, if ServerName is specified, the process must have been registered accordingly before this
              function is called.

              State  and  Timeout  have  the same meanings as in the return value of Module:init/1. The callback
              module Module does not need to export an init/1 function.

              The function fails if the calling process was not started by a proc_lib start function, or  if  it
              is not registered according to ServerName.

       multi_call(Name, Request) -> Result
       multi_call(Nodes, Name, Request) -> Result
       multi_call(Nodes, Name, Request, Timeout) -> Result

              Types:

                 Nodes = [Node]
                  Node = atom()
                 Name = atom()
                 Request = term()
                 Timeout = int()>=0 | infinity
                 Result = {Replies,BadNodes}
                  Replies = [{Node,Reply}]
                  Reply = term()
                 BadNodes = [Node]

              Makes  a  synchronous call to all gen_server processes locally registered as Name at the specified
              nodes by first sending a request to every node and then waits  for  the  replies.  The  gen_server
              process calls Module:handle_call/3 to handle the request.

              The  function  returns  a  tuple  {Replies,BadNodes},  where Replies is a list of {Node,Reply} and
              BadNodes is a list of node that either did not exist, or where the gen_server Name did  not  exist
              or did not reply.

              Nodes is a list of node names to which the request is to be sent. Default value is the list of all
              known nodes [node()|nodes()].

              Name is the locally registered name of each gen_server process.

              Request is any term that is passed as the first argument to Module:handle_call/3.

              Timeout  is  an  integer  greater  than zero that specifies how many milliseconds to wait for each
              reply, or the atom infinity to wait indefinitely. Defaults to infinity. If no  reply  is  received
              from a node within the specified time, the node is added to BadNodes.

              When  a  reply Reply is received from the gen_server process at a node Node, {Node,Reply} is added
              to Replies. Reply is defined in the return value of Module:handle_call/3.

          Warning:
              If one of the nodes cannot process monitors, for example, C or  Java  nodes,  and  the  gen_server
              process  is  not  started  when  the requests are sent, but starts within 2 seconds, this function
              waits the whole Timeout, which may be infinity.

              This problem does not exist if all nodes are Erlang nodes.

              To prevent late answers (after the time-out) from polluting the message queue  of  the  caller,  a
              middleman  process  is used to do the calls. Late answers are then discarded when they arrive to a
              terminated process.

       receive_response(RequestId, Timeout) -> Result

              Types:

                 RequestId = term()
                 Result = {reply, Reply} | timeout | {error, {Reason, ServerRef}}
                 Reply = term()
                 Timeout = timeout()
                 Reason = term()
                 ServerRef = Name | {Name,Node} | {global,GlobalName}
                  | {via,Module,ViaName} | pid()
                  Node = atom()
                  GlobalName = ViaName = term()

              This function is used to receive a reply of a request made with  send_request/2  to  a  gen_server
              process. This function must be called from the same process from which send_request/2 was made.

              Timeout  is  an integer greater then or equal to zero that specifies how many milliseconds to wait
              for an reply, or the atom infinity to wait indefinitely.  If  no  reply  is  received  within  the
              specified  time,  the  function  returns  timeout.  Assuming  that  the  server executes on a node
              supporting aliases (introduced in OTP 24) no response will be received after a timeout. Otherwise,
              a garbage response might be received at a later time.

              The return value Reply is defined in the return value of Module:handle_call/3.

              The function returns an error if the gen_server dies before or during this request.

              The difference between wait_response() and receive_response() is that receive_response()  abandons
              the  request at timeout so that a potential future response is ignored, while wait_response() does
              not.

       reply(Client, Reply) -> ok

              Types:

                 Client - see below
                 Reply = term()

              This function can be used by a gen_server process to explicitly send a  reply  to  a  client  that
              called  call/2,3  or  multi_call/2,3,4,  when  the  reply cannot be defined in the return value of
              Module:handle_call/3.

              Client must be the From argument provided to the callback function. Reply is any term  given  back
              to the client as the return value of call/2,3 or multi_call/2,3,4.

       send_request(ServerRef, Request) -> RequestId

              Types:

                 ServerRef = Name | {Name,Node} | {global,GlobalName}
                  | {via,Module,ViaName} | pid()
                  Node = atom()
                  GlobalName = ViaName = term()
                 RequestId = term()
                 Timeout = int()>0 | infinity
                 Request = term()

              Sends  a  request  to  the ServerRef of the gen_server process and returns a handle RequestId. The
              return  value  RequestId  shall  later  be  used  with  receive_response/2,  wait_response/2,   or
              check_response/2 to fetch the actual result of the request.

              The call gen_server:wait_response(gen_server:send_request(ServerRef,Request), Timeout) can be seen
              as equivalent to gen_server:call(Server,Request,Timeout), ignoring the error handling.

              The gen_server process calls Module:handle_call/3 to handle the request.

              ServerRef can be any of the following:

                * The pid

                * Name, if the gen_server process is locally registered

                * {Name,Node}, if the gen_server process is locally registered at another node

                * {global,GlobalName}, if the gen_server process is globally registered

                * {via,Module,ViaName},  if  the gen_server process is registered through an alternative process
                  registry

              Request is any term that is passed as the first argument to Module:handle_call/3.

       start(Module, Args, Options) -> Result
       start(ServerName, Module, Args, Options) -> Result

              Types:

                 ServerName = {local,Name} | {global,GlobalName}
                  | {via,Module,ViaName}
                  Name = atom()
                  GlobalName = ViaName = term()
                 Module = atom()
                 Args = term()
                 Options = [Option]
                  Option  =  {debug,Dbgs}   |   {timeout,Time}   |   {hibernate_after,HibernateAfterTimeout}   |
                 {spawn_opt,SOpts}
                  Dbgs = [Dbg]
                  Dbg = trace | log | statistics | {log_to_file,FileName} | {install,{Func,FuncState}}
                  SOpts = [term()]
                 Result = {ok,Pid} | ignore | {error,Error}
                  Pid = pid()
                  Error = {already_started,Pid} | term()

              Creates  a  standalone  gen_server  process,  that  is, a gen_server process that is not part of a
              supervision tree and thus has no supervisor.

              For a description of arguments and return values, see start_link/3,4.

       start_link(Module, Args, Options) -> Result
       start_link(ServerName, Module, Args, Options) -> Result

              Types:

                 ServerName = {local,Name} | {global,GlobalName}
                  | {via,Module,ViaName}
                  Name = atom()
                  GlobalName = ViaName = term()
                 Module = atom()
                 Args = term()
                 Options = [Option]
                  Option  =  {debug,Dbgs}   |   {timeout,Time}   |   {hibernate_after,HibernateAfterTimeout}   |
                 {spawn_opt,SOpts}
                  Dbgs = [Dbg]
                  Dbg = trace | log | statistics | {log_to_file,FileName} | {install,{Func,FuncState}}
                  SOpts = [term()]
                 Result = {ok,Pid} | ignore | {error,Error}
                  Pid = pid()
                  Error = {already_started,Pid} | term()

              Creates  a  gen_server  process  as  part  of  a  supervision tree. This function is to be called,
              directly or indirectly, by the supervisor. For example, it ensures that the gen_server process  is
              linked to the supervisor.

              The  gen_server  process  calls  Module:init/1  to  initialize.  To  ensure a synchronized startup
              procedure, start_link/3,4 does not return until Module:init/1 has returned.

                * If ServerName={local,Name}, the  gen_server  process  is  registered  locally  as  Name  using
                  register/2.

                * If ServerName={global,GlobalName}, the gen_server process id registered globally as GlobalName
                  using global:register_name/2 If no name is provided, the gen_server process is not registered.

                * If  ServerName={via,Module,ViaName},  the  gen_server  process  registers  with  the  registry
                  represented by Module. The  Module  callback  is  to  export  the  functions  register_name/2,
                  unregister_name/1,  whereis_name/1,  and  send/2,  which  are to behave like the corresponding
                  functions in global. Thus, {via,global,GlobalName} is a valid reference.

              Module is the name of the callback module.

              Args is any term that is passed as the argument to Module:init/1.

                * If option {timeout,Time}  is  present,  the  gen_server  process  is  allowed  to  spend  Time
                  milliseconds initializing or it is terminated and the start function returns {error,timeout}.

                * If  option  {hibernate_after,HibernateAfterTimeout}  is present, the gen_server process awaits
                  any message for HibernateAfterTimeout milliseconds and if no message is received, the  process
                  goes into hibernation automatically (by calling proc_lib:hibernate/3).

                * If  option  {debug,Dbgs} is present, the corresponding sys function is called for each item in
                  Dbgs; see sys(3erl).

                * If option {spawn_opt,SOpts} is present, SOpts is passed as option list to the  spawn_opt  BIF,
                  which is used to spawn the gen_server process; see spawn_opt/2.

          Note:
              Using spawn option monitor is not allowed, it causes the function to fail with reason badarg.

              If  the gen_server process is successfully created and initialized, the function returns {ok,Pid},
              where Pid is the pid of the gen_server process. If a process with the specified ServerName  exists
              already, the function returns {error,{already_started,Pid}}, where Pid is the pid of that process.

              If  Module:init/1 fails with Reason, the function returns {error,Reason}. If Module:init/1 returns
              {stop,Reason} or ignore, the process is terminated and  the  function  returns  {error,Reason}  or
              ignore,  respectively.  An  exit  signal  with the same Reason (or normal if Module:init/1 returns
              ignore) is sent to linked processes and ports.

       start_monitor(Module, Args, Options) -> Result
       start_monitor(ServerName, Module, Args, Options) -> Result

              Types:

                 ServerName = {local,Name} | {global,GlobalName}
                  | {via,Module,ViaName}
                  Name = atom()
                  GlobalName = ViaName = term()
                 Module = atom()
                 Args = term()
                 Options = [Option]
                  Option  =  {debug,Dbgs}   |   {timeout,Time}   |   {hibernate_after,HibernateAfterTimeout}   |
                 {spawn_opt,SOpts}
                  Dbgs = [Dbg]
                  Dbg = trace | log | statistics | {log_to_file,FileName} | {install,{Func,FuncState}}
                  SOpts = [term()]
                 Result = {ok,{Pid,Mon}} | ignore | {error,Error}
                  Pid = pid()
                  Error = {already_started,Pid} | term()

              Creates  a  standalone  gen_server  process,  that  is, a gen_server process that is not part of a
              supervision tree (and thus has no supervisor) and atomically  sets  up  a  monitor  to  the  newly
              created server.

              For  a  description of arguments and return values, see start_link/3,4. Note that the return value
              on successful start differs from  start_link/3,4.  start_monitor/3,4  will  return  {ok,{Pid,Mon}}
              where Pid is the process identifier of the server, and Mon is a reference to the monitor set up to
              monitor  the  server.  If  the  start is not successful, the caller will be blocked until the DOWN
              message has been received and removed from the message queue.

       stop(ServerRef) -> ok
       stop(ServerRef, Reason, Timeout) -> ok

              Types:

                 ServerRef = Name | {Name,Node} | {global,GlobalName}
                  | {via,Module,ViaName} | pid()
                  Node = atom()
                  GlobalName = ViaName = term()
                 Reason = term()
                 Timeout = int()>0 | infinity

              Orders a generic server to exit with the specified Reason and  waits  for  it  to  terminate.  The
              gen_server process calls Module:terminate/2 before exiting.

              The  function  returns ok if the server terminates with the expected reason. Any other reason than
              normal, shutdown, or {shutdown,Term} causes an error report to be issued  using  logger(3erl).  An
              exit  signal  with  the  same  reason is sent to linked processes and ports. The default Reason is
              normal.

              Timeout is an integer greater than zero that specifies how  many  milliseconds  to  wait  for  the
              server  to  terminate,  or  the  atom  infinity to wait indefinitely. Defaults to infinity. If the
              server has not terminated within the specified time, a timeout exception is raised.

              If the process does not exist, a noproc exception is raised.

       wait_response(RequestId, Timeout) -> Result

              Types:

                 RequestId = term()
                 Result = {reply, Reply} | timeout | {error, {Reason, ServerRef}}
                 Reply = term()
                 Timeout = timeout()
                 Reason = term()
                 ServerRef = Name | {Name,Node} | {global,GlobalName}
                  | {via,Module,ViaName} | pid()
                  Node = atom()
                  GlobalName = ViaName = term()

              This function is used to wait for  a  reply  of  a  request  made  with  send_request/2  from  the
              gen_server  process.  This function must be called from the same process from which send_request/2
              was made.

              Timeout is an integer greater then or equal to zero that specifies how many milliseconds  to  wait
              for  an  reply,  or  the  atom  infinity  to wait indefinitely. If no reply is received within the
              specified time, the function returns timeout and no cleanup is done, and thus the function can  be
              invoked repeatedly until a reply is returned.

              The return value Reply is defined in the return value of Module:handle_call/3.

              The function returns an error if the gen_server dies before or during this request.

              The  difference between receive_response() and wait_response() is that receive_response() abandons
              the request at timeout so that a potential future response is ignored, while wait_response()  does
              not.

CALLBACK FUNCTIONS

       The following functions are to be exported from a gen_server callback module.

EXPORTS

       Module:code_change(OldVsn, State, Extra) -> {ok, NewState} | {error, Reason}

              Types:

                 OldVsn = Vsn | {down, Vsn}
                  Vsn = term()
                 State = NewState = term()
                 Extra = term()
                 Reason = term()

          Note:
              This  callback is optional, so callback modules need not export it. If a release upgrade/downgrade
              with Change={advanced,Extra} specified  in  the  appup  file  is  made  when  code_change/3  isn't
              implemented the process will crash with an undef exit reason.

              This  function  is called by a gen_server process when it is to update its internal state during a
              release  upgrade/downgrade,  that  is,  when  the  instruction  {update,Module,Change,...},  where
              Change={advanced,Extra}, is specifed in the appup file. For more information, see section  Release
              Handling Instructions in OTP Design Principles.

              For  an  upgrade,  OldVsn is Vsn, and for a downgrade, OldVsn is {down,Vsn}. Vsn is defined by the
              vsn attribute(s) of the old version of the  callback  module  Module.  If  no  such  attribute  is
              defined, the version is the checksum of the Beam file.

              State is the internal state of the gen_server process.

              Extra is passed "as is" from the {advanced,Extra} part of the update instruction.

              If successful, the function must return the updated internal state.

              If  the  function  returns  {error,Reason},  the  ongoing  upgrade fails and rolls back to the old
              release.

       Module:format_status(Opt, [PDict, State]) -> Status

              Types:

                 Opt = normal | terminate
                 PDict = [{Key, Value}]
                 State = term()
                 Status = term()

          Note:
              This callback is optional, so callback modules need not export it. The gen_server module  provides
              a default implementation of this function that returns the callback module state.

              This function is called by a gen_server process in the following situations:

                * One  of  sys:get_status/1,2  is  invoked  to get the gen_server status. Opt is set to the atom
                  normal.

                * The gen_server process terminates abnormally and logs  an  error.  Opt  is  set  to  the  atom
                  terminate.

              This  function  is  useful for changing the form and appearance of the gen_server status for these
              cases. A callback module wishing to change the sys:get_status/1,2 return value, as well as how its
              status appears in termination error logs, exports an instance of format_status/2  that  returns  a
              term describing the current status of the gen_server process.

              PDict is the current value of the process dictionary of the gen_server process..

              State is the internal state of the gen_server process.

              The  function is to return Status, a term that changes the details of the current state and status
              of the gen_server process. There are no restrictions on the form Status  can  take,  but  for  the
              sys:get_status/1,2 case (when Opt is normal), the recommended form for the Status value is [{data,
              [{"State",  Term}]}], where Term provides relevant details of the gen_server state. Following this
              recommendation is not required, but it makes the callback module status consistent with  the  rest
              of the sys:get_status/1,2 return value.

              One  use  for  this  function is to return compact alternative state representations to avoid that
              large state terms are printed in log files.

       Module:handle_call(Request, From, State) -> Result

              Types:

                 Request = term()
                 From = {pid(),Tag}
                 State = term()
                 Result = {reply,Reply,NewState} | {reply,Reply,NewState,Timeout}
                  | {reply,Reply,NewState,hibernate}
                  | {reply,Reply,NewState,{continue,Continue}}
                  | {noreply,NewState} | {noreply,NewState,Timeout}
                  | {noreply,NewState,hibernate}
                  | {noreply,NewState,{continue,Continue}}
                  | {stop,Reason,Reply,NewState} | {stop,Reason,NewState}
                  Reply = term()
                  NewState = term()
                  Timeout = int()>=0 | infinity
                  Continue = term()
                  Reason = term()

              Whenever a gen_server process receives a request sent using  call/2,3  or  multi_call/2,3,4,  this
              function is called to handle the request.

              Request is the Request argument provided to call or multi_call.

              From is a tuple {Pid,Tag}, where Pid is the pid of the client and Tag is a unique tag.

              State is the internal state of the gen_server process.

                * If      {reply,Reply,NewState}      is     returned,     {reply,Reply,NewState,Timeout}     or
                  {reply,Reply,NewState,hibernate}, Reply is given back to From as the return value of  call/2,3
                  or  included  in  the  return value of multi_call/2,3,4. The gen_server process then continues
                  executing with the possibly updated internal state NewState.

                  For a description of Timeout and hibernate, see Module:init/1.

                * If      {noreply,NewState}       is       returned,       {noreply,NewState,Timeout},       or
                  {noreply,NewState,hibernate},  the  gen_server  process continues executing with NewState. Any
                  reply to From must be specified explicitly using reply/2.

                * If {stop,Reason,Reply,NewState} is returned, Reply is given back to From.

                * If {stop,Reason,NewState} is returned, any reply to From must be  specified  explicitly  using
                  reply/2. The gen_server process then calls Module:terminate(Reason,NewState) and terminates.

       Module:handle_cast(Request, State) -> Result

              Types:

                 Request = term()
                 State = term()
                 Result = {noreply,NewState} | {noreply,NewState,Timeout}
                  | {noreply,NewState,hibernate}
                  | {noreply,NewState,{continue,Continue}}
                  | {stop,Reason,NewState}
                  NewState = term()
                  Timeout = int()>=0 | infinity
                  Continue = term()
                  Reason = term()

              Whenever a gen_server process receives a request sent using cast/2 or abcast/2,3, this function is
              called to handle the request.

              For a description of the arguments and possible return values, see Module:handle_call/3.

       Module:handle_continue(Continue, State) -> Result

              Types:

                 Continue = term()
                 State = term()
                 Result = {noreply,NewState} | {noreply,NewState,Timeout}
                  | {noreply,NewState,hibernate}
                  | {noreply,NewState,{continue,Continue}}
                  | {stop,Reason,NewState}
                  NewState = term()
                  Timeout = int()>=0 | infinity
                  Continue = term()
                  Reason = normal | term()

          Note:
              This  callback  is  optional,  so  callback  modules  need  to  export  it  only  if  they  return
              {continue,Continue}  from  another  callback.  If  continue  is  used  and  the  callback  is  not
              implemented, the process will exit with undef error.

              This  function  is  called by a gen_server process whenever a previous callback returns {continue,
              Continue}. handle_continue/2 is invoked immediately after the previous callback,  which  makes  it
              useful  for  performing  work  after  initialization  or  for  splitting the work in a callback in
              multiple steps, updating the process state along the way.

              For a description of the other arguments and possible return values, see Module:handle_call/3.

       Module:handle_info(Info, State) -> Result

              Types:

                 Info = timeout | term()
                 State = term()
                 Result = {noreply,NewState} | {noreply,NewState,Timeout}
                  | {noreply,NewState,hibernate}
                  | {noreply,NewState,{continue,Continue}}
                  | {stop,Reason,NewState}
                  NewState = term()
                  Timeout = int()>=0 | infinity
                  Reason = normal | term()

          Note:
              This callback is optional, so callback modules need not export it. The gen_server module  provides
              a  default  implementation  of this function that logs about the unexpected Info message, drops it
              and returns {noreply, State}.

              This function is called by a gen_server process when a time-out occurs or  when  it  receives  any
              other message than a synchronous or asynchronous request (or a system message).

              Info is either the atom timeout, if a time-out has occurred, or the received message.

              For a description of the other arguments and possible return values, see Module:handle_call/3.

       Module:init(Args) -> Result

              Types:

                 Args = term()
                 Result = {ok,State} | {ok,State,Timeout} | {ok,State,hibernate}
                  | {ok,State,{continue,Continue}} | {stop,Reason} | ignore
                  State = term()
                  Timeout = int()>=0 | infinity
                  Reason = term()

              Whenever  a  gen_server  process is started using start/3,4, start_monitor/3,4, or start_link/3,4,
              this function is called by the new process to initialize.

              Args is the Args argument provided to the start function.

              If the initialization is successful, the function is  to  return  {ok,State},  {ok,State,Timeout},
              {ok,State,hibernate},  or  {ok,State,{continue,Continue}} where State is the internal state of the
              gen_server process.

              If an integer time-out value is provided, a time-out occurs unless  a  request  or  a  message  is
              received  within  Timeout milliseconds. A time-out is represented by the atom timeout, which is to
              be handled by the Module:handle_info/2 callback function. The atom infinity can be  used  to  wait
              indefinitely, this is the default value.

              If  hibernate  is  specified  instead  of a time-out value, the process goes into hibernation when
              waiting for the next message to arrive (by calling proc_lib:hibernate/3).

              If {continue,Continue}  is  specified,  the  process  will  execute  the  Module:handle_continue/2
              callback function, with Continue as the first argument.

              If the initialization fails, the function is to return {stop,Reason}, where Reason is any term, or
              ignore.  An  exit signal with this Reason (or with reason normal if ignore is returned) is sent to
              linked processes and ports, notably to the process starting the gen_server when start_link/3,4  is
              used.

       Module:terminate(Reason, State)

              Types:

                 Reason = normal | shutdown | {shutdown,term()} | term()
                 State = term()

          Note:
              This  callback is optional, so callback modules need not export it. The gen_server module provides
              a default implementation without cleanup.

              This function is called by a gen_server process when it is about to terminate. It  is  to  be  the
              opposite  of  Module:init/1  and  do  any  necessary  cleaning up. When it returns, the gen_server
              process terminates with Reason. The return value is ignored.

              Reason is a term denoting the stop reason and State  is  the  internal  state  of  the  gen_server
              process.

              Reason  depends  on  why  the gen_server process is terminating. If it is because another callback
              function has returned a stop tuple {stop,..}, Reason has the value specified in that tuple. If  it
              is because of a failure, Reason is the error reason.

              If  the  gen_server  process  is  part  of  a supervision tree and is ordered by its supervisor to
              terminate, this function is called with Reason=shutdown if the following conditions apply:

                * The gen_server process has been set to trap exit signals.

                * The shutdown strategy as defined in the child specification of the supervisor  is  an  integer
                  time-out value, not brutal_kill.

              Even  if  the  gen_server process is not part of a supervision tree, this function is called if it
              receives an 'EXIT' message from its parent. Reason is the same as in the 'EXIT' message.

              Otherwise, the gen_server process terminates immediately.

              Notice that for any other reason than normal, shutdown, or {shutdown,Term}, the gen_server process
              is assumed to terminate because of an error and an error report is issued using logger(3erl).

              When the gen_server process exits, an exit signal with the same reason is sent to linked processes
              and ports.

SEE ALSO

       gen_event(3erl), gen_statem(3erl), proc_lib(3erl), supervisor(3erl), sys(3erl)

Ericsson AB                                        stdlib 3.17                                  gen_server(3erl)