package org.deuce.transaction.strongiso;
import org.deuce.transaction.strongiso.field.WriteFieldAccess;
import org.deuce.trove.TIntArrayList;
import org.deuce.trove.TIntProcedure;
import org.deuce.trove.TObjectProcedure;
/**
* Procedure used to scan the WriteSet on commit.
*
* @author Guy
* @since 1.4
*/
public class LockProcedure implements TObjectProcedure<WriteFieldAccess>{
private final TIntArrayList lockSet = new TIntArrayList();
private final byte[] locksMarker;
private final TIntProcedure unlockProcedure = new TIntProcedure(){
@Override
public boolean execute(int value) {
LockTable.unLock( value,locksMarker);
return true;
}
};
private static class SetAndUnlockProcedure implements TIntProcedure{
private final byte[] locksMarker;
private int newClock;
public SetAndUnlockProcedure(byte[] locksMarker){
this.locksMarker = locksMarker;
}
@Override
public boolean execute(int value) {
LockTable.setAndReleaseLock( value, newClock, locksMarker);
return true;
}
public void retrieveNewClock(){
this.newClock = Context.clock.incrementAndGet();
}
}
private final SetAndUnlockProcedure setAndUnlockProcedure;
public LockProcedure(byte[] locksMarker){
this.locksMarker = locksMarker;
setAndUnlockProcedure = new SetAndUnlockProcedure(locksMarker);
}
@Override
public boolean execute(WriteFieldAccess writeField) {
int hashCode = writeField.hashCode();
if( LockTable.lock( hashCode, locksMarker))
lockSet.add( hashCode);
return true;
}
public void unlockAll(){
lockSet.forEach(unlockProcedure);
lockSet.resetQuick();
}
public void setAndUnlockAll(){
setAndUnlockProcedure.retrieveNewClock();
lockSet.forEach(setAndUnlockProcedure);
lockSet.resetQuick();
}
}