package jvstm.test.jwormbench;
import jvstm.UtilUnsafe;
import jvstm.ReadWriteTransaction;
import jvstm.Transaction;
import jvstm.VBox;
import jvstm.AomBarriers;
import jvstm.VBoxAom;
import jwormbench.core.INode;
import jwormbench.core.IWorm;
/**
* Abstracts the node object within the BenchWorld.
*
* @author F. Miguel Carvalho mcarvalho[@]cc.isel.pt
*/
public class BenchWorldNodeAom extends VBoxAom<BenchWorldNodeAom> implements INode{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
*------------ AOM INFRA-STRUCTURE -----------------*
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
private static final long value__ADDRESS__;
static{
try {
value__ADDRESS__ = UtilUnsafe.UNSAFE.objectFieldOffset(BenchWorldNodeAom.class.getDeclaredField("value"));
} catch (SecurityException e) {
throw new RuntimeException(e);
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ---------------------- FIELDS ---------------------
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
protected int value;
protected IWorm worm;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ------------------- CONSTRUCTOR -----------------
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public BenchWorldNodeAom(int value){
this.value = value;
worm = null;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ------------------- PROPERTIES -----------------
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* @see wormbench.INode#getValue()
*/
public int getValue() {
return AomBarriers.get(Transaction.current(), this).value;
}
/**
* @see wormbench.INode#setValue(int)
*/
public void setValue(int value) {
AomBarriers.put((ReadWriteTransaction) Transaction.current(), this, value, value__ADDRESS__);
}
/**
* @see wormbench.INode#getWorm()
*/
public IWorm getWorm() {
return worm;
}
/**
* @see wormbench.INode#setWorm(IWorm)
*/
public void setWorm(IWorm w) {
this.worm = w;
/*
if(worm.get() != w && worm.get() != null && w!= null)
throw new NodeAlreadyOccupiedException(
String.format("Worm %s can not move to node with worm %s", w.getName(), worm.get().getName()));
worm.put(w);
*/
}
@Override
public BenchWorldNodeAom replicate() {
return new BenchWorldNode__FIELDS__(value);
}
@Override
public void toCompactLayout(BenchWorldNodeAom from) {
this.value = from.value;
}
}