switch to ets for managing the workers
diff --git a/src/rexi_server.erl b/src/rexi_server.erl
index 8b92227..f45ca4f 100644
--- a/src/rexi_server.erl
+++ b/src/rexi_server.erl
@@ -8,7 +8,7 @@
-include_lib("eunit/include/eunit.hrl").
-record(st, {
- workers = []
+ workers = ets:new(workers, [private, {keypos,2}])
}).
start_link() ->
@@ -45,7 +45,7 @@
{noreply, St}.
terminate(_Reason, St) ->
- [exit(Pid,kill) || {Pid, _, _} <- St#st.workers],
+ ets:foldl(fun({Pid, _, _}, _) -> exit(Pid,kill) end, nil, St#st.workers),
ok.
code_change(_OldVsn, St, _Extra) ->
@@ -59,14 +59,14 @@
%% internal
-add_worker(Worker, List) ->
- [Worker | List].
+add_worker(Worker, Tab) ->
+ ets:insert(Tab, Worker), Tab.
-remove_worker(Ref, List) ->
- lists:keydelete(Ref, 2, List).
+remove_worker(Ref, Tab) ->
+ ets:delete(Tab, Ref), Tab.
-find_worker(Ref, List) ->
- lists:keyfind(Ref, 2, List).
+find_worker(Ref, Tab) ->
+ case ets:lookup(Tab, Ref) of [] -> false; [Worker] -> Worker end.
notify_caller({Caller, Ref}, Reason) ->
Caller ! {Ref, {rexi_EXIT, Reason}}.