package pt.ist.fenixframework.backend.jvstm.pstm; import static jvstm.UtilUnsafe.UNSAFE; import jvstm.TopLevelTransaction; import jvstm.TransactionUtils; import jvstm.UtilUnsafe; import jvstm.WriteSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import pt.ist.fenixframework.backend.jvstm.lf.CommitRequest; import pt.ist.fenixframework.backend.jvstm.lf.RemoteWriteSet; public class RemoteCommitOnlyTransaction extends CommitOnlyTransaction { private static final Logger logger = LoggerFactory.getLogger(RemoteCommitOnlyTransaction.class); private static final long writeSetOffset = UtilUnsafe.objectFieldOffset(RemoteCommitOnlyTransaction.class, "writeSet"); private final WriteSet writeSet = RemoteWriteSet.EMPTY; public RemoteCommitOnlyTransaction(CommitRequest commitRequest) { super(TransactionUtils.getRecordForRemoteTransaction(commitRequest.getTxVersion()), commitRequest); } @Override public TopLevelTransaction getUnderlyingTransaction() { return this; } @Override protected WriteSet getWriteSet() { WriteSet thisWriteSet = this.writeSet; if (thisWriteSet == RemoteWriteSet.EMPTY) { thisWriteSet = makeWriteSet(); if (UNSAFE.compareAndSwapObject(this, this.writeSetOffset, RemoteWriteSet.EMPTY, thisWriteSet)) { logger.debug("set writeSet for request {}", this.commitRequest.getId()); } else { logger.debug("writeSet was already set for request {}", this.commitRequest.getId()); thisWriteSet = this.writeSet; } } return thisWriteSet; } @Override public WriteSet makeWriteSet() { return new RemoteWriteSet(this.commitRequest.getWriteSet()); } @Override public void updateOrecVersion() { // no-op } }