View Source espace_util (espace v0.9.0)

A set of utility functions to support the rest of the espace modules.

Summary

Functions

Conditionally evaluate a tuple and out the result to the unnamed instance.

Conditionally evaluate a tuple and out the result to a named instance.

Convert an instance name to longer prefixed name.

wait for etsmgr to (re)start, then ask it to manage our table.

Functions

eval_out(Tuple_in)

-spec eval_out(tuple()) -> done.

Conditionally evaluate a tuple and out the result to the unnamed instance.

See eval_out/2 for details.

eval_out(Inst_name, Tuple_in)

-spec eval_out(atom(), tuple()) -> done.

Conditionally evaluate a tuple and out the result to a named instance.

The elements of the output tuple correspond to those of Tuple_in. If any of the elements of Tuple_in are recognized as function, then the corresponding output element will be the value of the function.

Two types of patterns are recognized as functions and are evaluated. A normal function expression of arity zero, fun () -> expr end. And, a tuple with two elements, a function expresion of arity N and a list of length N, N can be zero.

Any other pattern will move the element to the output tuple untouched.

inst_to_name(Prefix, Inst_name)

-spec inst_to_name(atom(), atom()) -> atom().

Convert an instance name to longer prefixed name.

This is used for obtaining the instance specific server/table names. For example inst_to_name(espace_sup, aaa) will return espace_sup_aaa.

If the instance name is espace, then the prefix is returned without an instance name suffix. For example inst_to_name(espace_sup, espace) will return espace_sup.

Instead of generating the full name each time this function is called, we perform the conversion once and cache the result as an entry in the persistent_term store. Each entry has the key {espace, Inst_name, Prefix}, e.g. {espace, aaa, espace_sup}, and the full name as value, e.g. espace_sup_aaa.

The use of persistent_term store will help speed up all named instances, including the short lived espace:eval/2 processes.

wait4etsmgr(Inst_name, _, Table_name, Table_opts)

-spec wait4etsmgr(atom(), init | recover, atom(), term()) -> {ok, pid(), ets:tab()} | {error, term()}.

wait for etsmgr to (re)start, then ask it to manage our table.

There are two occassions where this function is called:

  1. init - start/restart of our gen_server that owns a table, in this case we do not have, or know of, the ETS table. So we ask etsmgr to create a new table using etsmgr:new_table/4. If etsmgr is already managing such a table that does not already belong to another process, then that table will be given to us.
  2. recover - recovery of the etsmgr server, in this case we ask etsmgr to start managing our ETS table.