
record_wait_remove(+Key, ?Value, +Timeout)

   Variant of erase/2, suitable for thread communication

Arguments
   Key                 A record name (atom/compound) or handle.
   Value               An arbitrary term.
   Timeout             Timeout in seconds (integer or float), or the atom 'block'

Type
   Recorded Database

Description

   Like erase/2, this predicate finds the first term (recorded under Key)
   that unifies with Value, and removes it from the record.  If Value is
   a variable, it simply removes (and retrieves) the first recorded term.

   In addition, this predicate, together with record_wait_append/4,
   implements a bounded queue with synchronisation between concurrent
   threads.

   If there are no unifiable recorded terms for Key, the predicate blocks
   until an invocation of record_wait_append/4 (in another thread) records
   another term, and then attempts the removal again.  If no new term is
   added within Timeout seconds, the predicate fails.

   Conversely, when the removal of an element sufficiently reduces the
   queue length, this predicate unblocks all currently blocking
   invocations of record_wait_append/4 on the same Key.



Modes and Determinism
   record_wait_remove(+, ?, +) is semidet

Modules
   This predicate is sensitive to its module context (tool predicate, see @/2).

Fail Conditions
   Fails if there are no records until Timeout expires

Exceptions
     4 --- Key or Timeout is not instantiated.
     5 --- Key is neither atom, compound term, nor record handle.
     5 --- Timeout is neither integer, float, nor the atom 'block'
     6 --- Timeout is a negative number
    45 --- Key does is not a declared record name

Examples
   see record_wait_append/4

See Also
   record_create / 1, recordz / 2, record_wait_append / 4
