summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Bracco <href@random.sh>2020-05-08 20:48:05 +0200
committerJordan Bracco <href@random.sh>2020-05-08 20:48:05 +0200
commitf5ad9dcd315f9770ef2a69489a3adef065f2e5b5 (patch)
tree8fbece5da1f9c1279fe4cbb5a99d9cef342e811d
parentSwitch to atomics, add shared ets, .. (diff)
minor fixes
-rw-r--r--lib/limiter.ex46
1 files changed, 19 insertions, 27 deletions
diff --git a/lib/limiter.ex b/lib/limiter.ex
index f47e68f..f8789a4 100644
--- a/lib/limiter.ex
+++ b/lib/limiter.ex
@@ -8,8 +8,8 @@ defmodule Limiter do
It supports two storage methods:
- * **`[atomics](https://erlang.org/doc/man/atomics.html)`** recommended and default if your OTP is > 21.2.
- * **`[ets](https://erlang.org/doc/man/ets.html)`** either with a single table per Limiter (faster) or a shared table (better for a large number of limiters).
+ * **[atomics](https://erlang.org/doc/man/atomics.html)** recommended and default if your OTP is > 21.2.
+ * **[ets](https://erlang.org/doc/man/ets.html)** either with a single table per Limiter (faster) or a shared table.
You would however always want to use atomics, ets is mostly there for backwards compatibility.
"""
@@ -18,17 +18,15 @@ defmodule Limiter do
Initializes a `Limiter`.
"""
- @spec new(name, max_running, max_waiting, options) :: :ok | {:error, :existing}
- when name: atom(),
- max_running: non_neg_integer(),
- max_waiting: non_neg_integer() | :infinity,
- options: [option],
- option: {:wait, non_neg_integer()} | backend,
- backend: :atomics | ets_backend,
- ets_backend: :ets | {:ets, atom()} | {:ets, ets_name :: atom(), ets_options :: []}
+ @spec new(name, max_running, max_waiting, options) :: :ok | {:error, :existing} when name: atom(),
+ max_running: non_neg_integer(),
+ max_waiting: non_neg_integer() | :infinity,
+ options: [option],
+ option: {:wait, non_neg_integer()} | backend,
+ backend: :atomics | ets_backend,
+ ets_backend: :ets | {:ets, atom()} | {:ets, ets_name :: atom(), ets_options :: []}
def new(name, max_running, max_waiting, options \\ []) do
name = atom_name(name)
-
if defined?(name) do
{:error, :existing}
else
@@ -40,24 +38,18 @@ defmodule Limiter do
end
end
- @spec set(name, new_max_running, new_max_waiting, options) :: :ok | :error
- when name: atom(),
- new_max_running: non_neg_integer(),
- new_max_waiting: non_neg_integer() | :infinity,
- options: [option],
- option: {:wait, non_neg_integer()}
+ @spec set(name, new_max_running, new_max_waiting, options) :: :ok | :error when name: atom(),
+ new_max_running: non_neg_integer(),
+ new_max_waiting: non_neg_integer() | :infinity,
+ options: [option],
+ option: {:wait, non_neg_integer()}
@doc "Adjust the limiter limits at runtime"
def set(name, new_max_running, new_max_waiting, options \\ []) do
name = atom_name(name)
-
if defined?(name) do
new_wait = Keyword.get(options, :wait)
{__MODULE__, max_running, max_waiting, backend, wait} = :persistent_term.get(name)
-
- new =
- {__MODULE__, new_max_running || max_running, new_max_waiting || max_waiting, backend,
- new_wait || wait}
-
+ new = {__MODULE__, new_max_running || max_running, new_max_waiting || max_waiting, backend, new_wait || wait}
:persistent_term.put(name, new)
:ok
else
@@ -107,11 +99,11 @@ defmodule Limiter do
:atomics.add_get(ref, 1, 1)
end
- def dec({:ets, ets}, name) do
+ defp dec({:ets, ets}, name) do
:ets.update_counter(ets, name, {2, -1}, {name, 0})
end
- def dec({:atomics, ref}, _) do
+ defp dec({:atomics, ref}, _) do
:atomics.sub_get(ref, 1, 1)
end
@@ -148,11 +140,11 @@ defmodule Limiter do
:undefined -> :ets.new(ets_name, [:public, :named_table] ++ options)
_ -> nil
end
-
{:ok, {:ets, ets_name}}
end
defp setup_backend(:atomics) do
- {:ok, {:atomics, :atomics.new(1, signed: true)}}
+ {:ok, {:atomics, :atomics.new(1, [signed: true])}}
end
+
end