package cute.concolic.concurrency;
import cute.concolic.concurrency.Scheduler;
import cute.concolic.concurrency.Semaphore;
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.Vector;
import java.util.HashMap;
/**
* Author: Koushik Sen <ksen@cs.uiuc.edu>
*/
public class ThreadBase extends Semaphore {
public Object waitingOn=null;
public boolean enabled=true;
public IdentityHashMap vc;
private Vector locks;
public long toAccess;
public int toAccessType;
public Thread thread;
public ThreadBase(Thread t){
vc = new IdentityHashMap();
locks = new Vector();
lastRaceAt = new HashMap();
toAccessType = Scheduler.NONE;
thread = t;
}
public void setVc(IdentityHashMap vc2){
vc.clear();
vc.putAll(vc2);
}
public IdentityHashMap getVc() {
return vc;
}
public void addOneToVc(Thread t){
Integer time = (Integer)vc.get(t);
if(time==null){
vc.put(t,new Integer(1));
} else {
vc.put(t,new Integer(time.intValue()+1));
}
}
public void addOneToVc(){
Thread t = Thread.currentThread();
Integer time = (Integer)vc.get(t);
if(time==null){
vc.put(t,new Integer(1));
} else {
vc.put(t,new Integer(time.intValue()+1));
}
}
public int getTime(Thread t){
Integer time = (Integer)vc.get(t);
if(time==null){
return 0;
} else {
return time.intValue();
}
}
public void putTime(Thread t,int time){
if(time==0){
vc.remove(t);
} else {
vc.put(t,new Integer(time));
}
}
public void maxVc(IdentityHashMap vc2){
if(vc2==null) return;
for (Iterator iterator = vc2.keySet().iterator(); iterator.hasNext();) {
Thread t = (Thread) iterator.next();
int time2 = ((Integer)vc2.get(t)).intValue();
int time1 = getTime(t);
if(time2>time1){
putTime(t,time2);
}
}
}
public boolean isLE(IdentityHashMap vc2){
for (Iterator iterator = vc.keySet().iterator(); iterator.hasNext();) {
Thread t1 = (Thread) iterator.next();
Integer time2 = (Integer)vc2.get(t1);
int ltime2;
if(time2==null){
ltime2 = 0;
} else {
ltime2 = time2.intValue();
}
if(getTime(t1)>ltime2){
return false;
}
}
return true;
}
public boolean isGE(IdentityHashMap vc2){
for (Iterator iterator = vc2.keySet().iterator(); iterator.hasNext();) {
Thread t2 = (Thread) iterator.next();
Integer time2 = (Integer)vc2.get(t2);
int ltime2;
if(time2==null){
ltime2 = 0;
} else {
ltime2 = time2.intValue();
}
if(ltime2>getTime(t2))
return false;
}
return true;
}
public boolean isIndependent(IdentityHashMap vc2){
return !isLE(vc2) && !isGE(vc2);
}
public void enableAll() {
waitingOn = null;
enabled = true;
}
public Vector getLocks() {
return locks;
}
public boolean intersects(Vector locks) {
for (Iterator iterator = locks.iterator(); iterator.hasNext();) {
Object o = iterator.next();
for (Iterator iterator1 = this.locks.iterator(); iterator1.hasNext();) {
Object o1 = iterator1.next();
if(o1==o){
return true;
}
}
}
return false;
}
public void addLock(Object l){
locks.add(l);
}
public void removeLock(){
locks.remove(locks.size()-1);
}
private HashMap lastRaceAt;
public int getLastRaceAt(Integer tid) {
Integer index = (Integer)lastRaceAt.get(tid);
if(index==null) return -1;
else return index.intValue();
}
public void setLastRaceAt(Integer tid, int index) {
lastRaceAt.put(tid,new Integer(index));
}
public void removeAllLocks() {
locks.setSize(0);
}
public Thread getThread() {
return thread;
}
}