gen_server(3erl) Erlang Module Definition gen_server(3erl)
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 relation-
ship 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 automati-
cally, this must be explicitly initiated in the callback module.
Unless otherwise stated, all functions in this module fail if the spec-
ified gen_server process does not exist or if bad arguments are speci-
fied.
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.
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 lo-
cally 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 pro-
cesses 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:han-
dle_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 regis-
tered through an alternative process registry
Request is any term that is passed as the first argument to Mod-
ule: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 Mod-
ule: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, Server-
Ref}}
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 re-
quest made with send_request/2. If Msg is a reply to the handle
RequestId the result of the request is returned in Reply. Other-
wise returns no_reply and no cleanup is done, and thus the func-
tion must be invoked repeatedly until a reply is returned.
The return value Reply is defined in the return value of Mod-
ule: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,HibernateAfterTime-
out}
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 initializa-
tion of the process, including registering a name for it.
This function is useful when a more complex initialization pro-
cedure 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 be-
fore 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 re-
quest to every node and then waits for the replies. The
gen_server process calls Module:handle_call/3 to handle the re-
quest.
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 Mod-
ule: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.
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 func-
tion. 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 wait_response/2 or check_response/2 to fetch
the actual result of the request.
The call gen_server:wait_response(gen_server:send_re-
quest(ServerRef,Request), Timeout) can be seen as equivalent to
gen_server:call(Server,Request,Timeout), ignoring the error han-
dling.
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 regis-
tered through an alternative process registry
Request is any term that is passed as the first argument to Mod-
ule: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_af-
ter,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_af-
ter,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 super-
visor. 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 en-
sure 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 regis-
tered locally as Name using register/2.
* If ServerName={global,GlobalName}, the gen_server process id
registered globally as GlobalName using global:regis-
ter_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 Mod-
ule callback is to export the functions register_name/2, un-
register_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 Mod-
ule: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 Hi-
bernateAfterTimeout milliseconds and if no message is re-
ceived, 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 func-
tion to fail with reason badarg.
If the gen_server process is successfully created and initial-
ized, 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,{al-
ready_started,Pid}}, where Pid is the pid of that process.
If Module:init/1 fails with Reason, the function returns {er-
ror,Reason}. If Module:init/1 returns {stop,Reason} or ignore,
the process is terminated and the function returns {error,Rea-
son} or ignore, respectively.
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_af-
ter,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 cre-
ated 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 Mod-
ule:terminate/2 before exiting.
The function returns ok if the server terminates with the ex-
pected reason. Any other reason than normal, shutdown, or {shut-
down,Term} causes an error report to be issued using log-
ger(3erl). 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, Server-
Ref}}
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 speci-
fies how many milliseconds to wait for an reply, or the atom in-
finity 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 Mod-
ule:handle_call/3.
The function returns an error if the gen_server dies before or
during this request.
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 im-
plemented 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 er-
ror. 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 in-
stance 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 de-
tails 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 recom-
mended 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,Time-
out}
| {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,New-
State,Timeout} or {reply,Reply,NewState,hibernate}, Reply is
given back to From as the return value of call/2,3 or in-
cluded in the return value of multi_call/2,3,4. The
gen_server process then continues executing with the possi-
bly updated internal state NewState.
For a description of Timeout and hibernate, see Mod-
ule:init/1.
* If {noreply,NewState} is returned, {noreply,NewState,Time-
out}, 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 re-
quest.
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 pre-
vious 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 split-
ting 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,hiber-
nate}
| {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}, or {ok,State,hibernate}, where
State is the internal state of the gen_server process.
If an integer time-out value is provided, a time-out occurs un-
less a request or a message is received within Timeout millisec-
onds. 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 de-
fault 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 the initialization fails, the function is to return
{stop,Reason}, where Reason is any term, or ignore.
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 in-
ternal 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 tu-
ple {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 bru-
tal_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 log-
ger(3erl).
SEE ALSO
gen_event(3erl), gen_statem(3erl), proc_lib(3erl), supervisor(3erl),
sys(3erl)
Ericsson AB stdlib 3.13 gen_server(3erl)