|
@@ -1,124 +0,0 @@
|
|
-%% ==========================================================================================================
|
|
|
|
-%% Syn - A global Process Registry and Process Group manager.
|
|
|
|
-%%
|
|
|
|
-%% The MIT License (MIT)
|
|
|
|
-%%
|
|
|
|
-%% Copyright (c) 2015-2021 Roberto Ostinelli <roberto@ostinelli.net> and Neato Robotics, Inc.
|
|
|
|
-%%
|
|
|
|
-%% Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
-%% of this software and associated documentation files (the "Software"), to deal
|
|
|
|
-%% in the Software without restriction, including without limitation the rights
|
|
|
|
-%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
-%% copies of the Software, and to permit persons to whom the Software is
|
|
|
|
-%% furnished to do so, subject to the following conditions:
|
|
|
|
-%%
|
|
|
|
-%% The above copyright notice and this permission notice shall be included in
|
|
|
|
-%% all copies or substantial portions of the Software.
|
|
|
|
-%%
|
|
|
|
-%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
-%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
-%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
-%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
-%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
-%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
-%% THE SOFTWARE.
|
|
|
|
-%% ==========================================================================================================
|
|
|
|
--module(syn_groups).
|
|
|
|
--behaviour(gen_server).
|
|
|
|
-
|
|
|
|
-%% API
|
|
|
|
--export([start_link/1]).
|
|
|
|
-
|
|
|
|
-%% gen_server callbacks
|
|
|
|
--export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
|
|
|
|
-
|
|
|
|
-%% includes
|
|
|
|
--include("syn.hrl").
|
|
|
|
-
|
|
|
|
-%% ===================================================================
|
|
|
|
-%% API
|
|
|
|
-%% ===================================================================
|
|
|
|
--spec start_link(Scope :: atom()) -> {ok, pid()} | {error, any()}.
|
|
|
|
-start_link(Scope) when is_atom(Scope) ->
|
|
|
|
- Args = [],
|
|
|
|
- ProcessName = get_process_name_for(Scope),
|
|
|
|
- gen_server:start_link({local, ProcessName}, ?MODULE, Args, []).
|
|
|
|
-
|
|
|
|
-%% ===================================================================
|
|
|
|
-%% Callbacks
|
|
|
|
-%% ===================================================================
|
|
|
|
-
|
|
|
|
-%% ----------------------------------------------------------------------------------------------------------
|
|
|
|
-%% Init
|
|
|
|
-%% ----------------------------------------------------------------------------------------------------------
|
|
|
|
--spec init([]) ->
|
|
|
|
- {ok, #state{}} |
|
|
|
|
- {ok, #state{}, Timeout :: non_neg_integer()} |
|
|
|
|
- ignore |
|
|
|
|
- {stop, Reason :: any()}.
|
|
|
|
-init([]) ->
|
|
|
|
- %% build state
|
|
|
|
- State = #state{},
|
|
|
|
- %% init
|
|
|
|
- {ok, State}.
|
|
|
|
-
|
|
|
|
-%% ----------------------------------------------------------------------------------------------------------
|
|
|
|
-%% Call messages
|
|
|
|
-%% ----------------------------------------------------------------------------------------------------------
|
|
|
|
--spec handle_call(Request :: any(), From :: any(), #state{}) ->
|
|
|
|
- {reply, Reply :: any(), #state{}} |
|
|
|
|
- {reply, Reply :: any(), #state{}, Timeout :: non_neg_integer()} |
|
|
|
|
- {noreply, #state{}} |
|
|
|
|
- {noreply, #state{}, Timeout :: non_neg_integer()} |
|
|
|
|
- {stop, Reason :: any(), Reply :: any(), #state{}} |
|
|
|
|
- {stop, Reason :: any(), #state{}}.
|
|
|
|
-handle_call(Request, From, State) ->
|
|
|
|
- error_logger:warning_msg("Syn(~p): Received from ~p an unknown call message: ~p", [node(), Request, From]),
|
|
|
|
- {reply, undefined, State}.
|
|
|
|
-
|
|
|
|
-%% ----------------------------------------------------------------------------------------------------------
|
|
|
|
-%% Cast messages
|
|
|
|
-%% ----------------------------------------------------------------------------------------------------------
|
|
|
|
--spec handle_cast(Msg :: any(), #state{}) ->
|
|
|
|
- {noreply, #state{}} |
|
|
|
|
- {noreply, #state{}, Timeout :: non_neg_integer()} |
|
|
|
|
- {stop, Reason :: any(), #state{}}.
|
|
|
|
-handle_cast(Msg, State) ->
|
|
|
|
- error_logger:warning_msg("Syn(~p): Received an unknown cast message: ~p", [node(), Msg]),
|
|
|
|
- {noreply, State}.
|
|
|
|
-
|
|
|
|
-%% ----------------------------------------------------------------------------------------------------------
|
|
|
|
-%% All non Call / Cast messages
|
|
|
|
-%% ----------------------------------------------------------------------------------------------------------
|
|
|
|
--spec handle_info(Info :: any(), #state{}) ->
|
|
|
|
- {noreply, #state{}} |
|
|
|
|
- {noreply, #state{}, Timeout :: non_neg_integer()} |
|
|
|
|
- {stop, Reason :: any(), #state{}}.
|
|
|
|
-
|
|
|
|
-handle_info(Info, State) ->
|
|
|
|
- error_logger:warning_msg("Syn(~p): Received an unknown info message: ~p", [node(), Info]),
|
|
|
|
- {noreply, State}.
|
|
|
|
-
|
|
|
|
-%% ----------------------------------------------------------------------------------------------------------
|
|
|
|
-%% Terminate
|
|
|
|
-%% ----------------------------------------------------------------------------------------------------------
|
|
|
|
--spec terminate(Reason :: any(), #state{}) -> terminated.
|
|
|
|
-terminate(Reason, _State) ->
|
|
|
|
- error_logger:info_msg("Syn(~p): Terminating with reason: ~p", [node(), Reason]),
|
|
|
|
- terminated.
|
|
|
|
-
|
|
|
|
-%% ----------------------------------------------------------------------------------------------------------
|
|
|
|
-%% Convert process state when code is changed.
|
|
|
|
-%% ----------------------------------------------------------------------------------------------------------
|
|
|
|
--spec code_change(OldVsn :: any(), #state{}, Extra :: any()) -> {ok, #state{}}.
|
|
|
|
-code_change(_OldVsn, State, _Extra) ->
|
|
|
|
- {ok, State}.
|
|
|
|
-
|
|
|
|
-%% ===================================================================
|
|
|
|
-%% Internal
|
|
|
|
-%% ===================================================================
|
|
|
|
--spec get_process_name_for(Scope :: atom()) -> atom().
|
|
|
|
-get_process_name_for(Scope) ->
|
|
|
|
- ModuleBin = atom_to_binary(?MODULE),
|
|
|
|
- ScopeBin = atom_to_binary(Scope),
|
|
|
|
- binary_to_atom(<<ModuleBin/binary, "_", ScopeBin/binary>>).
|
|
|