Executes block
one or more times until an atomic execution is achieved,
buffering and/or locking writes so they are not visible until success.
Executes block
one or more times until an atomic execution is achieved,
buffering and/or locking writes so they are not visible until success.
the return type of the atomic block
code to execute atomically
the value returned from block
after a successful optimistic
concurrency attempt
Atomically compares and sets two Ref
s, probably more efficiently then
the corresponding transaction.
Atomically compares and sets two Ref
s, probably more efficiently then
the corresponding transaction. Equivalent to
atomic { implicit t => a() == a0 && b() == b0 && { a() = a1 ; b() = b1 ; true } }
Atomically compares and sets two Ref
s using identity comparison,
probably more efficiently then the corresponding transaction.
Atomically compares and sets two Ref
s using identity comparison,
probably more efficiently then the corresponding transaction. Equivalent
to
atomic { implicit t => val f = (a() eq a0) && (b() eq b0) if (f && (a0 ne a1)) a() = a1 if (f && (b0 ne b1)) b() = b1 f }
Returns the current InTxn
instance if it is active or in the process of
committing on the current thread, null
otherwise.
Returns the current InTxn
instance if it is active or in the process of
committing on the current thread, null
otherwise. Always performs a
dynamic lookup.
Returns Some(txn)
if txn
is the InTxn
active or in the process of
committing on the current thread, None
otherwise.
Returns Some(txn)
if txn
is the InTxn
active or in the process of
committing on the current thread, None
otherwise.
Returns true if x
should be treated as a transfer of control, rather
than an error.
Returns true if x
should be treated as a transfer of control, rather
than an error. Atomic blocks that end with an uncaught control flow
exception are committed, while atomic blocks that end with an uncaught
error exception are rolled back.
All implementations of this method must return true for instances that
implement scala.util.control.ControlThrowable
.
Returns a new commit barrier suitable for coordinating commits by this STM implementation.
Returns a new commit barrier suitable for coordinating commits by this STM implementation.
T
will not be one of the primitive types (for which a newRef
specialization exists).
T
will not be one of the primitive types (for which a newRef
specialization exists).
Atomically executes a transaction that is composed from blocks
by
joining with a left-biased orAtomic
operator.
Atomically executes a transaction that is composed from blocks
by
joining with a left-biased orAtomic
operator. The following two
examples are equivalent. Using orAtomic
:
atomic { implicit t => // body A } orAtomic { implicit t => // body B } ...
Using oneOf
:
atomic.oneOf( { implicit t: InTxn => // body A }, { implicit t: InTxn => // body B } )
The first block will be attempted in an optimistic transaction until it
either succeeds, fails with no retry possible (in which case the causing
exception will be rethrown), or performs a call to retry
. If a retry
is requested, then the next block will be attempted in the same fashion.
If all blocks are explicitly retried then execution resumes at the first
block, but only after another context has changed some value read by one
of the attempts.
The left-biasing of the orAtomic
composition guarantees that if the
first block does not call retry
, no other blocks will be executed.
Returns a function that records, reports or discards exceptions that were thrown from a while-committing, after-commit or after-rollback life-cycle callback.
Returns a function that records, reports or discards exceptions that were thrown from a while-committing, after-commit or after-rollback life-cycle callback.
(rare) Associates an alternative atomic block with the current thread.
(rare) Associates an alternative atomic block with the current thread.
The next call to apply
will consider block
to be an alternative.
Multiple alternatives may be associated before calling apply
. Returns
true if this is the first pushed alternative, false otherwise. This
method is not usually called directly. Alternative atomic blocks are
only attempted if the previous alternatives call retry
.
Note that it is not required that pushAlternative
be called on the same
instance of TxnExecutor
as apply
, just that they have been derived
from the same original executor.
Returns Some(t)
if t
is the retry timeout in nanoseconds used by
this TxnExecutor
, or None
otherwise.
Returns Some(t)
if t
is the retry timeout in nanoseconds used by
this TxnExecutor
, or None
otherwise. If the retry timeout is
Some(t)
and an atomic block executed by the returned executor blocks
with retry
or retryFor
for more than t
nanoseconds the retry will
be cancelled with an InterruptedException
.
The retry timeout has essentially the same effect as replacing calls to
retry
with
{ retryFor(timeout, NANOS) ; throw new InterruptedException }
.
Alternately, retryFor(timeout)
has roughly the same effect as
try { atomic.withRetryTimeout(timeout) { implicit txn => retry } } catch { case _: InterruptedException => }
Performs a computation in a transaction and returns the result, but always rolls back the transaction.
Performs a computation in a transaction and returns the result, but
always rolls back the transaction. No writes performed by block
will
be committed or exposed to other threads. This may be useful for
heuristic decisions or for debugging, as for the various dbgStr
implementations.
The caller is responsible for correctness: It is a code smell
if Z is a type that is constructed from Ref,
TMap,
TSet, .....
If this method is executed inside an outer transaction that has status
Txn.RolledBack
then block
can't complete. The default behavior
(if outerFailure
is null) in that case is to immediately roll back
the outer transaction. If a non-null outerFailure
handler has been
provided, however, it allow this method to return. This is useful when
the unrecorded transaction is being used for debugging or logging.
atomic.unrecorded { implicit txn => code }
is roughly equivalent to
the following, except that the rollback cause used will be
Txn.UnrecordedTxnCause
:
case class Tunnel(z: Z) extends Exception {} try { atomic.withControlFlowRecognizer({ case Tunnel(_) => false }) { implicit txn => throw Tunnel(code) } } catch { case Tunnel(z) => z }
Returns a TxnExecutor e
that is identical to this one, except that
e.isControlFlow(x)
will return pf(x)
if pf.isDefined(x)
.
Returns a TxnExecutor e
that is identical to this one, except that
e.isControlFlow(x)
will return pf(x)
if pf.isDefined(x)
. For
exceptions for which pf
is not defined the decision will be deferred to
the previous implementation.
This function may be combined with TxnExecutor.transformDefault
to add
system-wide recognition of a control-transfer exception that does not
extend scala.util.control.ControlThrowable
. For example, to modify the
default behavior of all TxnExecutor.isControlFlow
calls to accept
DSLNonLocalControlTransferException
:
TxnExecutor.transformDefault { e => e.withControlFlowRecognizer { case _: DSLNonLocalControlTransferException => true } }
Returns a TxnExecutor e
that is identical to this one, except that
e.postDecisionFailureHandler
will return handler
.
Returns a TxnExecutor e
that is identical to this one, except that
e.postDecisionFailureHandler
will return handler
. This function may
be called from inside a function passed to TxnExecutor.transformDefault
to change the system-wide post-decision failure handler.
Returns a TxnExecutor
that is identical to this one except that it has
the specified retry timeout.
Returns a TxnExecutor
that is identical to this one except that it has
the specified retry timeout. The default time unit is milliseconds. If
the retry timeout expires the retry will be cancelled with an
InterruptedException
.
Returns a TxnExecutor
that is identical to this one, except that it has
a retryTimeout
of timeoutNanos
.
Returns a TxnExecutor
that is identical to this one, except that it has
a retryTimeout
of timeoutNanos
.