diff options
Diffstat (limited to 'p11p-daemon/src/p11p_remote_manager.erl')
-rw-r--r-- | p11p-daemon/src/p11p_remote_manager.erl | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/p11p-daemon/src/p11p_remote_manager.erl b/p11p-daemon/src/p11p_remote_manager.erl index 03d43e4..633a4aa 100644 --- a/p11p-daemon/src/p11p_remote_manager.erl +++ b/p11p-daemon/src/p11p_remote_manager.erl @@ -12,7 +12,7 @@ %% API. -export([start_link/0]). --export([remote_for_token/1]). % For servers. +-export([remote_for_token/1, kill_remote/2]). % For servers. -export([timeout/1]). % For remotes. %% Genserver callbacks. @@ -44,6 +44,9 @@ start_link() -> -spec remote_for_token(string()) -> pid(). remote_for_token(TokName) -> gen_server:call(?MODULE, {remote_for_token, TokName}). +kill_remote(TokName, Pid) -> + gen_server:call(?MODULE, {kill_remote, {TokName, Pid}}). + timeout(TokName) -> gen_server:call(?MODULE, {timeout, TokName}). @@ -76,6 +79,19 @@ handle_call({timeout, TokName}, _From, #state{tokens = Tokens} = State) -> NewState = State#state{tokens = Tokens#{TokName := NewToken}}, lager:debug("~p: ~s: updated token: ~p", [self(), TokName, NewToken]), {reply, ok, NewState}; +handle_call({kill_remote, {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), + #{TokName := Token} = Tokens, + Remotes = Token#token.remotes, + NewRemotes = lists:map(fun(E) -> + case E#remote.pid of + Pid -> E#remote{pid = undefined}; + _ -> E + end end, 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}. |