package cute.concolic.concurrency;
import java.util.IdentityHashMap;
/**
* Created by IntelliJ IDEA.
* User: Koushik Sen (ksen@cs.uiuc.edu)
* Date: Jun 26, 2006
* Time: 2:50:09 PM
*/
class PrevCount {
private IdentityHashMap prevC = new IdentityHashMap();
public void setCount(int c){
Thread curr = Thread.currentThread();
prevC.put(curr,new Integer(c));
}
public int getCount(){
Thread curr = Thread.currentThread();
Integer i = (Integer)prevC.get(curr);
if(i==null)
return 1;
else {
return i.intValue();
}
}
}
public class LockBase {
private IdentityHashMap locks;
public LockBase() {
locks = new IdentityHashMap();
}
public boolean isHeldByCurrentThread(Object l){
LockCount lc = (LockCount)locks.get(l);
if(lc==null){
return false;
} else {
if(lc.getThread()==Thread.currentThread()){
return lc.getCount()>0;
} else {
return false;
}
}
}
public void incrementCount(Object l){
LockCount lc = (LockCount)locks.get(l);
assert lc.getCount()>0;
lc.increment();
}
public void decrementCount(Object l){
LockCount lc = (LockCount)locks.get(l);
assert lc.getCount()>0;
lc.decrement();
}
public void acquire(Object l){
LockCount lc = (LockCount)locks.get(l);
if(lc==null){
lc = new LockCount();
locks.put(l,lc);
}
assert lc.getCount()==0;
lc.acquire();
}
public void release(Object l){
LockCount lc = (LockCount)locks.get(l);
assert lc.getCount()>0;
lc.release();
}
public boolean isHeldByAnyThread(Object l) {
LockCount lc = (LockCount)locks.get(l);
if(lc==null)
return false;
else
return lc.getCount()>0;
}
public int getCount(Object l) {
LockCount lc = (LockCount)locks.get(l);
if(lc==null){
return 0;
} else {
return lc.getCount();
}
}
}