Browse Source

Start default scoped processes.

Roberto Ostinelli 3 years ago
parent
commit
45e858861d
4 changed files with 105 additions and 17 deletions
  1. 11 5
      src/syn_groups.erl
  2. 11 5
      src/syn_registry.erl
  3. 67 0
      src/syn_scopes_sup.erl
  4. 16 7
      src/syn_sup.erl

+ 11 - 5
src/syn_groups.erl

@@ -27,7 +27,7 @@
 -behaviour(gen_server).
 
 %% API
--export([start_link/0]).
+-export([start_link/1]).
 
 %% gen_server callbacks
 -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
@@ -41,10 +41,11 @@
 %% ===================================================================
 %% API
 %% ===================================================================
--spec start_link() -> {ok, pid()} | {error, any()}.
-start_link() ->
-    Options = [],
-    gen_server:start_link({local, ?MODULE}, ?MODULE, [], Options).
+-spec start_link(Scope :: atom()) -> {ok, pid()} | {error, any()}.
+start_link(Scope) when is_atom(Scope) ->
+    Args = [],
+    ProcessName = get_process_name(Scope),
+    gen_server:start_link({local, ProcessName}, ?MODULE, Args, []).
 
 %% ===================================================================
 %% Callbacks
@@ -119,3 +120,8 @@ code_change(_OldVsn, State, _Extra) ->
 %% ===================================================================
 %% Internal
 %% ===================================================================
+-spec get_process_name(Scope :: atom()) -> atom().
+get_process_name(Scope) ->
+    ModuleBin = atom_to_binary(?MODULE),
+    ScopeBin = atom_to_binary(Scope),
+    binary_to_atom(<<ModuleBin/binary, "_", ScopeBin/binary>>).

+ 11 - 5
src/syn_registry.erl

@@ -27,7 +27,7 @@
 -behaviour(gen_server).
 
 %% API
--export([start_link/0]).
+-export([start_link/1]).
 
 %% gen_server callbacks
 -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
@@ -41,10 +41,11 @@
 %% ===================================================================
 %% API
 %% ===================================================================
--spec start_link() -> {ok, pid()} | {error, any()}.
-start_link() ->
-    Options = [],
-    gen_server:start_link({local, ?MODULE}, ?MODULE, [], Options).
+-spec start_link(Scope :: atom()) -> {ok, pid()} | {error, any()}.
+start_link(Scope) when is_atom(Scope) ->
+    Args = [],
+    ProcessName = get_process_name(Scope),
+    gen_server:start_link({local, ProcessName}, ?MODULE, Args, []).
 
 %% ===================================================================
 %% Callbacks
@@ -118,3 +119,8 @@ code_change(_OldVsn, State, _Extra) ->
 %% ===================================================================
 %% Internal
 %% ===================================================================
+-spec get_process_name(Scope :: atom()) -> atom().
+get_process_name(Scope) ->
+    ModuleBin = atom_to_binary(?MODULE),
+    ScopeBin = atom_to_binary(Scope),
+    binary_to_atom(<<ModuleBin/binary, "_", ScopeBin/binary>>).

+ 67 - 0
src/syn_scopes_sup.erl

@@ -0,0 +1,67 @@
+%% ==========================================================================================================
+%% 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_scopes_sup).
+-behaviour(supervisor).
+
+%% API
+-export([start_link/0]).
+
+%% Supervisor callbacks
+-export([init/1]).
+
+%% ===================================================================
+%% API
+%% ===================================================================
+-spec start_link() -> {ok, pid()} | {already_started, pid()} | shutdown.
+start_link() ->
+    supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+%% ===================================================================
+%% Callbacks
+%% ===================================================================
+-spec init([]) ->
+    {ok, {{supervisor:strategy(), non_neg_integer(), pos_integer()}, [supervisor:child_spec()]}}.
+init([]) ->
+    %% start default scopes
+    Children = [
+        scope_child_spec(syn_registry, default),
+        scope_child_spec(syn_groups, default)
+    ],
+    {ok, {{one_for_one, 10, 10}, Children}}.
+
+%% ===================================================================
+%% Internals
+%% ===================================================================
+-spec scope_child_spec(module(), Scope :: atom()) -> supervisor:child_spec().
+scope_child_spec(Module, Scope) ->
+    #{
+        id => {Module, Scope},
+        start => {Module, start_link, [Scope]},
+        type => worker,
+        shutdown => 10000,
+        restart => permanent,
+        modules => [Module]
+    }.

+ 16 - 7
src/syn_sup.erl

@@ -32,10 +32,6 @@
 %% Supervisor callbacks
 -export([init/1]).
 
-%% Helper macro for declaring children of supervisor
--define(CHILD(I, Type), {I, {I, start_link, []}, permanent, 10000, Type, [I]}).
-
-
 %% ===================================================================
 %% API
 %% ===================================================================
@@ -50,8 +46,21 @@ start_link() ->
     {ok, {{supervisor:strategy(), non_neg_integer(), pos_integer()}, [supervisor:child_spec()]}}.
 init([]) ->
     Children = [
-        ?CHILD(syn_backbone, worker),
-        ?CHILD(syn_groups, worker),
-        ?CHILD(syn_registry, worker)
+        child_spec(syn_scopes_sup, supervisor),
+        child_spec(syn_backbone, worker)
     ],
     {ok, {{one_for_one, 10, 10}, Children}}.
+
+%% ===================================================================
+%% Internals
+%% ===================================================================
+-spec child_spec(module(), worker | supervisor) -> supervisor:child_spec().
+child_spec(Module, Type) ->
+    #{
+        id => Module,
+        start => {Module, start_link, []},
+        type => Type,
+        shutdown => 10000,
+        restart => permanent,
+        modules => [Module]
+    }.