Blocks until f(get)
is true, in a manner consistent with the current
context.
Blocks until f(get)
is true, in a manner consistent with the current
context. Requires that the predicate be safe to reevaluate, and that
f(x) == f(y)
if x == y
.
v.await(f)
is equivalent to
atomic { implicit t => if (!f(v.get)) retry }
If you want to wait for a predicate that involves more than one Ref
then use retry
directly.
a predicate that is safe to evaluate multiple times.
Equivalent to atomically executing
(if (before == get) { set(after); true } else false)
, but may be more
efficient, especially if there is no enclosing atomic block.
Equivalent to atomically executing
(if (before == get) { set(after); true } else false)
, but may be more
efficient, especially if there is no enclosing atomic block.
a value to compare against the ref
's contents using the
value's ==
method.
a value to store if before
was equal to the previous
contents.
true if before
was equal to the previous value of the viewed
Ref
, false otherwise.
Equivalent to atomically executing
(if (before eq get) { set(after); true } else false)
, but may be more
efficient, especially if there is no enclosing atomic block.
Equivalent to atomically executing
(if (before eq get) { set(after); true } else false)
, but may be more
efficient, especially if there is no enclosing atomic block.
a value to compare against the ref
's contents using
reference identity equality (eq
).
a value to store if before
was eq
to the previous
contents.
true if before
was eq
to the previous value of the viewed
Ref
, false otherwise.
Performs an atomic read; equivalent to apply()
.
Performs an atomic read; equivalent to apply()
.
the value of the Ref
as observed by the current context.
Atomically replaces the value v stored in the Ref
with
f
(v), returning the old value.
Atomically replaces the value v stored in the Ref
with
f
(v), returning the old value. transform
should be preferred
if the return value is not needed, since it gives the STM more
flexibility to avoid transaction conflicts.
a function that is safe to call multiple times, and safe to call later during any enclosing atomic block.
the previous value of the viewed Ref
.
Acts like ref.getWith(f)
if there is an active transaction, otherwise
just returns f(get)
.
Acts like ref.getWith(f)
if there is an active transaction, otherwise
just returns f(get)
.
an idempotent function.
the result of applying f
to the value contained in ref
.
Returns a Ref
that accesses the same memory location as this view.
Returns a Ref
that accesses the same memory location as this view.
The returned Ref
might be the original reference that was used to
construct this view, or it might be a Ref
that is equivalent
(and ==
) to the original.
a Ref
that accesses the same memory location as this view.
Acts like ref.relaxedGet(equiv)
if there is an active transaction,
otherwise just returns get
.
Acts like ref.relaxedGet(equiv)
if there is an active transaction,
otherwise just returns get
.
an equivalence function that returns true if a transaction that observed the first argument will still complete correctly, where the second argument is the actual value that should have been observed.
a value of the Ref
, not necessary consistent with the rest of
the reads performed by the active transaction, if any.
Performs an atomic write; equivalent to update(v)
.
Performs an atomic write; equivalent to update(v)
.
Works like set(v)
, but returns the old value.
Works like set(v)
, but returns the old value. This is an
atomic swap, equivalent to atomically performing a get
followed by set(v)
.
the previous value held by ref
.
Atomically replaces the value v stored in the Ref
with
f
(v).
Atomically replaces the value v stored in the Ref
with
f
(v). Some Ref
implementations may defer execution of f
or
call f
multiple times to avoid transaction conflicts.
a function that is safe to call multiple times, and safe to call later during the enclosing atomic block, if any.
Atomically replaces the value v stored in the Ref
with
f
(v), returning the new value.
Atomically replaces the value v stored in the Ref
with
f
(v), returning the new value. transform
should be preferred
if the return value is not needed, since it gives the STM more
flexibility to avoid transaction conflicts.
a function that is safe to call multiple times, and safe to call later during any enclosing atomic block.
the new value of the viewed Ref
.
Atomically replaces the value v stored in the Ref
with
pf
(v) if pf.isDefinedAt
(v), returning true, otherwise
leaves the element unchanged and returns false.
Atomically replaces the value v stored in the Ref
with
pf
(v) if pf.isDefinedAt
(v), returning true, otherwise
leaves the element unchanged and returns false. pf.apply
and
pf.isDefinedAt
might be invoked multiple times by the STM, and might
be called later in any enclosing atomic block.
a partial function that is safe to call multiple times, and safe to call later during any enclosing atomic block.
pf.isDefinedAt
(v), where v is the element held by
this Ref
on entry.
Blocks until f(get)
is true and returns true, or returns false if
the condition does not become true within within the specified timeout.
Blocks until f(get)
is true and returns true, or returns false if
the condition does not become true within within the specified timeout.
v.tryAwait(timeout)(f)
is equivalent to
atomic { implicit t => f(v.get) || { retryFor(timeout) ; false } }
the maximum amount of time to wait, in units of unit
.
the units in which the timeout is measured, defaulting to milliseconds.
a predicate that is safe to evaluate multiple times.
true if the predicate was satisfied, false if the wait timed out.
Performs an atomic write and returns true, or returns false.
Performs an atomic write and returns true, or returns false. The STM implementation may choose to return false to reduce (not necessarily avoid) blocking. If no other threads are performing any transactional or atomic accesses then this method will succeed.
Transforms the value stored in the Ref
by multiplying it.
Transforms the value stored in the Ref
by multiplying it.
Note: Implementations may choose to ignore the provided Numeric[A]
instance if A
is a primitive type.
the quantity by which to multiple the value of ref
.
Transforms the value stored in the Ref
by incrementing it.
Transforms the value stored in the Ref
by incrementing it.
Note: Implementations may choose to ignore the provided Numeric[A]
instance if A
is a primitive type.
the quantity by which to increment the value of ref
.
Transforms the value stored in the Ref
by decrementing it.
Transforms the value stored in the Ref
by decrementing it.
Note: Implementations may choose to ignore the provided Numeric[A]
instance if A
is a primitive type.
the quantity by which to decrement the value of ref
.
Transforms the value stored in ref
by performing a division on it,
throwing away the remainder if division is not exact for instances of
type A
.
Transforms the value stored in ref
by performing a division on it,
throwing away the remainder if division is not exact for instances of
type A
. The careful reader will note that division is actually
provided by Fractional[A]
or Integral[A]
, it is not defined on
Numeric[A]
. To avoid compile-time ambiguity this method accepts a
Numeric[A]
and assumes that it can be converted at runtime into
either a Fractional[A]
or an Integral[A]
.
Note: Implementations may choose to ignore the provided Numeric[A]
instance if A
is a primitive type.
the quantity by which to divide the value of ref
.
Performs an atomic read of the value in ref
.
Performs an atomic read of the value in ref
. If an atomic block is
active (see Txn.findCurrent
) then the read will be performed as part
of the transaction, otherwise it will act as if it was performed inside
a new atomic block. Equivalent to get
.
the value of the Ref
as observed by the current context.
Returns a string representation of the transactional value in this instance for debugging convenience.
Returns a string representation of the transactional value in this
instance for debugging convenience. The Ref
reads (and writes)
performed while constructing the result will be discarded before
returning. This method works fine outside a transaction.
If this method is called from within a transaction that is already
doomed (status Txn.Rolledback
), a string describing the reason
for the outer transaction's rollback will be returned.
Returns some value that is suitable for examination in a debugger,
or returns a Txn.RollbackCause
if called from inside a doomed atomic
block.
Returns some value that is suitable for examination in a debugger,
or returns a Txn.RollbackCause
if called from inside a doomed atomic
block.
Atomically replaces the value v stored in the Ref
with the first
element of the 2-tuple returned by f
(v), returning the second
element.
Atomically replaces the value v stored in the Ref
with the first
element of the 2-tuple returned by f
(v), returning the second
element.
a function that is safe to call multiple times.
the second element of the tuple returned by f
.
Performs an atomic write of the value in ref
.
Performs an atomic write of the value in ref
. If an atomic block
is active (see Txn.findCurrent
) then the write will be performed
as part of the transaction, otherwise it will act as if it was
performed inside a new atomic block. Equivalent to set(v)
.
Ref.View
provides access to the contents of aRef
without requiring that an implicitInTxn
be available. When called from within the dynamic scope of a transaction,View
's methods operate as part of that transaction. When there is no transaction activeView
's methods are still atomic, but only for the duration of the method call.A mental model of
View
is thatview.foo(args)
acts likeatomic { implicit t => view.ref.foo(args) }
.