Minga.Parser.RequestState (Minga v0.1.0)

Copy Markdown View Source

Owned state for sequence-fenced synchronous parser requests.

Request handlers perform replies and Port writes; this module alone constructs and updates the request aggregate installed by Minga.Parser.Manager.

Summary

Functions

Adds a deferred request and its buffer fence.

Removes a fence by token.

Allocates an ID and records an emitted request.

Constructs empty parser request state.

Returns the ID that will be allocated to the next emitted request.

Removes a deferred request by token.

Removes an in-flight request by parser request ID.

Removes the in-flight request associated with a fence token.

Consumes a matching fence and records the snapshot sequence.

Removes every deferred, fenced, and in-flight request.

Removes every deferred, fenced, and in-flight request for one buffer.

Splits ready deferred requests for one synchronized buffer.

Types

command_builder()

@type command_builder() :: (pos_integer(), non_neg_integer() -> binary())

deferred_request()

@type deferred_request() :: %{
  from: GenServer.from(),
  buffer: pid(),
  command_builder: command_builder(),
  required_sequence: non_neg_integer() | nil
}

in_flight_request()

@type in_flight_request() :: %{
  from: GenServer.from(),
  buffer: pid(),
  token: reference()
}

t()

@type t() :: %Minga.Parser.RequestState{
  deferred: %{required(reference()) => deferred_request()},
  fences: %{required(reference()) => pid()},
  in_flight: %{required(non_neg_integer()) => in_flight_request()},
  next_id: pos_integer()
}

Functions

defer(state, token, request)

@spec defer(t(), reference(), deferred_request()) :: t()

Adds a deferred request and its buffer fence.

drop_fence(state, token)

@spec drop_fence(t(), reference()) :: t()

Removes a fence by token.

emit(state, request)

@spec emit(t(), in_flight_request()) :: {pos_integer(), t()}

Allocates an ID and records an emitted request.

new()

@spec new() :: t()

Constructs empty parser request state.

next_id(request_state)

@spec next_id(t()) :: pos_integer()

Returns the ID that will be allocated to the next emitted request.

pop_deferred(state, token)

@spec pop_deferred(t(), reference()) :: {deferred_request() | nil, t()}

Removes a deferred request by token.

pop_in_flight(state, id)

@spec pop_in_flight(t(), non_neg_integer()) :: {in_flight_request() | nil, t()}

Removes an in-flight request by parser request ID.

pop_in_flight_by_token(state, token)

@spec pop_in_flight_by_token(t(), reference()) :: {in_flight_request() | nil, t()}

Removes the in-flight request associated with a fence token.

satisfy_fence(state, token, buffer, sequence)

@spec satisfy_fence(t(), reference(), pid(), non_neg_integer()) :: {:ok, t()} | :stale

Consumes a matching fence and records the snapshot sequence.

take_all(state)

@spec take_all(t()) :: {[GenServer.from()], t()}

Removes every deferred, fenced, and in-flight request.

take_buffer(state, buffer)

@spec take_buffer(t(), pid()) :: {[GenServer.from()], t()}

Removes every deferred, fenced, and in-flight request for one buffer.

take_ready(state, buffer, ready?)

@spec take_ready(t(), pid(), (deferred_request() -> boolean())) ::
  {[{reference(), deferred_request()}], t()}

Splits ready deferred requests for one synchronized buffer.