gen_tcp acceptor behaviour for use with
acceptor_pool.
Behaviours: acceptor_loop.
This module defines the acceptor behaviour.
Required callback functions: acceptor_init/3, acceptor_continue/3, acceptor_terminate/2.
This module provides a gen_tcp acceptor behaviour for use with
acceptor_pool. There are three callbacks.
acceptor_init/3:
-callback acceptor_init(SockName, LSock, Args) ->
{ok, State} | {ok, State, TimeoutOrHib} | ignore | {error, Reason} when
SockName :: acceptor_pool:name(),
LSock :: gen_tcp:socket(),
Args :: term(),
State :: term(),
TimeoutOrHib :: timeout() | hibernate,
Reason :: term().
SockName is the inet:sockname/1 of the listen socket, which may be
{{0,0,0,0}, Port} if bound to all ip addresses. LSock is the listen
socket and Args is the argument from the acceptor_pool:acceptor_spec/0
in the acceptor_pool. This callback should do any setup required before
trying to accept on the socket.
To be able to gracefully close open connections it is recommended for an
acceptor process to monitor(port, LSock) and gracefully close on receiving
the DOWN messages. This can be combined with the listen socket being shut
down before the acceptor_pool in the supervisor tree (e.g. after the
acceptor_pool in a rest_for_one or one_for_all) and the
acceptor_pool defining the grace specification.
To accept on the socket for Timeout timeout return
{ok, State, Timeout :: timeout()} with {ok, State} and
{ok, State, hibernate} being equivalent to {ok, State, infinity} wit the
later also causing the process to hibernate before trying to accept a
connection. State will be passed to either acceptor_continue/3 or
acceptor_continue/2.
To ignore this process and try again with another process return ignore, or
if an error occurs {error, term()}. Start errors always count towards the
restart intensity of the acceptor_pool, even with a restart of
temporary but ignore does not.
acceptor_continue/3:
-callback acceptor_continue(PeerName, Sock, State) -> no_return() when
PeerName :: acceptor_pool:name(),
Sock :: gen_tcp:socket(),
State :: term().
PeerName the inet:peername/1 of the accepted socket Sock and State is
the state returned by acceptor_init/3. The callback module now has full
control of the process and should enter its main loop, perhaps with
gen_statem:enter_loop/6.
It can be a long wait for a socket and so it possible for the State to have
been created using an old version of the module. During the wait the process
is hidden from the supervision tree and so hidden from the relup system.
However it is possible to load both acceptor and the acceptor callback
module during an appup with a soft post purge because neither module is on
the call stack.
acceptor_terminate/2:
-callback acceptor_terminate(Reason, State) -> any() when
Reason :: {shutdown, timeout | closed | system_limit | inet:posix()} |
term(),
State :: term().
Reason is the reason for termination, and the exit reason of the process.
If a socket error caused the termination the reason is
{shutdown, timeout | closed | system_limit | inet:posix()}. Otherwise the
reason is an exit signal from the acceptor_pool.
State is the state returned by acceptor_init/3.
option() = {spawn_opt, [proc_lib:spawn_option()]}
Generated by EDoc, Sep 19 2016, 00:22:34.