diff options
Diffstat (limited to 'p11p-daemon/src/p11p_remote_manager.erl')
-rw-r--r-- | p11p-daemon/src/p11p_remote_manager.erl | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/p11p-daemon/src/p11p_remote_manager.erl b/p11p-daemon/src/p11p_remote_manager.erl index 0acec66..8ff8883 100644 --- a/p11p-daemon/src/p11p_remote_manager.erl +++ b/p11p-daemon/src/p11p_remote_manager.erl @@ -56,11 +56,11 @@ start_link() -> -spec remote_for_token(string()) -> pid(). remote_for_token(TokName) -> gen_server:call(?MODULE, {remote_for_token, TokName}). -client_event(Change, Args) -> - gen_server:call(?MODULE, {client_event, Change, Args}). +client_event(Event, Args) -> + gen_server:cast(?MODULE, {client_event, Event, Args}). -server_event(Change, Args) -> - gen_server:call(?MODULE, {server_event, Change, Args}). +server_event(Event, Args) -> + gen_server:cast(?MODULE, {server_event, Event, Args}). %% Genserver callbacks. init([]) -> @@ -80,9 +80,13 @@ handle_call({remote_for_token, TokName}, _From, #state{tokens = Tokens} = State) _ -> {reply, Pid, State} end; -handle_call({server_event, timeout, [TokName, Server]}, _From, #state{tokens = Tokens} = State) -> - lager:debug("~p: ~s: timed out", [self(), TokName]), - gen_server:stop(Server), % Hang up p11 client. +handle_call(Call, _From, State) -> + lager:debug("Unhandled call: ~p~n", [Call]), + {reply, unhandled, State}. + +handle_cast({server_event, timeout, [TokName, Server]}, #state{tokens = Tokens} = State) -> + lager:debug("~p: ~s: timed out, stopping ~p", [self(), TokName, Server]), + gen_server:stop(Server), % Hang up on p11 client. %% TODO: do some code dedup with remote_for_token? #{TokName := Token} = Tokens, Remotes = Token#token.remotes, @@ -91,10 +95,10 @@ handle_call({server_event, timeout, [TokName, Server]}, _From, #state{tokens = T NewToken = Token#token{remotes = tl(Remotes) ++ [NewRemote]}, NewState = State#state{tokens = Tokens#{TokName := NewToken}}, lager:debug("~p: ~s: updated token: ~p", [self(), TokName, NewToken]), - {reply, ok, NewState}; -handle_call({client_event, client_gone, [TokName, Pid]}, From, #state{tokens = Tokens} = State) -> - lager:debug("~p: killing off remote ~p on request from ~p", [self(), Pid, From]), - gen_server:stop(Pid), + {noreply, NewState}; +handle_cast({client_event, client_gone, [TokName, Pid]}, #state{tokens = Tokens} = State) -> + lager:debug("~p: asking remote ~p to stop", [self(), Pid]), + p11p_remote:stop(Pid, normal), #{TokName := Token} = Tokens, Remotes = Token#token.remotes, NewRemotes = [case E#remote.pid of @@ -103,18 +107,15 @@ handle_call({client_event, client_gone, [TokName, Pid]}, From, #state{tokens = T end || E <- Remotes], NewToken = Token#token{remotes = NewRemotes}, NewState = State#state{tokens = Tokens#{TokName := NewToken}}, - {reply, ok, NewState}; -handle_call(Call, _From, State) -> - lager:debug("Unhandled call: ~p~n", [Call]), - {reply, unhandled, State}. - + {noreply, NewState}; handle_cast(Cast, State) -> lager:debug("Unhandled cast: ~p~n", [Cast]), {noreply, State}. handle_info({Port, {exit_status, Status}}, State) -> - lager:info("~p: process exited with ~p", [Port, Status]), - {stop, child_exit, State}; + %% FIXME: do we need to be trapping exits explicitly? + lager:info("~p: process ~p exited with ~p", [self(), Port, Status]), + {noreply, State}; handle_info(Info, State) -> lager:debug("~p: Unhandled info: ~p~n", [self(), Info]), {noreply, State}. |