Thomas,
Did you add RunnableQueueTest to the XML test suites? It is not in the
org.apache.batik.util.unitTesting.xml file. Should I add it?
V.
[EMAIL PROTECTED] wrote:
>
> deweese 01/10/04 07:48:40
>
> Modified: sources/org/apache/batik/util DoublyLinkedList.java
> RunnableQueue.java
> test-sources/org/apache/batik/util RunnableQueueTest.java
> Log:
> 1) Added preemptAndWait and peemptLater methods to RunnableQueue
> These are analogous to invoke* methods but put the runnable at
> the head of the queue rather than the end of the queue.
> 2) Added unpop (push to head) and unpush (pop from tail) methods to
> DoublyLinkedList class (FYI: names come from Perl).
> 3) Updated RunnableQueueTest to ensure that things aren't broke.
>
> Revision Changes Path
> 1.2 +24 -1 xml-batik/sources/org/apache/batik/util/DoublyLinkedList.java
>
> Index: DoublyLinkedList.java
> ===================================================================
> RCS file: /home/cvs/xml-batik/sources/org/apache/batik/util/DoublyLinkedList.java,v
> retrieving revision 1.1
> retrieving revision 1.2
> diff -u -r1.1 -r1.2
> --- DoublyLinkedList.java 2001/08/06 15:35:13 1.1
> +++ DoublyLinkedList.java 2001/10/04 14:48:40 1.2
> @@ -146,16 +146,39 @@
> if (head == null) return null;
>
> Node nde = head;
> - remove(head);
> + remove(nde);
> return nde;
> }
>
> /**
> + * Removes 'tail' from list and returns it. Returns null if list is empty.
> + * @returns current tail element.
> + */
> + public Node unpush() {
> + if (head == null) return null;
> +
> + Node nde = getTail();
> + remove(nde);
> + return nde;
> + }
> +
> +
> +
> + /**
> * Adds <tt>nde</tt> to tail of list
> */
> public void push(Node nde) {
> nde.insertBefore(head);
> if (head == null) head = nde;
> + size++;
> + }
> +
> + /**
> + * Adds <tt>nde</tt> to head of list
> + */
> + public void unpop(Node nde) {
> + nde.insertBefore(head);
> + head = nde;
> size++;
> }
> }
>
>
>
> 1.5 +52 -3 xml-batik/sources/org/apache/batik/util/RunnableQueue.java
>
> Index: RunnableQueue.java
> ===================================================================
> RCS file: /home/cvs/xml-batik/sources/org/apache/batik/util/RunnableQueue.java,v
> retrieving revision 1.4
> retrieving revision 1.5
> diff -u -r1.4 -r1.5
> --- RunnableQueue.java 2001/08/06 19:38:55 1.4
> +++ RunnableQueue.java 2001/10/04 14:48:40 1.5
> @@ -16,7 +16,7 @@
> * invocation in a single thread.
> *
> * @author <a href="mailto:[EMAIL PROTECTED]">Stephane Hillion</a>
> - * @version $Id: RunnableQueue.java,v 1.4 2001/08/06 19:38:55 deweese Exp $
> + * @version $Id: RunnableQueue.java,v 1.5 2001/10/04 14:48:40 deweese Exp $
> */
> public class RunnableQueue implements Runnable {
>
> @@ -168,7 +168,8 @@
> }
>
> /**
> - * Schedules the given Runnable object for a later invocation.
> + * Schedules the given Runnable object for a later invocation, and
> + * returns.
> * An exception is thrown if the RunnableQueue was not started.
> * @throws IllegalStateException if getThread() is null.
> */
> @@ -184,7 +185,7 @@
> }
>
> /**
> - * Waits until the given Runnable <tt>run()</tt> has returned.
> + * Waits until the given Runnable's <tt>run()</tt> has returned.
> * <em>Note: <tt>invokeAndWait()</tt> must not be called from the
> * current thread (for example from the <tt>run()</tt> method of the
> * argument).
> @@ -204,6 +205,54 @@
> LockableLink l = new LockableLink(r);
> synchronized (list) {
> list.push(l);
> + list.notify();
> + }
> + l.lock();
> + }
> +
> +
> + /**
> + * Schedules the given Runnable object for a later invocation, and
> + * returns. The given runnable preempts any runnable that is not
> + * currently executing (ie the next runnable started will be the
> + * one given). An exception is thrown if the RunnableQueue was
> + * not started.
> + * @throws IllegalStateException if getThread() is null.
> + */
> + public void preemptLater(Runnable r) {
> + if (runnableQueueThread == null) {
> + throw new IllegalStateException
> + ("RunnableQueue not started or has exited");
> + }
> + synchronized (list) {
> + list.unpop(new Link(r));
> + list.notify();
> + }
> + }
> +
> + /**
> + * Waits until the given Runnable's <tt>run()</tt> has returned.
> + * The given runnable preempts any runnable that is not currently
> + * executing (ie the next runnable started will be the one given).
> + * <em>Note: <tt>preemptAndWait()</tt> must not be called from the
> + * current thread (for example from the <tt>run()</tt> method of the
> + * argument).
> + * @throws IllegalStateException if getThread() is null or if the
> + * thread returned by getThread() is the current one.
> + */
> + public void preemptAndWait(Runnable r) throws InterruptedException {
> + if (runnableQueueThread == null) {
> + throw new IllegalStateException
> + ("RunnableQueue not started or has exited");
> + }
> + if (runnableQueueThread == Thread.currentThread()) {
> + throw new IllegalStateException
> + ("Cannot be called from the RunnableQueue thread");
> + }
> +
> + LockableLink l = new LockableLink(r);
> + synchronized (list) {
> + list.unpop(l);
> list.notify();
> }
> l.lock();
>
>
>
> 1.3 +37 -14
>xml-batik/test-sources/org/apache/batik/util/RunnableQueueTest.java
>
> Index: RunnableQueueTest.java
> ===================================================================
> RCS file:
>/home/cvs/xml-batik/test-sources/org/apache/batik/util/RunnableQueueTest.java,v
> retrieving revision 1.2
> retrieving revision 1.3
> diff -u -r1.2 -r1.3
> --- RunnableQueueTest.java 2001/08/06 19:38:55 1.2
> +++ RunnableQueueTest.java 2001/10/04 14:48:40 1.3
> @@ -56,7 +56,7 @@
>
> for (int i=0; i<nThreads; i++) {
> Runnable rqRable = new RQRable(i, rand.nextInt(50)+1);
> - l.add(new TPRable(rq, i, rand.nextBoolean(),
> + l.add(new TPRable(rq, i, rand.nextInt(4)+1,
> rand.nextInt(500)+1, 20, rqRable));
> }
>
> @@ -102,41 +102,64 @@
> }
> }
>
> + public static final int INVOKE_LATER = 1;
> + public static final int INVOKE_AND_WAIT = 2;
> + public static final int PREEMPT_LATER = 3;
> + public static final int PREEMPT_AND_WAIT = 4;
> +
> public class TPRable implements Runnable {
> +
> RunnableQueue rq;
> int idx;
> - boolean invokeAndWait;
> + int style;
> long repeatDelay;
> int count;
> Runnable rqRable;
>
> TPRable(RunnableQueue rq, int idx,
> - boolean invokeAndWait,
> + int style,
> long repeatDelay, int count,
> Runnable rqRable) {
> - this.rq = rq;
> - this.idx = idx;
> - this.invokeAndWait = invokeAndWait;
> - this.repeatDelay = repeatDelay;
> - this.count = count;
> - this.rqRable = rqRable;
> + this.rq = rq;
> + this.idx = idx;
> + this.style = style;
> + this.repeatDelay = repeatDelay;
> + this.count = count;
> + this.rqRable = rqRable;
> }
>
> public void run() {
> try {
> while (count-- != 0) {
> - if (invokeAndWait) {
> - System.out.println(" InvW #" + idx);
> - rq.invokeAndWait(rqRable);
> - System.out.println("Done InvW #" + idx);
> - } else {
> + switch (style) {
> + case INVOKE_LATER:
> synchronized (rqRable) {
> System.out.println(" InvL #" + idx);
> rq.invokeLater(rqRable);
> System.out.println("Done InvL #" + idx);
> rqRable.wait();
> }
> + break;
> + case INVOKE_AND_WAIT:
> + System.out.println(" InvW #" + idx);
> + rq.invokeAndWait(rqRable);
> + System.out.println("Done InvW #" + idx);
> + break;
> + case PREEMPT_LATER:
> + synchronized (rqRable) {
> + System.out.println(" PreL #" + idx);
> + rq.preemptLater(rqRable);
> + System.out.println("Done PreL #" + idx);
> + rqRable.wait();
> + }
> + break;
> + case PREEMPT_AND_WAIT:
> + System.out.println(" PreW #" + idx);
> + rq.preemptAndWait(rqRable);
> + System.out.println("Done PreW #" + idx);
> + break;
> }
> +
> if (repeatDelay < 0)
> break;
> Thread.sleep(repeatDelay);
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]