package multimonster.resourcemanager;
import java.util.Vector;
import multimonster.common.resource.ResourceWaiter;
import multimonster.resourcemanager.exceptions.ResourceManagerException;
import org.apache.log4j.Logger;
/**
* @author Holger Velke
*/
class RequestQueue implements Runnable {
private static Logger log = Logger.getLogger(RequestQueue.class);
private Vector queue = null;
private ResourceManager manager = null;
/**
* @label stores
* @labelDirection forward
* @clientCardinality 1
* @supplierCardinality 0..*
*/
private ResourceRequest lnkResourceRequest;
private boolean running = false;
/**
*
*/
public RequestQueue(ResourceManager manager) {
this.queue = new Vector();
this.manager = manager;
}
public synchronized void add(ResourceRequest request) {
queue.add(request);
this.notify();
}
public synchronized void notifyFreeResources() {
this.notify();
}
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
public void run() {
// log.debug("running");
setRunning(true);
while (true) {
ResourceRequest request = null;
boolean reserved = false;
if (queue.isEmpty()) {
setRunning(false);
// log.debug("finished");
return;
}
request = (ResourceRequest) queue.firstElement();
reserved = manager.requestResources(request);
if (reserved) {
queue.remove(request);
notifyResourceWaiter(request);
log.info("grantResources: "+request.getRrId());
} else {
waitForResources();
}
}
}
/**
* @param request
*/
private void notifyResourceWaiter(ResourceRequest request) {
ResourceWaiter waiter = null;
waiter = request.getResourceWaiter();
if (waiter != null) {
waiter.grantResource(request.getRrId());
} else {
// no resourcewaiter - free resources - log error
log.error(
"No reference to ResourceWaiter for rrId:"
+ request.getRrId()
+ " - releasing resources.");
try {
manager.releaseResources(request.getRrId());
} catch (ResourceManagerException e) {
log.error("Problem freeing resources - I give up", e);
}
return;
}
}
private synchronized void waitForResources() {
try {
this.wait();
} catch (InterruptedException e) {
log.error("gotInterrupted while waitung for resources");
}
}
/**
* @return Returns the running.
*/
public synchronized boolean isRunning() {
return running;
}
/**
* @param running The running to set.
*/
private synchronized void setRunning(boolean running) {
this.running = running;
}
}