espace_tspatt
, waiting patterns, ETS table.
Copyright © (C) 2018, Fred Youhanaie
Behaviours: gen_server.
Authors: Fred Youhanaie (fyrlang@anydata.co.uk).
Custodian for the espace_tspatt
, waiting patterns, ETS table.
The table is created as a set
and in protected
mode. All
access to the table is expected to come through this server.
However, other proceses can inspect the contents of the table for
debugging purposes.
The table keeps track of client processes that are blocked on in
or rd
waiting for a tuple matching their pattern to be added to
the tuple space. In effect the ETS table is a pattern waiting
list.
Our sole client is espace_tspace_srv
. Whenever an in
or rd
operation does not find a match the client is given a unique key
to wait on, and that key along with the pattern and client's pid
is passed to us, via add_pattern/4
, to add to the waiting list.
Whenever a new tuple is added to the tuple space, we will receive
a copy of the tuple, via check_waitlist/2
, to check against
waiting patterns. If we find a match, the correponding client(s)
will be notified of the new arrival.
Communication from espace_tspace_srv
is unidirectional. Once it
sends us a request, it will continue with its own work. We never
reply to espace_tspace_srv
.
The ETS table name used will reflect the espace
instance
name. This will be espace_tspatt
for the default/unnamed instance, and
espace_tspatt_abc
for an instance named abc
.
etsmgr
application is used to add resiliency to the server
data, should the server restart while it is holding tuple
patterns.
add_pattern/4 | Add a new pattern to the waiting list. |
check_waitlist/2 | Check a tuple against waiting patterns. |
start_link/1 | Starts the server. |
add_pattern(Inst_name::atom(), Cli_ref::reference(), Pattern::tuple(), Cli_pid::pid()) -> ok
Add a new pattern to the waiting list.
We insert thePattern
along with the client's pid and unique ref
in the ETS table.
check_waitlist(Inst_name::atom(), Tuple::tuple()) -> ok
Check a tuple against waiting patterns.
We check the newly added tuple against the existing client patterns
using ets:test_ms/2
. If a pattern is found, the waiting client(s)
will be informed, via their Pid
and Cli_Ref
, to retry the
in
or rd
operation.
start_link(Inst_name::atom()) -> ignore | {error, {already_started, pid()} | term()} | {ok, pid()}
Starts the server
We expect an instance name to be supplied, which will be used to uniquely identify the ETS table for the instance.Generated by EDoc