package hj.runtime.wsh;
import hj.lang.phaser;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.concurrent.locks.ReentrantLock;
/**
*
* @author bchase
*/
public class FinishScope {
// This is not apart of original library
// Used to track information within a single Finish block
// Information includes all Activities and Phasers within it.
// Also makes code cleaner in Activity
private LinkedList<Activity> scope;
private ReentrantLock lock;
private LinkedList<phaser> phasers;
public FinishScope() {
scope = new LinkedList<Activity>();
lock = new ReentrantLock();
phasers = new LinkedList<phaser>();
}
public void add(Activity activity) {
lock.lock();
try {
scope.add(activity);
} finally {
lock.unlock();
}
}
public Activity poll() {
Activity result = null;
lock.lock();
try {
result = scope.poll();
} finally {
lock.unlock();
}
return result;
}
public int size() {
int result;
lock.lock();
try {
result= scope.size();
} finally {
lock.unlock();
}
return result;
}
public void addPhaser(phaser ph) {
lock.lock();
try {
phasers.add(ph);
} finally {
lock.unlock();
}
}
public void unregisterAllPhasers(Activity owner) {
lock.lock();
try {
Iterator<phaser> iter= phasers.iterator();
while (iter.hasNext()) {
phaser ph = iter.next();
ph.unregisterSignaler(owner);
ph.unregisterWaiter(owner);
}
} finally {
lock.unlock();
}
}
}