- // At this point the successor has completed transition and is possibly visible by the user thread, which is
- // still stuck here. The successor has not seen final part of our state, nor the fact it is sealed.
- // Propagate state and seal the successor.
- flushState(successor);
- successor.ensureSealed();
- }
+ /**
+ * Seal this transaction and potentially send it out towards the backend. If this method reports false, the caller
+ * needs to deal with propagating the seal operation towards the successor.
+ *
+ * @param enqueuedTicks Enqueue ticks when this is invoked from replay path.
+ * @return True if seal operation was successful, false if this proxy has a successor.
+ */
+ boolean sealAndSend(final OptionalLong enqueuedTicks) {
+ return sealState();
+ }
+
+ private boolean sealState() {
+ parent.onTransactionSealed(this);
+ // Transition internal state to sealed and detect presence of a successor
+ return STATE_UPDATER.compareAndSet(this, OPEN, SEALED);
+ }
+
+ /**
+ * Mark this proxy as having been sealed.
+ *
+ * @return True if this call has transitioned to sealed state.
+ */
+ final boolean markSealed() {
+ return SEALED_UPDATER.compareAndSet(this, 0, 1);