Packages

ENet - Reliable UDP networking library

Current section

Files

Jump to
enet src enet_pool.erl
Raw

src/enet_pool.erl

-module(enet_pool).
-behaviour(gen_server).
%% API
-export([
start_link/2,
add_peer/2,
pick_peer/2,
remove_peer/2,
connect_peer/2,
disconnect_peer/2,
active_peers/1,
worker_id/2
]).
%% gen_server callbacks
-export([
init/1,
handle_call/3,
handle_cast/2,
handle_info/2,
terminate/2
]).
-record(state, {
port
}).
%%%===================================================================
%%% API
%%%===================================================================
start_link(Port, PeerLimit) ->
gen_server:start_link(?MODULE, [Port, PeerLimit], []).
add_peer(Port, Name) ->
gproc_pool:add_worker(Port, Name).
pick_peer(Port, PeerID) ->
gproc_pool:pick_worker(Port, PeerID).
remove_peer(Port, Name) ->
gproc_pool:remove_worker(Port, Name).
connect_peer(Port, Name) ->
gproc_pool:connect_worker(Port, Name).
disconnect_peer(Port, Name) ->
gproc_pool:disconnect_worker(Port, Name).
active_peers(Port) ->
gproc_pool:active_workers(Port).
worker_id(Port, Name) ->
gproc_pool:worker_id(Port, Name).
%%%===================================================================
%%% gen_server callbacks
%%%===================================================================
init([Port, PeerLimit]) ->
process_flag(trap_exit, true),
true = gproc:reg({n, l, {enet_pool, Port}}),
try gproc_pool:new(Port, direct, [{size, PeerLimit}, {auto_size, false}]) of
ok -> ok
catch
error:exists -> ok
end,
{ok, #state{port = Port}}.
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}.
handle_cast(_Request, State) ->
{noreply, State}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, #state{port = Port}) ->
gproc_pool:force_delete(Port),
ok.
%%%===================================================================
%%% Internal functions
%%%===================================================================