Packages
nova
0.8.1
0.15.1
0.14.3
0.14.1
0.13.7
0.13.1
0.13.0
0.12.1
0.12.0
0.11.0
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.24
0.9.23
0.9.22
0.9.21
0.9.20
0.9.19
0.9.18
0.9.17
0.9.16
0.9.15
0.9.11
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.4.4
0.4.3
0.4.2
0.4.1
0.2.2
0.1.0
0.0.1
0.0.0
Nova is a web application framework
Current section
Files
Jump to
Current section
Files
src/nova_cache_sup.erl
%%%-------------------------------------------------------------------
%%% @author Niclas Axelsson <niclas@burbas.se>
%%% @copyright (C) 2021, Niclas Axelsson
%%% @doc
%%%
%%% @end
%%% Created : 22 May 2021 by Niclas Axelsson <niclas@burbas.se>
%%%-------------------------------------------------------------------
-module(nova_cache_sup).
-behaviour(supervisor).
%% API
-export([
start_link/0,
init_cache/1,
remove_cache/1,
get_cache/1
]).
%% Supervisor callbacks
-export([init/1]).
-define(SERVER, ?MODULE).
%%%===================================================================
%%% API functions
%%%===================================================================
%%--------------------------------------------------------------------
%% @doc
%% Starts the supervisor
%% @end
%%--------------------------------------------------------------------
-spec start_link() -> {ok, Pid :: pid()} |
{error, {already_started, Pid :: pid()}} |
{error, {shutdown, term()}} |
{error, term()} |
ignore.
start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
%%--------------------------------------------------------------------
%% @doc
%% Initializes the cache.
%% @end
%%--------------------------------------------------------------------
-spec init_cache(Cachename :: atom()) -> {ok, Child} |
{ok, Child, Info :: term()} |
{error, {already_started, pid()} | {shutdown, term()} | term()}
when Child :: undefined | pid().
init_cache(Cachename) when is_atom(Cachename) ->
supervisor:start_child(?SERVER, child_spec(Cachename, nova_cache)).
%%--------------------------------------------------------------------
%% @doc
%% Removes a cache. This terminates the corresponding process.
%% @end
%%--------------------------------------------------------------------
-spec remove_cache(Cachename :: atom()) -> ok | {error, Reason :: not_found | simple_one_for_one}.
remove_cache(Cachename) when is_atom(Cachename) ->
case get_cache(Cachename) of
{ok, Id} ->
%% Let's terminate the child
supervisor:terminate_child(?SERVER, Id);
_ ->
ok
end.
%%--------------------------------------------------------------------
%% @doc
%% Returns the pid of a cache.
%% @end
%%--------------------------------------------------------------------
-spec get_cache(Cachename :: atom()) -> {ok, Id :: pid()} | {error, not_found}.
get_cache(Cachename) when is_atom(Cachename) ->
Children = supervisor:which_children(?SERVER),
case lists:keyfind(Cachename, 1, Children) of
false ->
{error, not_found};
{_Id, Child, _Type, _Modules} ->
{ok, Child}
end.
%%%===================================================================
%%% Supervisor callbacks
%%%===================================================================
%%--------------------------------------------------------------------
%% @private
%% @doc
%% Whenever a supervisor is started using supervisor:start_link/[2,3],
%% this function is called by the new process to find out about
%% restart strategy, maximum restart intensity, and child
%% specifications.
%% @end
%%--------------------------------------------------------------------
-spec init(Args :: term()) ->
{ok, {SupFlags :: supervisor:sup_flags(),
[ChildSpec :: supervisor:child_spec()]}} |
ignore.
init([]) ->
SupFlags = #{strategy => one_for_one,
intensity => 1,
period => 5},
{ok, {SupFlags, []}}.
%%%===================================================================
%%% Internal functions
%%%===================================================================
child_spec(Id, Module) ->
#{id => Id,
start => {Module, start_link, [Id]},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [Module]}.