Provided by: erlang-manpages_18.3-dfsg-1ubuntu3.1_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, Opts) -> ok

              Types:

                 Application = Par = atom()
                 Val = term()
                 Opts = [{timeout, timeout()} | {persistent, boolean()}]

              Sets the value of the configuration parameter Par for Application.

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

              If set_env/4 is called before the  application  is  loaded,  the  application  environment  values
              specified in the Application.app file will override the ones previously set. This is also true for
              application reloads.

              The persistent option can be set to true when there is a need to  guarantee  parameters  set  with
              set_env/4  will  not  be  overridden by the ones defined in the application resource file on load.
              This means persistent values will stick after the application is loaded and  also  on  application
              reload.

          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, Opts) -> ok

              Types:

                 Application = Par = atom()
                 Opts = [{timeout, timeout()} | {persistent, boolean()}]

              Removes the configuration parameter Par and its value for Application.

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

              unset_env/3 also allows the persistent option to be passed (see set_env/4 above).

          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 = start_type()
                 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)