Alambic.Semaphore

A simple semaphore implementation, useful when you need quick control around resource access and do not want to resort to the full OTP artillery or complex process pooling.

This semaphore is implemented as a GenServer.

If you need to start a named Semaphore as part of a supervision tree, you should use directly the GenServer.start/start_link functions passing the required max as argument.

Summary

Functions

Acquire a slot in the semaphore. Will block until a slot is available or the semaphore is destroyed

Create a semaphore with max slots

Create a semaphore with max slots. The semaphore is linked to the current process

Destroy a semaphore. Clients waiting on acquire will receive an :error response

Return true if no slot is available, false otherwise

Release a slot from the semaphore. :error is returned if no slot is currently acquired

Try to acquire a slot in the semaphore but does not block if no slot is available. Returns true if a slot was acquired, false otherwise

Types

t :: %Alambic.Semaphore{id: pid}

Functions

acquire(semaphore)

Specs

acquire(t) :: :ok | :error

Acquire a slot in the semaphore. Will block until a slot is available or the semaphore is destroyed.

create(max)

Specs

create(integer) :: t

Create a semaphore with max slots.

iex> s = Alambic.Semaphore.create(3)
iex> is_nil(s.id)
false
create_link(max)

Specs

create_link(integer) :: t

Create a semaphore with max slots. The semaphore is linked to the current process.

iex> s = Alambic.Semaphore.create_link(3)
iex> Alambic.Semaphore.destroy(s)
:ok
destroy(semaphore)

Specs

destroy(t) :: :ok

Destroy a semaphore. Clients waiting on acquire will receive an :error response.

full?(semaphore)

Specs

full?(t) :: true | false

Return true if no slot is available, false otherwise.

release(semaphore)

Specs

release(t) :: :ok | :error

Release a slot from the semaphore. :error is returned if no slot is currently acquired.

try_acquire(semaphore)

Specs

try_acquire(t) :: true | false

Try to acquire a slot in the semaphore but does not block if no slot is available. Returns true if a slot was acquired, false otherwise.