Current section
Files
Jump to
Current section
Files
src/shackle_backlog.erl
-module(shackle_backlog).
-include("shackle_internal.hrl").
-compile(inline).
-compile({inline_size, 512}).
%% internal
-export([
check/2,
check/3,
decrement/1,
decrement/2,
delete/1,
init/0,
new/1
]).
-define(DEFAULT_DECREMENT, -1).
-define(DEFAULT_INCREMENT, 1).
%% internal
-spec check(server_id(), backlog_size()) ->
boolean().
check(ServerId, BacklogSize) ->
check(ServerId, BacklogSize, ?DEFAULT_INCREMENT).
-spec check(server_id(), backlog_size(), pos_integer()) ->
boolean().
check(_ServerId, infinity, _Increment) ->
true;
check(ServerId, BacklogSize, Increment) ->
case increment(ServerId, BacklogSize, Increment) of
[BacklogSize, BacklogSize] ->
false;
[_, Value] when Value =< BacklogSize ->
true
end.
-spec decrement(server_id()) ->
non_neg_integer().
decrement(ServerId) ->
decrement(ServerId, ?DEFAULT_DECREMENT).
-spec decrement(server_id(), neg_integer()) ->
non_neg_integer().
decrement(ServerId, Decrement) ->
ets:update_counter(?ETS_TABLE_BACKLOG, ServerId, {2, Decrement, 0, 0}).
-spec delete(server_id()) ->
ok.
delete(ServerId) ->
ets:delete(?ETS_TABLE_BACKLOG, ServerId),
ok.
-spec init() ->
ok.
init() ->
ets:new(?ETS_TABLE_BACKLOG, [
named_table,
public,
{write_concurrency, true}
]),
ok.
-spec new(server_id()) ->
ok.
new(ServerId) ->
ets:insert(?ETS_TABLE_BACKLOG, {ServerId, 0}),
ok.
%% private
increment(ServerId, BacklogSize, Increment) ->
UpdateOps = [{2, 0}, {2, Increment, BacklogSize, BacklogSize}],
ets:update_counter(?ETS_TABLE_BACKLOG, ServerId, UpdateOps).