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)