From: <me...@us...> - 2002-10-05 17:53:07
|
Update of /cvsroot/cayenne/cayenne/src/cayenne/java/org/objectstyle/cayenne/util In directory usw-pr-cvs1:/tmp/cvs-serv27594/src/cayenne/java/org/objectstyle/cayenne/util Modified Files: RequestDequeue.java RequestQueue.java Log Message: added test suite for multithreaded RequestQueue Index: RequestDequeue.java =================================================================== RCS file: /cvsroot/cayenne/cayenne/src/cayenne/java/org/objectstyle/cayenne/util/RequestDequeue.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- RequestDequeue.java 4 Oct 2002 06:10:45 -0000 1.1 +++ RequestDequeue.java 5 Oct 2002 17:53:04 -0000 1.2 @@ -64,7 +64,8 @@ public class RequestDequeue { public static final int DEQUEUE_SUCCESS = 1; public static final int QUEUE_FULL = 2; - public static final int WAIT_TIMED_OUT = 3; + public static final int TIMED_OUT = 3; + public static final int INTERRUPTED = 4; protected Object dequeueEventObject; protected int dequeueEventCode; @@ -110,6 +111,24 @@ } public boolean isTimedOut() { - return WAIT_TIMED_OUT == dequeueEventCode; + return TIMED_OUT == dequeueEventCode; + } + + public boolean isInterrupted() { + return INTERRUPTED == dequeueEventCode; + } + + public String toString() { + StringBuffer buf = new StringBuffer(); + buf.append('[').append(getClass().getName()).append(": "); + if (isDequeueSuccess()) { + buf.append("success"); + } else if (isQueueFull()) { + buf.append("queue full"); + } else if (isTimedOut()) { + buf.append("timeout or interrupted"); + } + buf.append(']'); + return buf.toString(); } } Index: RequestQueue.java =================================================================== RCS file: /cvsroot/cayenne/cayenne/src/cayenne/java/org/objectstyle/cayenne/util/RequestQueue.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- RequestQueue.java 5 Oct 2002 16:30:10 -0000 1.2 +++ RequestQueue.java 5 Oct 2002 17:53:04 -0000 1.3 @@ -81,8 +81,9 @@ /** * Constructor for RequestQueue. * - * @param maxSize - maximum allowed number of - * threads in the queue. + * @param maxSize - maximum allowed number of threads in the queue. + * @param timeout - timeout in milliseconds that determines maximum possible + * wait time in the queue. */ public RequestQueue(int maxSize, int timeout) { this.maxSize = maxSize; @@ -90,6 +91,12 @@ this.queue = Collections.synchronizedList(new ArrayList()); } + public int getSize() { + synchronized (queue) { + return queue.size(); + } + } + /** * Queues current thread. This will block * the caller till the thread is dequeued as a result @@ -114,19 +121,22 @@ // wait synchronized (result) { + boolean interrupted = false; try { // release lock and wait result.wait(timeout); - } catch (InterruptedException e) {} + } catch (InterruptedException e) { + interrupted = true; + } // wait is over, remove itself from the queue - if (result.getDequeueEventCode() != RequestDequeue.DEQUEUE_SUCCESS) { - // timeout + // timeout or interrupted synchronized (queue) { queue.remove(result); - result.setDequeueEventCode(RequestDequeue.WAIT_TIMED_OUT); + int code = (interrupted) ? RequestDequeue.INTERRUPTED : RequestDequeue.TIMED_OUT; + result.setDequeueEventCode(code); } } @@ -148,9 +158,8 @@ first.notifyAll(); } return true; - } - else { - return false; + } else { + return false; } } } |