package org.deuce.transaction.strongiso;
import java.util.Iterator;
import java.util.concurrent.atomic.AtomicInteger;
import org.deuce.reflection.AddressUtil;
import org.deuce.reflection.UnsafeHolder;
import org.deuce.transaction.TransactionException;
import org.deuce.transaction.strongiso.field.BooleanWriteFieldAccess;
import org.deuce.transaction.strongiso.field.ByteWriteFieldAccess;
import org.deuce.transaction.strongiso.field.CharWriteFieldAccess;
import org.deuce.transaction.strongiso.field.DoubleWriteFieldAccess;
import org.deuce.transaction.strongiso.field.FloatWriteFieldAccess;
import org.deuce.transaction.strongiso.field.IntWriteFieldAccess;
import org.deuce.transaction.strongiso.field.LongWriteFieldAccess;
import org.deuce.transaction.strongiso.field.ObjectWriteFieldAccess;
import org.deuce.transaction.strongiso.field.ReadFieldAccess;
import org.deuce.transaction.strongiso.field.ShortWriteFieldAccess;
import org.deuce.transaction.strongiso.field.TransStatus;
import org.deuce.transaction.strongiso.field.WriteFieldAccess;
import org.deuce.transaction.strongiso.pool.Pool;
import org.deuce.transaction.strongiso.pool.ResourceFactory;
import org.deuce.transform.Exclude;
import org.deuce.trove.TObjectProcedure;
import contention.benchmark.Counters;
import contention.benchmark.Statistics.CommitType;
/**
* TL2 implementation
*
* @author Guy Korland
* @since 1.0
*/
@Exclude
final public class Context implements org.deuce.transaction.Context {
final private static TransactionException FAILURE_NT = new TransactionException(
"Failure NT-read");
final private static TransactionException FAILURE_T = new TransactionException(
"Failure T-read");
final private static TransactionException FAILURE_LOCK = new TransactionException(
"Failure on lock");
final static AtomicInteger clock = new AtomicInteger(1);
final static AtomicInteger threadCounter = new AtomicInteger(0);
final static AtomicInteger committedHolder = new AtomicInteger(
TransStatus.COMMITTED);
final private PointerReadSet readSet = new PointerReadSet();
final private WriteSet writeSet = new WriteSet();
final private int threadId;
AtomicInteger status = null;
// Marked on beforeRead, used for the double lock check
private int localClock;
private long lastField;
// Mark if this is an NT transaction
private boolean isNT = false;
private boolean volatileTest = false;
public Context() {
this.localClock = clock.get();
this.threadId = threadCounter.getAndIncrement();
}
public void init(int atomicBlockId, String metainf) {
if(metainf.indexOf("NT") != -1) {
this.isNT = true;
this.volatileTest = false;
return;
}
if(metainf.indexOf("volatile") != -1) {
this.volatileTest = true;
this.isNT = false;
return;
}
this.volatileTest = false;
this.isNT = false;
this.readSet.clear();
this.writeSet.clear();
this.localClock = clock.get();
if (status == null) {
status = new AtomicInteger();
}
// this.objectPool.clear();
// this.booleanPool.clear();
// this.bytePool.clear();
// this.charPool.clear();
// this.shortPool.clear();
// this.intPool.clear();
// this.longPool.clear();
// this.floatPool.clear();
// this.doublePool.clear();
}
public boolean commit() {
if (this.isNT || this.volatileTest || writeSet.isEmpty()) // if the writeSet is empty no need to lock a
// thing.
return true;
WriteFieldAccess next, check;
int checkStatus;
Iterator<WriteFieldAccess> wsIter = writeSet.getWsIterator();
while (wsIter.hasNext()) {
next = wsIter.next();
check = (WriteFieldAccess) UnsafeHolder.getUnsafe()
.getObjectVolatile(next.reference, next.field);
if (check != null) {
if (!check.isNT
&& (checkStatus = check.status.get()) != TransStatus.COMMITTED) {
if (checkStatus == TransStatus.LIVE) {
status.set(TransStatus.ABORTED);
status = null;
return false;
}
next.setLast(check, true);
} else {
next.setLast(check, false);
}
// TODO: is this time setting safe?
int time = check.time;
if (time == Integer.MAX_VALUE) {
next.time = clock.get();
} else {
next.time = check.time;
}
} else {
// Here we just use the value directly in memory because this is the first write to this location
next.setLast();
// TODO: is this time setting safe?
next.time = 0;
}
if (!UnsafeHolder.getUnsafe().compareAndSwapObject(next.reference,
next.field, check, next)) {
status.set(TransStatus.ABORTED);
status = null;
return false;
}
}
// this.localClock = clock.getAndIncrement();
this.localClock = clock.incrementAndGet();
if (!readSet.validateAndNullRs(threadId)) {
status.set(TransStatus.ABORTED);
status = null;
return false;
}
wsIter = writeSet.getWsIterator();
// boolean abort = false;
while (wsIter.hasNext()) {
next = wsIter.next();
next.time = this.localClock;
if (next != (WriteFieldAccess) UnsafeHolder.getUnsafe()
.getObjectVolatile(next.reference, next.field)) {
// abort = true;
status.set(TransStatus.ABORTED);
status = null;
return false;
}
}
// if (abort) {
// status.set(TransStatus.ABORTED);
// status = null;
// return false;
// }
if (!status.compareAndSet(TransStatus.LIVE, TransStatus.COMMITTED)) {
status.set(TransStatus.ABORTED);
status = null;
return false;
}
status = null;
return true;
}
public void rollback() {
}
private boolean onNTReadAccess1(WriteFieldAccess write) {
boolean useOld = false;
if (!write.isNT) {
int status = write.status.get();
// Doing only linearizability here, so don't need to check time
if (status == TransStatus.LIVE) {
write.status.compareAndSet(TransStatus.LIVE,
TransStatus.ABORTED);
status = write.status.get();
}
if (status == TransStatus.ABORTED) {
useOld = true;
}
}
// Time check is not needed unless we doing serializablilty
// int time = write.time;
// if (time == Integer.MAX_VALUE) {
// time = clock.get();
// }
// this.localClock = Math.max(this.localClock, time);
return useOld;
}
// private WriteFieldAccess onReadAccess0(Object obj, long field) {
//
// ReadFieldAccess current = currentReadFieldAccess;
// int hash = current.hashCode();
//
// // Check the read is still valid
// LockTable.checkLock(hash, localClock, lastReadLock);
//
// // Check if it is already included in the write set
// return writeSet.contains(current);
// }
private boolean onReadAccess1(WriteFieldAccess write) {
boolean useOld = false;
if (write.isNT) {
if (write.time >= localClock)
throw FAILURE_NT;
// TODO: Validation (note: need to add to read set before
// validation)
} else {
int status = write.status.get();
if (status != TransStatus.COMMITTED) {
if (status == TransStatus.LIVE)
throw FAILURE_LOCK;
useOld = true;
}
if (write.time > localClock)
throw FAILURE_T;
}
readSet.add(write);
return useOld;
}
// private void addWriteAccess0(WriteFieldAccess write) {
//
// // Add to write set
// writeSet.put(write);
// }
public void beforeReadAccess(Object obj, long field) {
System.out.println("ERROR NONSTRONGISO NOT IMPLEMENTED");
//
// ReadFieldAccess next = readSet.getNext();
// currentReadFieldAccess = next;
// next.init(obj, field);
//
// // Check the read is still valid
// lastReadLock = LockTable.checkLock(next.hashCode(), localClock);
}
@Override
public void beforeReadAccessStrongIso(Object obj, long field, Object obj2,
long fieldObj) {
this.lastField = fieldObj;
}
// // Non-transactional Reads
// public Object onNTReadAccess(Object obj, Object value, long field) {
// ObjectWriteFieldAccess objVal = (ObjectWriteFieldAccess) UnsafeHolder
// .getUnsafe().getObjectVolatile(obj, this.lastField);
// if (objVal == null) {
// return value;
// }
// return onNTReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
// }
//
// public boolean onReadNTAccess(Object obj, boolean value, long field) {
// BooleanWriteFieldAccess objVal = (BooleanWriteFieldAccess) UnsafeHolder
// .getUnsafe().getObjectVolatile(obj, this.lastField);
// if (objVal == null) {
// return value;
// }
// return onNTReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
// }
//
// public byte onNTReadAccess(Object obj, byte value, long field) {
// ByteWriteFieldAccess objVal = (ByteWriteFieldAccess) UnsafeHolder
// .getUnsafe().getObjectVolatile(obj, this.lastField);
// if (objVal == null) {
// return value;
// }
// return onNTReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
// }
//
// public char onNTReadAccess(Object obj, char value, long field) {
// CharWriteFieldAccess objVal = (CharWriteFieldAccess) UnsafeHolder
// .getUnsafe().getObjectVolatile(obj, this.lastField);
// if (objVal == null) {
// return value;
// }
// return onNTReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
// }
//
// public short onNTReadAccess(Object obj, short value, long field) {
// ShortWriteFieldAccess objVal = (ShortWriteFieldAccess) UnsafeHolder
// .getUnsafe().getObjectVolatile(obj, this.lastField);
// if (objVal == null) {
// return value;
// }
// return onNTReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
// }
//
// public int onNTReadAccess(Object obj, int value, long field) {
// IntWriteFieldAccess objVal = (IntWriteFieldAccess) UnsafeHolder
// .getUnsafe().getObjectVolatile(obj, this.lastField);
// if (objVal == null) {
// return value;
// }
// return onNTReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
// }
//
// public long onNTReadAccess(Object obj, long value, long field) {
// LongWriteFieldAccess objVal = (LongWriteFieldAccess) UnsafeHolder
// .getUnsafe().getObjectVolatile(obj, this.lastField);
// if (objVal == null) {
// return value;
// }
// return onNTReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
// }
//
// public float onNTReadAccess(Object obj, float value, long field) {
// FloatWriteFieldAccess objVal = (FloatWriteFieldAccess) UnsafeHolder
// .getUnsafe().getObjectVolatile(obj, this.lastField);
// if (objVal == null) {
// return value;
// }
// return onNTReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
// }
//
// public double onNTReadAccess(Object obj, double value, long field) {
// DoubleWriteFieldAccess objVal = (DoubleWriteFieldAccess) UnsafeHolder
// .getUnsafe().getObjectVolatile(obj, this.lastField);
// if (objVal == null) {
// return value;
// }
// return onNTReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
// }
//
// Transactional Reads
public Object onReadAccess(Object obj, Object value, long field) {
if(this.isNT) {
ObjectWriteFieldAccess objVal = (ObjectWriteFieldAccess) UnsafeHolder
.getUnsafe().getObjectVolatile(obj, this.lastField);
if (objVal == null) {
return value;
}
return onNTReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
}
ObjectWriteFieldAccess writeAccess = (ObjectWriteFieldAccess) writeSet
.contains(obj, this.lastField);
if (writeAccess != null)
return writeAccess.getValue();
ObjectWriteFieldAccess objVal = (ObjectWriteFieldAccess) UnsafeHolder
.getUnsafe().getObjectVolatile(obj, this.lastField);
if (objVal == null) {
readSet.add(new ObjectWriteFieldAccess(value, obj, field,
this.lastField, committedHolder, false, this.threadId));
return value;
}
return onReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
}
public boolean onReadAccess(Object obj, boolean value, long field) {
if(this.isNT) {
BooleanWriteFieldAccess objVal = (BooleanWriteFieldAccess) UnsafeHolder
.getUnsafe().getObjectVolatile(obj, this.lastField);
if (objVal == null) {
return value;
}
return onNTReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
}
BooleanWriteFieldAccess writeAccess = (BooleanWriteFieldAccess) writeSet
.contains(obj, this.lastField);
if (writeAccess != null)
return writeAccess.getValue();
BooleanWriteFieldAccess objVal = (BooleanWriteFieldAccess) UnsafeHolder
.getUnsafe().getObjectVolatile(obj, this.lastField);
if (objVal == null) {
readSet.add(new BooleanWriteFieldAccess(value, obj, field,
this.lastField, committedHolder, false, this.threadId));
return value;
}
return onReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
}
public byte onReadAccess(Object obj, byte value, long field) {
if(this.isNT) {
ByteWriteFieldAccess objVal = (ByteWriteFieldAccess) UnsafeHolder
.getUnsafe().getObjectVolatile(obj, this.lastField);
if (objVal == null) {
return value;
}
return onNTReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
}
ByteWriteFieldAccess writeAccess = (ByteWriteFieldAccess) writeSet
.contains(obj, this.lastField);
if (writeAccess != null)
return writeAccess.getValue();
ByteWriteFieldAccess objVal = (ByteWriteFieldAccess) UnsafeHolder
.getUnsafe().getObjectVolatile(obj, this.lastField);
if (objVal == null) {
readSet.add(new ByteWriteFieldAccess(value, obj, field,
this.lastField, committedHolder, false, this.threadId));
return value;
}
return onReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
}
public char onReadAccess(Object obj, char value, long field) {
if(this.isNT) {
CharWriteFieldAccess objVal = (CharWriteFieldAccess) UnsafeHolder
.getUnsafe().getObjectVolatile(obj, this.lastField);
if (objVal == null) {
return value;
}
return onNTReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
}
CharWriteFieldAccess writeAccess = (CharWriteFieldAccess) writeSet
.contains(obj, this.lastField);
if (writeAccess != null)
return writeAccess.getValue();
CharWriteFieldAccess objVal = (CharWriteFieldAccess) UnsafeHolder
.getUnsafe().getObjectVolatile(obj, this.lastField);
if (objVal == null) {
readSet.add(new CharWriteFieldAccess(value, obj, field,
this.lastField, committedHolder, false, this.threadId));
return value;
}
return onReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
}
public short onReadAccess(Object obj, short value, long field) {
if(this.isNT) {
ShortWriteFieldAccess objVal = (ShortWriteFieldAccess) UnsafeHolder
.getUnsafe().getObjectVolatile(obj, this.lastField);
if (objVal == null) {
return value;
}
return onNTReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
}
ShortWriteFieldAccess writeAccess = (ShortWriteFieldAccess) writeSet
.contains(obj, this.lastField);
if (writeAccess != null)
return writeAccess.getValue();
ShortWriteFieldAccess objVal = (ShortWriteFieldAccess) UnsafeHolder
.getUnsafe().getObjectVolatile(obj, this.lastField);
if (objVal == null) {
readSet.add(new ShortWriteFieldAccess(value, obj, field,
this.lastField, committedHolder, false, this.threadId));
return value;
}
return onReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
}
public int onReadAccess(Object obj, int value, long field) {
if(this.isNT) {
IntWriteFieldAccess objVal = (IntWriteFieldAccess) UnsafeHolder
.getUnsafe().getObjectVolatile(obj, this.lastField);
if (objVal == null) {
return value;
}
return onNTReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
}
if(this.volatileTest) {
return UnsafeHolder.getUnsafe().getIntVolatile(obj, field);
}
IntWriteFieldAccess writeAccess = (IntWriteFieldAccess) writeSet
.contains(obj, this.lastField);
if (writeAccess != null)
return writeAccess.getValue();
IntWriteFieldAccess objVal = (IntWriteFieldAccess) UnsafeHolder
.getUnsafe().getObjectVolatile(obj, this.lastField);
if (objVal == null) {
readSet.add(new IntWriteFieldAccess(value, obj, field,
this.lastField, committedHolder, false, this.threadId));
return value;
}
return onReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
}
public long onReadAccess(Object obj, long value, long field) {
if(this.isNT) {
LongWriteFieldAccess objVal = (LongWriteFieldAccess) UnsafeHolder
.getUnsafe().getObjectVolatile(obj, this.lastField);
if (objVal == null) {
return value;
}
return onNTReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
}
LongWriteFieldAccess writeAccess = (LongWriteFieldAccess) writeSet
.contains(obj, this.lastField);
if (writeAccess != null)
return writeAccess.getValue();
LongWriteFieldAccess objVal = (LongWriteFieldAccess) UnsafeHolder
.getUnsafe().getObjectVolatile(obj, this.lastField);
if (objVal == null) {
readSet.add(new LongWriteFieldAccess(value, obj, field,
this.lastField, committedHolder, false, this.threadId));
return value;
}
return onReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
}
public float onReadAccess(Object obj, float value, long field) {
if(this.isNT) {
FloatWriteFieldAccess objVal = (FloatWriteFieldAccess) UnsafeHolder
.getUnsafe().getObjectVolatile(obj, this.lastField);
if (objVal == null) {
return value;
}
return onNTReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
}
FloatWriteFieldAccess writeAccess = (FloatWriteFieldAccess) writeSet
.contains(obj, this.lastField);
if (writeAccess != null)
return writeAccess.getValue();
FloatWriteFieldAccess objVal = (FloatWriteFieldAccess) UnsafeHolder
.getUnsafe().getObjectVolatile(obj, this.lastField);
if (objVal == null) {
readSet.add(new FloatWriteFieldAccess(value, obj, field,
this.lastField, committedHolder, false, this.threadId));
return value;
}
return onReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
}
public double onReadAccess(Object obj, double value, long field) {
if(this.isNT) {
DoubleWriteFieldAccess objVal = (DoubleWriteFieldAccess) UnsafeHolder
.getUnsafe().getObjectVolatile(obj, this.lastField);
if (objVal == null) {
return value;
}
return onNTReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
}
DoubleWriteFieldAccess writeAccess = (DoubleWriteFieldAccess) writeSet
.contains(obj, this.lastField);
if (writeAccess != null)
return writeAccess.getValue();
DoubleWriteFieldAccess objVal = (DoubleWriteFieldAccess) UnsafeHolder
.getUnsafe().getObjectVolatile(obj, this.lastField);
if (objVal == null) {
readSet.add(new DoubleWriteFieldAccess(value, obj, field,
this.lastField, committedHolder, false, this.threadId));
return value;
}
return onReadAccess1(objVal) ? objVal.getOldValue() : objVal.getValue();
}
public void onWriteAccess(Object obj, Object value, long field) {
System.out.println("ERROR NONSTRONGISO NOT IMPLEMENTED");
}
public void onWriteAccess(Object obj, boolean value, long field) {
System.out.println("ERROR NONSTRONGISO NOT IMPLEMENTED");
}
public void onWriteAccess(Object obj, byte value, long field) {
System.out.println("ERROR NONSTRONGISO NOT IMPLEMENTED");
}
public void onWriteAccess(Object obj, char value, long field) {
System.out.println("ERROR NONSTRONGISO NOT IMPLEMENTED");
}
public void onWriteAccess(Object obj, short value, long field) {
System.out.println("ERROR NONSTRONGISO NOT IMPLEMENTED");
}
public void onWriteAccess(Object obj, int value, long field) {
System.out.println("ERROR NONSTRONGISO NOT IMPLEMENTED");
}
public void onWriteAccess(Object obj, long value, long field) {
System.out.println("ERROR NONSTRONGISO NOT IMPLEMENTED");
}
public void onWriteAccess(Object obj, float value, long field) {
System.out.println("ERROR NONSTRONGISO NOT IMPLEMENTED");
}
public void onWriteAccess(Object obj, double value, long field) {
System.out.println("ERROR NONSTRONGISO NOT IMPLEMENTED");
}
//
// // Nontransactional writes
// public void onNTWriteAccessStrongIso(Object obj, Object value, long field,
// long fieldObj) {
//
// ObjectWriteFieldAccess next = new ObjectWriteFieldAccess(value, obj,
// field, fieldObj, null, true, threadId);
//
// UnsafeHolder.getUnsafe().putObjectVolatile(obj, fieldObj, next);
//
// }
//
// public void onNTWriteAccessStrongIso(Object obj, boolean value, long field,
// long fieldObj) {
//
// BooleanWriteFieldAccess next = new BooleanWriteFieldAccess(value, obj,
// field, fieldObj, null, true, threadId);
//
// UnsafeHolder.getUnsafe().putObjectVolatile(obj, fieldObj, next);
// }
//
// public void onNTWriteAccessStrongIso(Object obj, byte value, long field,
// long fieldObj) {
// ByteWriteFieldAccess next = new ByteWriteFieldAccess(value, obj,
// field, fieldObj, null, true, threadId);
//
// UnsafeHolder.getUnsafe().putObjectVolatile(obj, fieldObj, next);
// }
//
// public void onNTWriteAccessStrongIso(Object obj, char value, long field,
// long fieldObj) {
// CharWriteFieldAccess next = new CharWriteFieldAccess(value, obj,
// field, fieldObj, null, true, threadId);
//
// UnsafeHolder.getUnsafe().putObjectVolatile(obj, fieldObj, next);
// }
//
// public void onNTWriteAccessStrongIso(Object obj, short value, long field,
// long fieldObj) {
// ShortWriteFieldAccess next = new ShortWriteFieldAccess(value, obj,
// field, fieldObj, null, true, threadId);
//
// UnsafeHolder.getUnsafe().putObjectVolatile(obj, fieldObj, next);
// }
//
// public void onNTWriteAccessStrongIso(Object obj, int value, long field,
// long fieldObj) {
// IntWriteFieldAccess next = new IntWriteFieldAccess(value, obj,
// field, fieldObj, null, true, threadId);
//
// UnsafeHolder.getUnsafe().putObjectVolatile(obj, fieldObj, next);
// }
//
// public void onNTWriteAccessStrongIso(Object obj, long value, long field,
// long fieldObj) {
// LongWriteFieldAccess next = new LongWriteFieldAccess(value, obj,
// field, fieldObj, null, true, threadId);
//
// UnsafeHolder.getUnsafe().putObjectVolatile(obj, fieldObj, next);
// }
//
// public void onNTWriteAccessStrongIso(Object obj, float value, long field,
// long fieldObj) {
// FloatWriteFieldAccess next = new FloatWriteFieldAccess(value, obj,
// field, fieldObj, null, true, threadId);
//
// UnsafeHolder.getUnsafe().putObjectVolatile(obj, fieldObj, next);
// }
//
// public void onNTWriteAccessStrongIso(Object obj, double value, long field,
// long fieldObj) {
// DoubleWriteFieldAccess next = new DoubleWriteFieldAccess(value, obj,
// field, fieldObj, null, true, threadId);
//
// UnsafeHolder.getUnsafe().putObjectVolatile(obj, fieldObj, next);
// }
// Transactional writes
public void onWriteAccessStrongIso(Object obj, Object value, long field,
long fieldObj) {
if(this.isNT) {
ObjectWriteFieldAccess next = new ObjectWriteFieldAccess(value, obj,
field, fieldObj, null, true, threadId);
UnsafeHolder.getUnsafe().putObjectVolatile(obj, fieldObj, next);
return;
}
ObjectWriteFieldAccess next = new ObjectWriteFieldAccess(value, obj,
field, fieldObj, status, false, threadId);
writeSet.put(next);
}
public void onWriteAccessStrongIso(Object obj, boolean value, long field,
long fieldObj) {
if(this.isNT) {
BooleanWriteFieldAccess next = new BooleanWriteFieldAccess(value, obj,
field, fieldObj, null, true, threadId);
UnsafeHolder.getUnsafe().putObjectVolatile(obj, fieldObj, next);
return;
}
BooleanWriteFieldAccess next = new BooleanWriteFieldAccess(value, obj,
field, fieldObj, status, false, threadId);
writeSet.put(next);
}
public void onWriteAccessStrongIso(Object obj, byte value, long field,
long fieldObj) {
if(this.isNT) {
ByteWriteFieldAccess next = new ByteWriteFieldAccess(value, obj,
field, fieldObj, null, true, threadId);
UnsafeHolder.getUnsafe().putObjectVolatile(obj, fieldObj, next);
return;
}
ByteWriteFieldAccess next = new ByteWriteFieldAccess(value, obj, field,
fieldObj, status, false, threadId);
writeSet.put(next);
}
public void onWriteAccessStrongIso(Object obj, char value, long field,
long fieldObj) {
if(this.isNT) {
CharWriteFieldAccess next = new CharWriteFieldAccess(value, obj,
field, fieldObj, null, true, threadId);
UnsafeHolder.getUnsafe().putObjectVolatile(obj, fieldObj, next);
return;
}
CharWriteFieldAccess next = new CharWriteFieldAccess(value, obj, field,
fieldObj, status, false, threadId);
writeSet.put(next);
}
public void onWriteAccessStrongIso(Object obj, short value, long field,
long fieldObj) {
if(this.isNT) {
ShortWriteFieldAccess next = new ShortWriteFieldAccess(value, obj,
field, fieldObj, null, true, threadId);
UnsafeHolder.getUnsafe().putObjectVolatile(obj, fieldObj, next);
return;
}
ShortWriteFieldAccess next = new ShortWriteFieldAccess(value, obj,
field, fieldObj, status, false, threadId);
writeSet.put(next);
}
public void onWriteAccessStrongIso(Object obj, int value, long field,
long fieldObj) {
if(this.isNT) {
IntWriteFieldAccess next = new IntWriteFieldAccess(value, obj,
field, fieldObj, null, true, threadId);
UnsafeHolder.getUnsafe().putObjectVolatile(obj, fieldObj, next);
return;
}
if(this.volatileTest) {
UnsafeHolder.getUnsafe().putIntVolatile(obj, field, value);
}
IntWriteFieldAccess next = new IntWriteFieldAccess(value, obj, field,
fieldObj, status, false, threadId);
writeSet.put(next);
}
public void onWriteAccessStrongIso(Object obj, long value, long field,
long fieldObj) {
if(this.isNT) {
LongWriteFieldAccess next = new LongWriteFieldAccess(value, obj,
field, fieldObj, null, true, threadId);
UnsafeHolder.getUnsafe().putObjectVolatile(obj, fieldObj, next);
return;
}
LongWriteFieldAccess next = new LongWriteFieldAccess(value, obj, field,
fieldObj, status, false, threadId);
writeSet.put(next);
}
public void onWriteAccessStrongIso(Object obj, float value, long field,
long fieldObj) {
if(this.isNT) {
FloatWriteFieldAccess next = new FloatWriteFieldAccess(value, obj,
field, fieldObj, null, true, threadId);
UnsafeHolder.getUnsafe().putObjectVolatile(obj, fieldObj, next);
return;
}
FloatWriteFieldAccess next = new FloatWriteFieldAccess(value, obj,
field, fieldObj, status, false, threadId);
writeSet.put(next);
}
public void onWriteAccessStrongIso(Object obj, double value, long field,
long fieldObj) {
if(this.isNT) {
DoubleWriteFieldAccess next = new DoubleWriteFieldAccess(value, obj,
field, fieldObj, null, true, threadId);
UnsafeHolder.getUnsafe().putObjectVolatile(obj, fieldObj, next);
return;
}
DoubleWriteFieldAccess next = new DoubleWriteFieldAccess(value, obj,
field, fieldObj, status, false, threadId);
writeSet.put(next);
}
// private static class ObjectResourceFactory implements
// ResourceFactory<ObjectWriteFieldAccess>{
// @Override
// public ObjectWriteFieldAccess newInstance() {
// return new ObjectWriteFieldAccess();
// }
// }
// final private Pool<ObjectWriteFieldAccess> objectPool = new
// Pool<ObjectWriteFieldAccess>(new ObjectResourceFactory());
//
// private static class BooleanResourceFactory implements
// ResourceFactory<BooleanWriteFieldAccess>{
// @Override
// public BooleanWriteFieldAccess newInstance() {
// return new BooleanWriteFieldAccess();
// }
// }
// final private Pool<BooleanWriteFieldAccess> booleanPool = new
// Pool<BooleanWriteFieldAccess>(new BooleanResourceFactory());
//
// private static class ByteResourceFactory implements
// ResourceFactory<ByteWriteFieldAccess>{
// @Override
// public ByteWriteFieldAccess newInstance() {
// return new ByteWriteFieldAccess();
// }
// }
// final private Pool<ByteWriteFieldAccess> bytePool = new
// Pool<ByteWriteFieldAccess>( new ByteResourceFactory());
//
// private static class CharResourceFactory implements
// ResourceFactory<CharWriteFieldAccess>{
// @Override
// public CharWriteFieldAccess newInstance() {
// return new CharWriteFieldAccess();
// }
// }
// final private Pool<CharWriteFieldAccess> charPool = new
// Pool<CharWriteFieldAccess>(new CharResourceFactory());
//
// private static class ShortResourceFactory implements
// ResourceFactory<ShortWriteFieldAccess>{
// @Override
// public ShortWriteFieldAccess newInstance() {
// return new ShortWriteFieldAccess();
// }
// }
// final private Pool<ShortWriteFieldAccess> shortPool = new
// Pool<ShortWriteFieldAccess>( new ShortResourceFactory());
//
// private static class IntResourceFactory implements
// ResourceFactory<IntWriteFieldAccess>{
// @Override
// public IntWriteFieldAccess newInstance() {
// return new IntWriteFieldAccess();
// }
// }
// final private Pool<IntWriteFieldAccess> intPool = new
// Pool<IntWriteFieldAccess>( new IntResourceFactory());
//
// private static class LongResourceFactory implements
// ResourceFactory<LongWriteFieldAccess>{
// @Override
// public LongWriteFieldAccess newInstance() {
// return new LongWriteFieldAccess();
// }
// }
// final private Pool<LongWriteFieldAccess> longPool = new
// Pool<LongWriteFieldAccess>( new LongResourceFactory());
//
// private static class FloatResourceFactory implements
// ResourceFactory<FloatWriteFieldAccess>{
// @Override
// public FloatWriteFieldAccess newInstance() {
// return new FloatWriteFieldAccess();
// }
// }
// final private Pool<FloatWriteFieldAccess> floatPool = new
// Pool<FloatWriteFieldAccess>( new FloatResourceFactory());
//
// private static class DoubleResourceFactory implements
// ResourceFactory<DoubleWriteFieldAccess>{
// @Override
// public DoubleWriteFieldAccess newInstance() {
// return new DoubleWriteFieldAccess();
// }
// }
// final private Pool<DoubleWriteFieldAccess> doublePool = new
// Pool<DoubleWriteFieldAccess>( new DoubleResourceFactory());
// @Override
// public void beforeReadAccessStrongIso(Object obj, long field, Object
// obj2, long fieldObj) {
// try {
// System.out.println(AddressUtil.getAddress(Counters.class.getDeclaredField("counterOne")));
// System.out.println(AddressUtil.getAddress(Counters.class.getDeclaredField("counterOne__OBJECT__")));
// System.out.println(AddressUtil.getAddress(Counters.class.getDeclaredField("counterTwo")));
// System.out.println(AddressUtil.getAddress(Counters.class.getDeclaredField("counterTwo__OBJECT__")));
// System.out.println(AddressUtil.getAddress(Counters.class.getDeclaredField("counterThree")));
// System.out.println(AddressUtil.getAddress(Counters.class.getDeclaredField("counterThree__OBJECT__")));
// System.out.println(AddressUtil.getAddress(Counters.class.getDeclaredField("counterFour")));
// System.out.println(AddressUtil.getAddress(Counters.class.getDeclaredField("counterFour__OBJECT__")));
// System.out.println(AddressUtil.getAddress(Counters.class.getDeclaredField("failuresCounter")));
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// UnsafeHolder.getUnsafe().putObject(obj, fieldObj, new
// ReadFieldAccess("This is a string obj", -1));
// this.beforeReadAccess(obj, field);
// }
}