Generic supervisor bridge behavior.
This behavior module provides a supervisor bridge, a process that connects a subsystem not designed according to the OTP design principles to a supervision tree. The supervisor bridge sits between a supervisor and the subsystem. It behaves like a real supervisor to its own supervisor, but has a different interface than a real supervisor to the subsystem. For more information, see Supervisor Behaviour in OTP Design Principles.
A supervisor bridge assumes the functions for starting and stopping the subsystem to be located in a callback module exporting a predefined set of functions.
The sys(3)
module can be used
for debugging a supervisor bridge.
Unless otherwise stated, all functions in this module fail if the specified supervisor bridge does not exist or if bad arguments are specified.
Functions
start_link(Module, Args) -> Result
Module = module()
Args = term()
Result = {ok, Pid} | ignore | {error, Error}
Error = {already_started, Pid} | term()
Pid = pid()
start_link(SupBridgeName, Module, Args) -> Result
SupBridgeName = {local, Name} | {global, Name}
Name = atom()
Module = module()
Args = term()
Result = {ok, Pid} | ignore | {error, Error}
Error = {already_started, Pid} | term()
Pid = pid()
Creates a supervisor bridge process, linked to the calling process,
which calls
to start the subsystem.
To ensure a synchronized startup procedure, this function does
not return until
has returned.
-
If
, the supervisor bridge is registered locally asSupBridgeName ={local,Name }
usingName register/2
. -
If
, the supervisor bridge is registered globally asSupBridgeName ={global,Name }
usingName global:register_name/2
. -
If
, the supervisor bridge is registered asSupBridgeName ={via,Module ,Name }
using a registry represented byName Module . TheModule
callback is to export functionsregister_name/2
,unregister_name/1
, andsend/2
, which are to behave like the corresponding functions inglobal
. Thus,{via,global,GlobalName}
is a valid reference.
If no name is provided, the supervisor bridge is not registered.
is the name of the callback module.
is an arbitrary term that is passed as the
argument to
.
-
If the supervisor bridge and the subsystem are successfully started, the function returns
{ok,
, wherePid }
is is the pid of the supervisor bridge.Pid -
If there already exists a process with the specified
, the function returnsSupBridgeName {error,{already_started,
, wherePid }}
is the pid of that process.Pid -
If
returnsModule :init/1ignore
, this function returnsignore
as well and the supervisor bridge terminates with reasonnormal
. -
If
fails or returns an error tuple or an incorrect value, this function returnsModule :init/1{error,
, whereError r}
is a term with information about the error, and the supervisor bridge terminates with reasonError
.Error
Callback Functions
The following functions must be exported from a
supervisor_bridge
callback module.
Functions
Args = term()
Result = {ok,Pid,State} | ignore | {error,Error}
Pid = pid()
State = term()
Error = term()
Whenever a supervisor bridge is started using
start_link/2,3
,
this function is called
by the new process to start the subsystem and initialize.
Args
is the Args
argument provided to the start
function.
The function is to return {ok,Pid,State}
, where Pid
is the pid of the main process in the subsystem and State
is any term.
If later Pid
terminates with a reason Reason
,
the supervisor bridge terminates with reason Reason
as well.
If later the supervisor bridge is stopped by its supervisor with
reason Reason
, it calls
Module:terminate(Reason,State)
to terminate.
If the initialization fails, the function is to return
{error,Error}
, where Error
is any term,
or ignore
.
Reason = shutdown | term()
State = term()
This function is called by the supervisor bridge when it is about
to terminate. It is to be the opposite of Module:init/1
and stop the subsystem and do any necessary cleaning up.
The return value is ignored.
Reason
is shutdown
if the supervisor bridge is
terminated by its supervisor. If the supervisor bridge terminates
because a a linked process (apart from the main process of
the subsystem) has terminated with reason Term
,
then Reason
becomes Term
.
State
is taken from the return value of
Module:init/1
.