trusty (3) application.3erl.gz

Provided by: erlang-manpages_16.b.3-dfsg-1ubuntu2.2_all bug

NAME

       application - Generic OTP application functions

DESCRIPTION

       In OTP, application denotes a component implementing some specific functionality, that can be started and
       stopped as a unit, and which can be re-used  in  other  systems  as  well.  This  module  interfaces  the
       application  controller,  a  process  started  at every Erlang runtime system, and contains functions for
       controlling applications (for example starting  and  stopping  applications),  and  functions  to  access
       information about applications (for example configuration parameters).

       An  application  is  defined by an application specification. The specification is normally located in an
       application resource file called Application.app, where Application is the name of the application. Refer
       to app(5) for more information about the application specification.

       This  module can also be viewed as a behaviour for an application implemented according to the OTP design
       principles as a supervision tree. The definition of how to start and stop the tree should be  located  in
       an application callback module exporting a pre-defined set of functions.

       Refer to OTP Design Principles for more information about applications and behaviours.

DATA TYPES

       start_type() = normal
                    | {takeover, Node :: node()}
                    | {failover, Node :: node()}

       restart_type() = permanent | transient | temporary

       tuple_of(T)

              A tuple where the elements are of type T.

EXPORTS

       get_all_env() -> Env

       get_all_env(Application) -> Env

              Types:

                 Application = atom()
                 Env = [{Par :: atom(), Val :: term()}]

              Returns the configuration parameters and their values for Application. If the argument is omitted,
              it defaults to the application of the calling process.

              If the specified application is not loaded, or if the process executing the call does  not  belong
              to any application, the function returns [].

       get_all_key() -> [] | {ok, Keys}

       get_all_key(Application) -> undefined | Keys

              Types:

                 Application = atom()
                 Keys = {ok, [{Key :: atom(), Val :: term()}, ...]}

              Returns  the  application  specification keys and their values for Application. If the argument is
              omitted, it defaults to the application of the calling process.

              If the specified application is not  loaded,  the  function  returns  undefined.  If  the  process
              executing the call does not belong to any application, the function returns [].

       get_application() -> undefined | {ok, Application}

       get_application(PidOrModule) -> undefined | {ok, Application}

              Types:

                 PidOrModule = (Pid :: pid()) | (Module :: module())
                 Application = atom()

              Returns  the  name  of  the  application  to  which  the process Pid or the module Module belongs.
              Providing no argument is the same as calling get_application(self()).

              If the specified process does not belong to any application, or if the specified process or module
              does not exist, the function returns undefined.

       get_env(Par) -> undefined | {ok, Val}

       get_env(Application, Par) -> undefined | {ok, Val}

              Types:

                 Application = Par = atom()
                 Val = term()

              Returns  the value of the configuration parameter Par for Application. If the application argument
              is omitted, it defaults to the application of the calling process.

              If the specified application is not loaded, or the configuration parameter does not exist,  or  if
              the process executing the call does not belong to any application, the function returns undefined.

       get_env(Application, Par, Def) -> Val

              Types:

                 Application = Par = atom()
                 Def = Val = term()

              Works like get_env/2 but returns Def value when configuration parameter Par does not exist.

       get_key(Key) -> undefined | {ok, Val}

       get_key(Application, Key) -> undefined | {ok, Val}

              Types:

                 Application = Key = atom()
                 Val = term()

              Returns  the  value  of  the application specification key Key for Application. If the application
              argument is omitted, it defaults to the application of the calling process.

              If the specified application is not loaded, or the specification key does not  exist,  or  if  the
              process executing the call does not belong to any application, the function returns undefined.

       load(AppDescr) -> ok | {error, Reason}

       load(AppDescr, Distributed) -> ok | {error, Reason}

              Types:

                 AppDescr = Application | (AppSpec :: application_spec())
                 Application = atom()
                 Distributed = {Application, Nodes}
                             | {Application, Time, Nodes}
                             | default
                 Nodes = [node() | tuple_of(node())]
                 Time = integer() >= 1
                 Reason = term()
                 application_spec() =
                     {application,
                      Application :: atom(),
                      AppSpecKeys :: [application_opt()]}
                 application_opt() = {description, Description :: string()}
                                   | {vsn, Vsn :: string()}
                                   | {id, Id :: string()}
                                   | {modules, [Module :: module()]}
                                   | {registered, Names :: [Name :: atom()]}
                                   | {applications, [Application :: atom()]}
                                   | {included_applications,
                                      [Application :: atom()]}
                                   | {env, [{Par :: atom(), Val :: term()}]}
                                   | {start_phases,
                                      [{Phase :: atom(), PhaseArgs :: term()}] |
                                      undefined}
                                   | {maxT, MaxT :: timeout()}
                                   | {maxP, MaxP :: integer() >= 1 | infinity}
                                   | {mod,
                                      Start ::
                                          {Module :: module(),
                                           StartArgs :: term()}}

              Loads  the  application  specification for an application into the application controller. It will
              also load the application specifications for any included applications.  Note  that  the  function
              does not load the actual Erlang object code.

              The application can be given by its name Application. In this case the application controller will
              search the code path for the application resource file Application.app and load the  specification
              it contains.

              The  application  specification  can  also be given directly as a tuple AppSpec. This tuple should
              have the format and contents as described in app(5).

              If Distributed == {Application,[Time,]Nodes}, the application will be  distributed.  The  argument
              overrides  the  value  for  the  application  in  the  Kernel configuration parameter distributed.
              Application must be the name of the application (same as in the first argument). If a node crashes
              and  Time  has  been  specified,  then  the application controller will wait for Time milliseconds
              before attempting to restart the application on another node. If Time is not  specified,  it  will
              default to 0 and the application will be restarted immediately.

              Nodes  is a list of node names where the application may run, in priority from left to right. Node
              names can be grouped using tuples to indicate that they have the same priority. Example:

              Nodes = [cp1@cave, {cp2@cave, cp3@cave}]

              This means that the application should preferably be started at cp1@cave. If cp1@cave is down, the
              application should be started at either cp2@cave or cp3@cave.

              If  Distributed  ==  default,  the value for the application in the Kernel configuration parameter
              distributed will be used.

       loaded_applications() -> [{Application, Description, Vsn}]

              Types:

                 Application = atom()
                 Description = Vsn = string()

              Returns a list with information about the applications which have been loaded using load/1,2, also
              included  applications. Application is the application name. Description and Vsn are the values of
              its description and vsn application specification keys, respectively.

       permit(Application, Permission) -> ok | {error, Reason}

              Types:

                 Application = atom()
                 Permission = boolean()
                 Reason = term()

              Changes the permission for Application to run at the current node. The application must have  been
              loaded using load/1,2 for the function to have effect.

              If  the permission of a loaded, but not started, application is set to false, start will return ok
              but the application will not be started until the permission is set to true.

              If the permission of a running application is set to false, the application will  be  stopped.  If
              the permission later is set to true, it will be restarted.

              If the application is distributed, setting the permission to false means that the application will
              be started at, or moved to, another node according to how  its  distribution  is  configured  (see
              load/2 above).

              The  function  does  not return until the application is started, stopped or successfully moved to
              another node. However, in some cases where permission is set to true the function  may  return  ok
              even  though the application itself has not started. This is true when an application cannot start
              because it has dependencies to other applications which have not yet been started. When they  have
              been started, Application will be started as well.

              By  default,  all  applications  are  loaded  with permission true on all nodes. The permission is
              configurable by using the Kernel configuration parameter permissions.

       set_env(Application, Par, Val) -> ok

       set_env(Application, Par, Val, Timeout) -> ok

              Types:

                 Application = Par = atom()
                 Val = term()
                 Timeout = timeout()

              Sets the value of the configuration parameter Par for Application.

              set_env/3 uses the standard gen_server timeout value (5000 ms). A Timeout argument can be provided
              if another timeout value is useful, for example, in situations where the application controller is
              heavily loaded.

          Warning:
              Use this function only if you know what you are doing, that is, on your own  applications.  It  is
              very application and configuration parameter dependent when and how often the value is read by the
              application, and careless use of this function may put the application in a  weird,  inconsistent,
              and malfunctioning state.

       ensure_started(Application) -> ok | {error, Reason}

       ensure_started(Application, Type) -> ok | {error, Reason}

              Types:

                 Application = atom()
                 Type = restart_type()
                 Reason = term()

              Equivalent to application:start/1,2 except it returns ok for already started applications.

       ensure_all_started(Application) -> {ok, Started} | {error, Reason}

       ensure_all_started(Application, Type) ->
                             {ok, Started} | {error, Reason}

              Types:

                 Application = atom()
                 Type = restart_type()
                 Started = [atom()]
                 Reason = term()

              Equivalent  to calling application:start/1,2 repeatedly on all dependencies that have not yet been
              started for an application. The function returns {ok, AppNames} for a successful start or  for  an
              already  started  application  (which  are  however  omitted  from the AppNames list), and reports
              {error,  {AppName,Reason}}  for  errors,  where  Reason  is  any  possible  reason   returned   by
              application:start/1,2  when  starting a specific dependency. In case of an error, the applications
              that were started by the function are stopped to bring the set of running applications back to its
              initial state.

       start(Application) -> ok | {error, Reason}

       start(Application, Type) -> ok | {error, Reason}

              Types:

                 Application = atom()
                 Type = restart_type()
                 Reason = term()

              Starts  Application.  If  it  is  not  loaded, the application controller will first load it using
              load/1. It will make sure any included applications are loaded, but will not start them.  That  is
              assumed to be taken care of in the code for Application.

              The  application controller checks the value of the application specification key applications, to
              ensure that all applications that should be started before this application are running.  If  not,
              {error,{not_started,App}} is returned, where App is the name of the missing application.

              The application controller then creates an application master for the application. The application
              master is the group leader of all the processes in the application. The application master  starts
              the  application  by  calling  the  application callback function Module:start/2 as defined by the
              application specification key mod.

              The Type argument specifies the type of the application. If omitted, it defaults to temporary.

                * If a permanent application terminates, all other applications and the entire Erlang  node  are
                  also terminated.

                * If  a  transient  application  terminates with Reason == normal, this is reported but no other
                  applications are terminated. If a  transient  application  terminates  abnormally,  all  other
                  applications and the entire Erlang node are also terminated.

                * If  a  temporary  application  terminates,  this  is  reported  but  no other applications are
                  terminated.

              Note that it is always possible to stop an application explicitly by calling stop/1. Regardless of
              the type of the application, no other applications will be affected.

              Note  also  that  the  transient  type  is  of little practical use, since when a supervision tree
              terminates, the reason is set to shutdown, not normal.

       start_type() -> StartType | undefined | local

              Types:

                 StartType = start_type()

              This function is intended to be called  by  a  process  belonging  to  an  application,  when  the
              application is being started, to determine the start type which is either StartType or local.

              See Module:start/2 for a description of StartType.

              local is returned if only parts of the application is being restarted (by a supervisor), or if the
              function is called outside a startup.

              If the process executing the call does  not  belong  to  any  application,  the  function  returns
              undefined.

       stop(Application) -> ok | {error, Reason}

              Types:

                 Application = atom()
                 Reason = term()

              Stops Application. The application master calls Module:prep_stop/1, if such a function is defined,
              and then tells the top supervisor of the application  to  shutdown  (see  supervisor(3erl)).  This
              means that the entire supervision tree, including included applications, is terminated in reversed
              start order. After the shutdown,  the  application  master  calls  Module:stop/1.  Module  is  the
              callback module as defined by the application specification key mod.

              Last,  the  application  master  itself  terminates.  Note that all processes with the application
              master as group leader, i.e. processes spawned from a process belonging to the  application,  thus
              are terminated as well.

              When stopped, the application is still loaded.

              In  order  to  stop  a  distributed application, stop/1 has to be called on all nodes where it can
              execute (that is, on all nodes where it has been started). The call to stop/1 on  the  node  where
              the  application  currently  executes  will  stop its execution. The application will not be moved
              between nodes due to stop/1 being called on the node  where  the  application  currently  executes
              before stop/1 is called on the other nodes.

       takeover(Application, Type) -> ok | {error, Reason}

              Types:

                 Application = atom()
                 Type = restart_type()
                 Reason = term()

              Performs  a  takeover  of  the distributed application Application, which executes at another node
              Node.    At    the    current    node,    the    application    is    restarted     by     calling
              Module:start({takeover,Node},StartArgs).  Module  and  StartArgs  are  retrieved  from  the loaded
              application specification. The application at the other node is not stopped until the  startup  is
              completed, i.e. when Module:start/2 and any calls to Module:start_phase/3 have returned.

              Thus  two instances of the application will run simultaneously during the takeover, which makes it
              possible to transfer data from the old to the new instance. If this is  not  acceptable  behavior,
              parts  of  the  old  instance  may  be  shut  down when the new instance is started. Note that the
              application may not be stopped entirely however, at least the top supervisor must remain alive.

              See start/1,2 for a description of Type.

       unload(Application) -> ok | {error, Reason}

              Types:

                 Application = atom()
                 Reason = term()

              Unloads the application specification for Application from the  application  controller.  It  will
              also  unload  the application specifications for any included applications. Note that the function
              does not purge the actual Erlang object code.

       unset_env(Application, Par) -> ok

       unset_env(Application, Par, Timeout) -> ok

              Types:

                 Application = Par = atom()
                 Timeout = timeout()

              Removes the configuration parameter Par and its value for Application.

              unset_env/2 uses the standard gen_server timeout value  (5000  ms).  A  Timeout  argument  can  be
              provided  if  another  timeout  value  is useful, for example, in situations where the application
              controller is heavily loaded.

          Warning:
              Use this function only if you know what you are doing, that is, on your own  applications.  It  is
              very application and configuration parameter dependent when and how often the value is read by the
              application, and careless use of this function may put the application in a  weird,  inconsistent,
              and malfunctioning state.

       which_applications() -> [{Application, Description, Vsn}]

       which_applications(Timeout) -> [{Application, Description, Vsn}]

              Types:

                 Timeout = timeout()
                 Application = atom()
                 Description = Vsn = string()

              Returns a list with information about the applications which are currently running. Application is
              the application name. Description and Vsn are the values of its description  and  vsn  application
              specification keys, respectively.

              which_applications/0  uses the standard gen_server timeout value (5000 ms). A Timeout argument can
              be provided if another timeout value is useful, for example, in situations where  the  application
              controller is heavily loaded.

CALLBACK MODULE

       The following functions should be exported from an application callback module.

EXPORTS

       Module:start(StartType, StartArgs) -> {ok, Pid} | {ok, Pid, State} | {error, Reason}

              Types:

                 StartType = normal | {takeover,Node} | {failover,Node}
                  Node = node()
                 StartArgs = term()
                 Pid = pid()
                 State = term()

              This function is called whenever an application is started using application:start/1,2, and should
              start the processes of the application. If the application is  structured  according  to  the  OTP
              design principles as a supervision tree, this means starting the top supervisor of the tree.

              StartType defines the type of start:

                * normal if it's a normal startup.

                * normal  also  if  the  application  is  distributed  and  started at the current node due to a
                  failover from another node, and the application specification key start_phases == undefined.

                * {takeover,Node} if the application is distributed and started at the current  node  due  to  a
                  takeover  from  Node,  either  because  application:takeover/2  has been called or because the
                  current node has higher priority than Node.

                * {failover,Node} if the application is distributed and started at the current  node  due  to  a
                  failover from Node, and the application specification key start_phases /= undefined.

              StartArgs is the StartArgs argument defined by the application specification key mod.

              The  function  should return {ok,Pid} or {ok,Pid,State} where Pid is the pid of the top supervisor
              and State is any term. If omitted, State defaults to []. If  later  the  application  is  stopped,
              State is passed to Module:prep_stop/1.

       Module:start_phase(Phase, StartType, PhaseArgs) -> ok | {error, Reason}

              Types:

                 Phase = atom()
                 StartType = start_type()
                 PhaseArgs = term()
                 Pid = pid()
                 State = state()

              This function is used to start an application with included applications, when there is a need for
              synchronization between processes in the different applications during startup.

              The  start  phases  is  defined   by   the   application   specification   key   start_phases   ==
              [{Phase,PhaseArgs}].  For  included applications, the set of phases must be a subset of the set of
              phases defined for the including application.

              The function is called for each start phase (as defined  for  the  primary  application)  for  the
              primary application and all included applications, for which the start phase is defined.

              See Module:start/2 for a description of StartType.

       Module:prep_stop(State) -> NewState

              Types:

                 State = NewState = term()

              This  function  is  called  when  an  application is about to be stopped, before shutting down the
              processes of the application.

              State is the state returned from Module:start/2, or [] if no state was returned. NewState  is  any
              term and will be passed to Module:stop/1.

              The  function  is  optional.  If  it  is  not  defined,  the processes will be terminated and then
              Module:stop(State) is called.

       Module:stop(State)

              Types:

                 State = term()

              This function is called whenever an application has stopped. It is intended to be the opposite  of
              Module:start/2 and should do any necessary cleaning up. The return value is ignored.

              State  is  the  return  value of Module:prep_stop/1, if such a function exists. Otherwise State is
              taken from the return value of Module:start/2.

       Module:config_change(Changed, New, Removed) -> ok

              Types:

                 Changed = [{Par,Val}]
                 New = [{Par,Val}]
                 Removed = [Par]
                  Par = atom()
                  Val = term()

              This function is called by an application after a code replacement, if there are  any  changes  to
              the configuration parameters.

              Changed is a list of parameter-value tuples with all configuration parameters with changed values,
              New is a list of parameter-value tuples with all configuration parameters that  have  been  added,
              and Removed is a list of all parameters that have been removed.

SEE ALSO

       OTP Design Principles, kernel(7), app(5)