logo
Free, unlimited AI code reviews that run on commit
git-lrc git-lrc GitHub Install Now We'd appreciate a star git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt

gen_server - Generic server behavior.

Callback Functions

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

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

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.

Name

       gen_server - Generic server behavior.

See Also

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

Ericsson AB                                        stdlib 3.17                                  gen_server(3erl)

See Also