summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorUlf Wiger <ulf@feuerlabs.com>2015-08-20 16:28:49 +0200
committerUlf Wiger <ulf@feuerlabs.com>2015-11-20 13:41:50 -0800
commit45ddf112263c1cf583f04ec658f6b141ec3d0b00 (patch)
tree44f9e548c7c85ca6b206f870b0990a82351d2871 /src
parentb5cf44194c21241d2b16ac11857ef65f7cb34bdd (diff)
downloadrvi_core-45ddf112263c1cf583f04ec658f6b141ec3d0b00.tar.gz
ensure no trailing ws in cert files
Diffstat (limited to 'src')
-rw-r--r--src/rvi_server.erl80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/rvi_server.erl b/src/rvi_server.erl
new file mode 100644
index 0000000..6aa0d8c
--- /dev/null
+++ b/src/rvi_server.erl
@@ -0,0 +1,80 @@
+-module(rvi_server).
+-behaviour(gen_server).
+
+-export([start_link/0,
+ await/0,
+ info/0,
+ info/1]).
+
+%% gen_server callbacks
+-export([init/1,
+ handle_call/3,
+ handle_cast/2,
+ handle_info/2,
+ terminate/2,
+ code_change/3]).
+
+-include_lib("lager/include/log.hrl").
+
+-record(st, {wait_for = [],
+ ready = []}).
+
+start_link() ->
+ gen_server:start_link({local,?MODULE}, ?MODULE, [], [{debug,[trace]}]).
+
+init([]) ->
+ WaitFor = lists:flatmap(
+ fun({_, Names}) ->
+ Names
+ end, setup:find_env_vars(rvi_core_await)),
+ {ok, #st{wait_for = WaitFor}}.
+
+await() ->
+ call(await).
+
+info() ->
+ call(info).
+
+info(waiting) -> call(waiting);
+info(ready ) -> call(ready);
+info(_) ->
+ undefined.
+
+handle_call(ready, _From, #st{ready = Ready} = S) ->
+ {reply, Ready, S};
+handle_call(waiting, _From, #st{wait_for = WF} = S) ->
+ {reply, WF, S};
+handle_call(info, _From, #st{ready = Ready,
+ wait_for = WF} = S) ->
+ {reply, [{ready, Ready},
+ {waiting_for, WF}], S};
+handle_call(await, _From, #st{wait_for = WF} = S) ->
+ [gproc:nb_wait(Name) || Name <- WF],
+ {reply, ok, S};
+handle_call(_, _, S) ->
+ {reply, error, S}.
+
+handle_cast(_, S) ->
+ {noreply, S}.
+
+handle_info({gproc, _, registered, {Key, _, _}}, #st{wait_for = WF,
+ ready = Ready} = S) ->
+ WF1 = WF -- [Key],
+ if WF1 == [] andalso WF =/= [] ->
+ rvi_common:announce({n, l, rvi_core});
+ true ->
+ ok
+ end,
+ {noreply, S#st{ready = [Key | Ready], wait_for = WF1}};
+handle_info(_, S) ->
+ {noreply, S}.
+
+terminate(_Reason, _State) ->
+ ok.
+
+code_change(_FromVsn, S, _Extra) ->
+ {ok, S}.
+
+
+call(Req) ->
+ gen_server:call(?MODULE, Req).