From 68d53c01b0b8e9a007a6a30158c19e34b2d2a34e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= Date: Wed, 18 May 2016 15:53:35 +0200 Subject: Update STDLIB documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language cleaned up by the technical writers xsipewe and tmanevik from Combitech. Proofreading and corrections by Björn Gustavsson and Hans Bolinder. --- lib/stdlib/doc/src/gen_server.xml | 1063 ++++++++++++++++++++----------------- 1 file changed, 575 insertions(+), 488 deletions(-) (limited to 'lib/stdlib/doc/src/gen_server.xml') diff --git a/lib/stdlib/doc/src/gen_server.xml b/lib/stdlib/doc/src/gen_server.xml index 10dc978afc..4a7dd60858 100644 --- a/lib/stdlib/doc/src/gen_server.xml +++ b/lib/stdlib/doc/src/gen_server.xml @@ -29,18 +29,21 @@ gen_server - Generic Server Behaviour + Generic server behavior. -

A behaviour module for implementing the server of a client-server - relation. A generic server process (gen_server) implemented using - this module will have a standard set of interface functions and - include functionality for tracing and error reporting. It will - also fit into an OTP supervision tree. Refer to - OTP Design Principles for more information.

-

A gen_server assumes all specific parts to be located in a - callback module exporting a pre-defined set of functions. - The relationship between the behaviour functions and the callback - functions can be illustrated as follows:

+

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
 -----------------            ---------------
@@ -59,175 +62,65 @@ gen_server:abcast     -----> Module:handle_cast/2
 
 -                     -----> Module:terminate/2
 
--                     -----> Module:code_change/3    
-

If a callback function fails or returns a bad value, - the gen_server will terminate.

-

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

-

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

+- -----> 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(3). 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 does not exist or if bad arguments are - given.

- -

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

+ 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.

+ - start_link(Module, Args, Options) -> Result - start_link(ServerName, Module, Args, Options) -> Result - Create a gen_server process in a supervision tree. - - ServerName = {local,Name} | {global,GlobalName} - | {via,Module,ViaName} -  Name = atom() -  GlobalName = ViaName = term() - Module = atom() - Args = term() - Options = [Option] -  Option = {debug,Dbgs} | {timeout,Time} | {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. - The function should be called, directly or indirectly, by - the supervisor. It will, among other things, ensure that - the gen_server is linked to the supervisor.

-

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

-

If ServerName={local,Name} the gen_server is - registered locally as Name using register/2. - If ServerName={global,GlobalName} the gen_server is - registered globally as GlobalName using - global:register_name/2. If no name is provided, - the gen_server is not registered. - If ServerName={via,Module,ViaName}, the gen_server will - register with the registry represented by Module. - The Module callback should export the functions - register_name/2, unregister_name/1, - whereis_name/1 and send/2, which should 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 an arbitrary term which is passed as - the argument to Module:init/1.

-

If the option {timeout,Time} is present, - the gen_server is allowed to spend Time milliseconds - initializing or it will be terminated and the start function - will return {error,timeout}. -

-

If the option {debug,Dbgs} is present, - the corresponding sys function will be called for each - item in Dbgs. See - sys(3).

-

If the option {spawn_opt,SOpts} is present, - SOpts will be passed as option list to - the spawn_opt BIF which is used to spawn - the gen_server. See - erlang(3).

- -

Using the spawn option monitor is currently not - allowed, but will cause the function to fail with reason - badarg.

-
-

If the gen_server is successfully created and initialized - the function returns {ok,Pid}, where Pid is - the pid of the gen_server. If there already exists a process - with the specified ServerName 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.

-
-
- - start(Module, Args, Options) -> Result - start(ServerName, Module, Args, Options) -> Result - Create a stand-alone gen_server process. - - ServerName = {local,Name} | {global,GlobalName} - | {via,Module,ViaName} -  Name = atom() -  GlobalName = ViaName = term() - Module = atom() - Args = term() - Options = [Option] -  Option = {debug,Dbgs} | {timeout,Time} | {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 stand-alone gen_server process, i.e. a gen_server - which is not part of a supervision tree and thus has no - supervisor.

-

See start_link/3,4 - for a description of arguments and return values.

-
-
- - stop(ServerRef) -> ok - stop(ServerRef, Reason, Timeout) -> ok - Synchronously stop a generic server. + abcast(Name, Request) -> abcast + abcast(Nodes, Name, Request) -> abcast + Send an asynchronous request to many generic servers. - ServerRef = Name | {Name,Node} | {global,GlobalName} - | {via,Module,ViaName} | pid() + Nodes = [Node]  Node = atom() -  GlobalName = ViaName = term() - Reason = term() - Timeout = int()>0 | infinity + Name = atom() + Request = term() -

Orders a generic server to exit with the - given Reason and waits for it to terminate. The - gen_server will call - 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} will cause an - error report to be issued using - error_logger:format/2. - The default Reason is normal.

-

Timeout is an integer greater than zero which - specifies how many milliseconds to wait for the server to - terminate, or the atom infinity to wait - indefinitely. The default value is 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.

+

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 Make a synchronous call to a generic server. - ServerRef = Name | {Name,Node} | {global,GlobalName} - | {via,Module,ViaName} | pid() + ServerRef = Name | {Name,Node} | {global,GlobalName} +   | {via,Module,ViaName} | pid()  Node = atom()  GlobalName = ViaName = term() Request = term() @@ -235,47 +128,126 @@ gen_server:abcast -----> Module:handle_cast/2 Reply = term() -

Makes a synchronous call to the gen_server ServerRef +

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

-

ServerRef can be:

+ 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 is locally registered, - {Name,Node}, if the gen_server is locally - registered at another node, or - {global,GlobalName}, if the gen_server is - globally registered. - {via,Module,ViaName}, if the gen_server is - registered through an alternative process registry. + 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 an arbitrary term which is passed as one of +

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

-

Timeout is an integer greater than zero which +

Timeout is an integer greater than zero that specifies how many milliseconds to wait for a reply, or - the atom infinity to wait indefinitely. Default value - is 5000. If no reply is received within the specified time, + 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 may arrive at any time later into the caller's message queue. + 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 may fail for several reasons, including timeout and - the called gen_server dying before or during the call.

-

The ancient behaviour of sometimes consuming the server +

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

+ +

The ancient behavior of sometimes consuming the server exit message if the server died during the call while - linked to the client has been removed in OTP R12B/Erlang 5.6.

+ linked to the client was removed in Erlang 5.6/OTP R12B.

+
+ + + cast(ServerRef, Request) -> ok + Send an asynchronous request to a generic server. + + 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.

+
+
+ + + enter_loop(Module, Options, State) + enter_loop(Module, Options, State, ServerName) + enter_loop(Module, Options, State, Timeout) + enter_loop(Module, Options, State, ServerName, Timeout) + Enter the gen_server receive loop. + + Module = atom() + Options = [Option] +  Option = {debug,Dbgs} +   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(3). 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]/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 - Make a synchronous call to several generic servers. + Make a synchronous call to many generic servers. Nodes = [Node]  Node = atom() @@ -288,203 +260,339 @@ gen_server:abcast -----> Module:handle_cast/2 BadNodes = [Node] -

Makes a synchronous call to all gen_servers locally +

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 waiting for - the replies. The gen_servers will call - Module:handle_call/3 to handle the request.

-

The function returns a tuple {Replies,BadNodes} where + 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 + or where the gen_server Name did not exist or did not reply.

Nodes is a list of node names to which the request - should be sent. Default value is the list of all known nodes + 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.

-

Request is an arbitrary term which is passed as one of + gen_server process.

+

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

-

Timeout is an integer greater than zero which +

Timeout is an integer greater than zero that specifies how many milliseconds to wait for each reply, or - the atom infinity to wait indefinitely. Default value - is infinity. If no reply is received from a node within + 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 at - a node Node, {Node,Reply} is added to +

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.

-

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

+

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 timeout) from polluting - the caller's message queue, a middleman process is used to - do the actual calls. Late answers will then be discarded +

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.

+ - cast(ServerRef, Request) -> ok - Send an asynchronous request to a generic server. + reply(Client, Reply) -> Result + Send a reply to a client. - ServerRef = Name | {Name,Node} | {global,GlobalName} - | {via,Module,ViaName} | pid() -  Node = atom() -  GlobalName = ViaName = term() - Request = term() + Client - see below + Reply = term() + Result = term() -

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

-

See call/2,3 for a - description of ServerRef.

-

Request is an arbitrary term which is passed as one - of the arguments to Module:handle_cast/2.

+

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.

+

The return value Result is not further defined, and + is always to be ignored.

+ - abcast(Name, Request) -> abcast - abcast(Nodes, Name, Request) -> abcast - Send an asynchronous request to several generic servers. + start(Module, Args, Options) -> Result + start(ServerName, Module, Args, Options) -> Result + Create a standalone gen_server process. - Nodes = [Node] -  Node = atom() - Name = atom() - Request = term() + ServerName = {local,Name} | {global,GlobalName} +   | {via,Module,ViaName} +  Name = atom() +  GlobalName = ViaName = term() + Module = atom() + Args = term() + Options = [Option] +  Option = {debug,Dbgs} | {timeout,Time} | {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() -

Sends an asynchronous request to the gen_servers 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_servers will call Module:handle_cast/2 to - handle the request.

-

See - multi_call/2,3,4 - for a description of the arguments.

+

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.

+ - reply(Client, Reply) -> Result - Send a reply to a client. + start_link(Module, Args, Options) -> Result + start_link(ServerName, Module, Args, Options) -> Result + Create a gen_server process in a supervision tree. + - Client - see below - Reply = term() - Result = term() + ServerName = {local,Name} | {global,GlobalName} +   | {via,Module,ViaName} +  Name = atom() +  GlobalName = ViaName = term() + Module = atom() + Args = term() + Options = [Option] +  Option = {debug,Dbgs} | {timeout,Time} | {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() -

This function can be used by a gen_server 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 an arbitrary term, - which will be given back to the client as the return value of - call/2,3 or multi_call/2,3,4.

-

The return value Result is not further defined, and - should always be ignored.

+

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 {debug,Dbgs} is present, + the corresponding sys function is called for each + item in Dbgs; see + sys(3).

+
+ +

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.

+
+
+ +

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.

+ - enter_loop(Module, Options, State) - enter_loop(Module, Options, State, ServerName) - enter_loop(Module, Options, State, Timeout) - enter_loop(Module, Options, State, ServerName, Timeout) - Enter the gen_server receive loop + stop(ServerRef) -> ok + stop(ServerRef, Reason, Timeout) -> ok + Synchronously stop a generic server. - Module = atom() - Options = [Option] -  Option = {debug,Dbgs} -   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() + ServerRef = Name | {Name,Node} | {global,GlobalName} +   | {via,Module,ViaName} | pid() +  Node = atom()  GlobalName = ViaName = term() - Timeout = int() | infinity + Reason = term() + Timeout = int()>0 | infinity -

Makes an existing process into a gen_server. Does not return, - instead the calling process will enter the gen_server receive - loop and become a gen_server process. The process - must have been started using one of the start - functions in proc_lib, see - proc_lib(3). 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 behaviour provides.

-

Module, Options and ServerName have - the same meanings as when calling - gen_server:start[_link]/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. - Also, the callback module Module does not need to - export an init/1 function.

-

Failure: If the calling process was not started by a - proc_lib start function, or if it is not registered - according to ServerName.

+

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 + + error_logger:format/2. + 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.

- CALLBACK FUNCTIONS + Callback Functions

The following functions - should be exported from a gen_server callback module.

+ are to be exported from a gen_server callback module.

+ - Module:init(Args) -> Result - Initialize process and internal state. + Module:code_change(OldVsn, State, Extra) -> {ok, NewState} | {error, Reason} + Update the internal state during upgrade/downgrade. - Args = term() - Result = {ok,State} | {ok,State,Timeout} | {ok,State,hibernate} -  | {stop,Reason} | ignore -  State = term() -  Timeout = int()>=0 | infinity -  Reason = term() + OldVsn = Vsn | {down, Vsn} +   Vsn = term() + State = NewState = term() + Extra = term() + Reason = term() - -

Whenever a gen_server is started using - gen_server:start/3,4 or - gen_server: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 should - return {ok,State}, {ok,State,Timeout} or {ok,State,hibernate}, where - State is the internal state of the gen_server.

-

If an integer timeout value is provided, a timeout will occur - unless a request or a message is received within - Timeout milliseconds. A timeout is represented by - the atom timeout which should be handled by - the 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 timeout value, the process will go - into hibernation when waiting for the next message to arrive (by calling - proc_lib:hibernate/3).

-

If something goes wrong during the initialization - the function should return {stop,Reason} where - Reason is any term, or ignore.

+

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 + Optional function for providing a term describing the + current gen_server status. + + Opt = normal | terminate + PDict = [{Key, Value}] + State = term() + Status = term() + + + +

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 Handle a synchronous request. @@ -493,9 +601,9 @@ gen_server:abcast -----> Module:handle_cast/2 From = {pid(),Tag} State = term() Result = {reply,Reply,NewState} | {reply,Reply,NewState,Timeout} -   | {reply,Reply,NewState,hibernate} +   | {reply,Reply,NewState,hibernate}   | {noreply,NewState} | {noreply,NewState,Timeout} -   | {noreply,NewState,hibernate} +   | {noreply,NewState,hibernate}   | {stop,Reason,Reply,NewState} | {stop,Reason,NewState}  Reply = term()  NewState = term() @@ -503,38 +611,52 @@ gen_server:abcast -----> Module:handle_cast/2  Reason = term() -

Whenever a gen_server receives a request sent using - gen_server:call/2,3 or - gen_server:multi_call/2,3,4, +

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 +

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.

-

If the function returns {reply,Reply,NewState}, - {reply,Reply,NewState,Timeout} or - {reply,Reply,NewState,hibernate}, Reply will be - 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 then continues - executing with the possibly updated internal state - NewState. See Module:init/1 for a description - of Timeout and hibernate.

-

If the functions returns {noreply,NewState}, - {noreply,NewState,Timeout} or {noreply,NewState,hibernate}, - the gen_server will - continue executing with NewState. Any reply to - From must be given explicitly using - gen_server:reply/2.

-

If the function returns {stop,Reason,Reply,NewState}, - Reply will be given back to From. If - the function returns {stop,Reason,NewState}, any reply - to From must be given explicitly using - gen_server:reply/2. The gen_server will then call - Module:terminate(Reason,NewState) and terminate.

+

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 Handle an asynchronous request. @@ -549,37 +671,82 @@ gen_server:abcast -----> Module:handle_cast/2  Reason = term() -

Whenever a gen_server receives a request sent using - gen_server:cast/2 or - gen_server:abcast/2,3, +

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

-

See Module:handle_call/3 for a description of - the arguments and possible return values.

+

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

+ Module:handle_info(Info, State) -> Result Handle an incoming message. Info = timeout | term() State = term() - Result = {noreply,NewState} | {noreply,NewState,Timeout} -   | {noreply,NewState,hibernate} + Result = {noreply,NewState} | {noreply,NewState,Timeout} +   | {noreply,NewState,hibernate}   | {stop,Reason,NewState}  NewState = term()  Timeout = int()>=0 | infinity  Reason = normal | term() -

This function is called by a gen_server when a timeout - occurs or when it receives any other message than a +

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 timeout +

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

-

See Module:handle_call/3 for a description of - the other arguments and possible return values.

+

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

+
+
+ + + Module:init(Args) -> Result + Initialize process and internal state. + + Args = term() + Result = {ok,State} | {ok,State,Timeout} | {ok,State,hibernate} +  | {stop,Reason} | ignore +  State = term() +  Timeout = int()>=0 | infinity +  Reason = term() + + +

Whenever a gen_server process is started using + start/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 + 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 the initialization fails, the function is to return + {stop,Reason}, where Reason is any term, or + ignore.

+ Module:terminate(Reason, State) Clean up before termination. @@ -588,137 +755,57 @@ gen_server:abcast -----> Module:handle_cast/2 State = term() -

This function is called by a gen_server when it is about to - terminate. It should be the opposite of Module:init/1 +

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 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.

-

Reason depends on why the gen_server is terminating. - If it is because another callback function has returned a - stop tuple {stop,..}, Reason will have - the value specified in that tuple. If it is due to a failure, + 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 is part of a supervision tree and is - ordered by its supervisor to terminate, this function will be +

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 has been set to trap exit signals, and - the shutdown strategy as defined in the supervisor's - child specification is an integer timeout value, not - brutal_kill. + +

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 is not part of a supervision tree, - this function will be called if it receives an 'EXIT' - message from its parent. Reason will be the same as in - the 'EXIT' message.

-

Otherwise, the gen_server will be immediately terminated.

-

Note that for any other reason than normal, - shutdown, or {shutdown,Term} the gen_server is - assumed to terminate due to an error and - an error report is issued using - error_logger:format/2.

-
-
- - Module:code_change(OldVsn, State, Extra) -> {ok, NewState} | {error, Reason} - Update the internal state during upgrade/downgrade. - - OldVsn = Vsn | {down, Vsn} -   Vsn = term() - State = NewState = term() - Extra = term() - Reason = term() - - -

This function is called by a gen_server when it should - update its internal state during a release upgrade/downgrade, - i.e. when the instruction {update,Module,Change,...} - where Change={advanced,Extra} is given in - the appup file. See - OTP Design Principles - for more information.

-

In the case of an upgrade, OldVsn is Vsn, and - in the case of 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.

-

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

-

If successful, the function shall return the updated - internal state.

-

If the function returns {error,Reason}, the ongoing - upgrade will fail and roll back to the old release.

-
-
- - Module:format_status(Opt, [PDict, State]) -> Status - Optional function for providing a term describing the - current gen_server status. - - Opt = normal | terminate - PDict = [{Key, Value}] - State = term() - Status = term() - - - -

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 when:

- - One - of sys:get_status/1,2 - is invoked to get the gen_server status. Opt is set - to the atom normal for this case. - The gen_server terminates abnormally and logs an - error. Opt is set to the atom terminate for this - case. - -

This function is useful for customising the form and - appearance of the gen_server status for these cases. A - callback module wishing to customise - 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.

-

PDict is the current value of the gen_server's - process dictionary.

-

State is the internal state of the gen_server.

-

The function should return Status, a term that - customises the details of the current state and status of - the gen_server. 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 isn't - required, but doing so will make 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 having large state terms - printed in logfiles.

+

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 + + error_logger:format/2.

- SEE ALSO -

gen_event(3), - gen_fsm(3), - gen_statem(3), - supervisor(3), - proc_lib(3), - sys(3)

+ See Also +

gen_event(3), + gen_fsm(3), + gen_statem(3), + proc_lib(3), + supervisor(3), + sys(3)

-- cgit v1.2.3