[ Recorded Database | Reference Manual | Alphabetic Index ]

# record_wait_remove(+Key, ?Value, +Timeout)

Variant of erase/2, suitable for thread communication

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

## 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) instantiation fault
  Key or Timeout is not instantiated.
(5) type error
  Key is neither atom, compound term, nor record handle.
(5) type error
  Timeout is neither integer, float, nor the atom 'block'
(6) out of range
  Timeout is a negative number
(45) named object does not exist
  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