ozeigermann    2005/01/07 04:41:58

  Modified:    transaction/src/test/org/apache/commons/transaction/locking
                        GenericLockTest.java
  Added:       transaction/src/java/org/apache/commons/transaction/util
                        TurnBarrier.java
  Removed:     transaction/src/java/org/apache/commons/transaction/util
                        SequenceBarrier.java
  Log:
  Removed sequence barrier in favor of a more untuitive turn based barrier.
  
  Revision  Changes    Path
  1.1                  
jakarta-commons/transaction/src/java/org/apache/commons/transaction/util/TurnBarrier.java
  
  Index: TurnBarrier.java
  ===================================================================
  /*
   * $Header: 
/home/cvs/jakarta-commons/transaction/src/java/org/apache/commons/transaction/util/TurnBarrier.java,v
 1.1 2005/01/07 12:41:58 ozeigermann Exp $
   * $Revision: 1.1 $
   * $Date: 2005/01/07 12:41:58 $
   *
   * ====================================================================
   *
   * Copyright 1999-2002 The Apache Software Foundation 
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   *
   */
  
  package org.apache.commons.transaction.util;
  
  /**
   * Simple turn based barrier to make a sequence of calls from different 
threads deterministic.
   * This is very useful for testing where you want to have a contious flow 
throughout 
   * different threads. The idea is to have an ordered sequence of steps where 
step n can not be 
   * executed before n-1.
   * 
   * @version $Revision: 1.1 $
   */
  public class TurnBarrier {
  
      public static final long DEFAULT_TIMEOUT = Long.MAX_VALUE;
  
      protected final String name;
  
      protected int currentNumber;
  
      protected final int startNumber;
  
      protected final long timeout;
  
      protected LoggerFacade logger;
  
      /**
       * Creates a new turn barrier starting with turn 0 with an unlimited 
timeout.
       * 
       * @param name the name of the barrier
       * @param logger logger for debug output
       */
      public TurnBarrier(String name, LoggerFacade logger) {
          this(name, DEFAULT_TIMEOUT, logger);
      }
  
      /**
       * Creates a new turn barrier starting with turn 0.
       * 
       * @param name the name of the barrier
       * @param timeout timeout for threads to wait for their turn
       * @param logger logger for debug output
       */
      public TurnBarrier(String name, long timeout, LoggerFacade logger) {
          this(name, timeout, logger, 0);
      }
  
      /**
       * Creates a new turn barrier.
       * 
       * @param name the name of the barrier
       * @param timeout timeout for threads to wait for their turn
       * @param logger logger for debug output
       * @param startTurn the turn to start with
       */
      public TurnBarrier(String name, long timeout, LoggerFacade logger, int 
startTurn) {
          this.name = name;
          this.timeout = timeout;
          this.logger = logger;
          this.startNumber = startTurn;
          this.currentNumber = startTurn;
      }
  
      /**
       * Blockingly waits for the given turn. If a timeout occurs a runtime 
exception will be thrown.
       * 
       * @param turnNumber the turn number to wait for
       * @throws InterruptedException thrown if the thread is interrupted while 
waiting
       * @throws RuntimeException thrown when timed out
       */
      public synchronized void waitForTurn(int turnNumber) throws 
InterruptedException,
              RuntimeException {
          if (turnNumber > currentNumber) {
              long started = System.currentTimeMillis();
              for (long remaining = timeout; remaining > 0 && turnNumber > 
currentNumber; remaining = timeout
                      - (System.currentTimeMillis() - started)) {
                  wait(remaining);
              }
          }
          if (turnNumber > currentNumber) {
              throw new RuntimeException("Timed out while waiting for our 
turn");
          }
      }
  
      /**
       * Signals the next turn. Any thread waiting for the turn will be allowed 
to continue.
       * 
       * @param turnNumber the next turn number
       */
      public synchronized void signalTurn(int turnNumber) {
          currentNumber = turnNumber;
          notifyAll();
      }
      
      /**
       * Starts the barrier over again. The next turn will be the one the 
barrier was started with.
       *
       */
      public synchronized void reset() {
          signalTurn(startNumber);
      }
  }
  
  
  1.10      +35 -56    
jakarta-commons/transaction/src/test/org/apache/commons/transaction/locking/GenericLockTest.java
  
  Index: GenericLockTest.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/transaction/src/test/org/apache/commons/transaction/locking/GenericLockTest.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- GenericLockTest.java      28 Dec 2004 21:11:12 -0000      1.9
  +++ GenericLockTest.java      7 Jan 2005 12:41:58 -0000       1.10
  @@ -29,10 +29,10 @@
   import junit.framework.TestCase;
   import junit.framework.TestSuite;
   
  -import org.apache.commons.transaction.util.SequenceBarrier;
   import org.apache.commons.transaction.util.LoggerFacade;
   import org.apache.commons.transaction.util.PrintWriterLogger;
   import org.apache.commons.transaction.util.RendezvousBarrier;
  +import org.apache.commons.transaction.util.TurnBarrier;
   
   /**
    * Tests for generic locks. 
  @@ -268,21 +268,21 @@
   
           final RendezvousBarrier restart = new RendezvousBarrier("restart", 
3, TIMEOUT, sLogger);
   
  -        final SequenceBarrier cb = new SequenceBarrier("cb1", TIMEOUT, 
sLogger);
  +        final TurnBarrier cb = new TurnBarrier("cb1", TIMEOUT, sLogger, 1);
   
           for (int i = 0; i < CONCURRENT_TESTS; i++) {
               
  -//            System.out.print(".");
  +            System.out.print(".");
   
               Thread t1 = new Thread(new Runnable() {
                   public void run() {
                       try {
  -                        cb.count(2);
  +                        cb.waitForTurn(2);
                           manager.upgradeLock(owner2, res1);
  -                        cb.count(3);
  -                        cb.count(6);
  +                        cb.signalTurn(3);
  +                        cb.waitForTurn(5);
                           synchronized (manager.getLock(res1)) {
  -                            cb.count(7);
  +                            cb.signalTurn(6);
                               manager.writeLock(owner2, res1);
                           }
                           // we must always be first as we will be preferred 
over
  @@ -292,9 +292,7 @@
                               if (first == null)
                                   first = owner2;
                           }
  -                        cb.count(12);
                           manager.releaseAll(owner2);
  -                        cb.count(13);
                           synchronized (restart) {
                               restart.meet();
                               restart.reset();
  @@ -315,9 +313,9 @@
                           // next to get the lock as it is preferred over the 
main
                           // thread
                           // that only waits for a read lock
  -                        cb.count(8);
  +                        cb.waitForTurn(6);
                           synchronized (manager.getLock(res1)) {
  -                            cb.count(9);
  +                            cb.signalTurn(7);
                               manager.readLock(owner3, res1);
                           }
                           synchronized (this) {
  @@ -336,18 +334,17 @@
   
               t2.start();
   
  -            cb.count(0);
  +            cb.waitForTurn(1);
               manager.readLock(owner1, res1);
  -            cb.count(1);
  -            cb.count(4);
  +            cb.signalTurn(2);
  +            cb.waitForTurn(3);
               manager.release(owner1, res1);
               manager.readLock(owner1, res1);
  -            cb.count(5);
  -            cb.count(10);
  +            cb.signalTurn(5);
  +            cb.waitForTurn(7);
               synchronized (manager.getLock(res1)) {
                   manager.releaseAll(owner1);
               }
  -            cb.count(11);
               synchronized (restart) {
                   restart.meet();
                   restart.reset();
  @@ -385,19 +382,6 @@
        * 8                                released   or   released
        * 
        * 
  -     * In SequenceBarrier notation this looks like
  -     * 
  -     *                  Owner           Owner           Owner
  -     *                  #1              #2              #3
  -     *                  0read1
  -     *                                  2(write3)
  -     *                                                  4(write5)
  -     *                  6(release)7
  -     *                                  8release9       8release9
  -     * 
  -     * Round brackets mean atomic execution
  -     * 
  -     * 
        */
       public void testPreference() throws Throwable {
   
  @@ -413,24 +397,22 @@
   
           final RendezvousBarrier restart = new RendezvousBarrier("restart", 
3, TIMEOUT, sLogger);
   
  -        final SequenceBarrier cb = new SequenceBarrier("cb1", TIMEOUT, 
sLogger);
  +        final TurnBarrier cb = new TurnBarrier("cb1", TIMEOUT, sLogger, 1);
   
           for (int i = 0; i < CONCURRENT_TESTS; i++) {
               
  -//            System.out.print(".");
  +            System.out.print(".");
   
               Thread t1 = new Thread(new Runnable() {
                   public void run() {
                       try {
  -                        cb.count(2);
  +                        cb.waitForTurn(2);
                           synchronized (lock) {
  -                            cb.count(3);
  +                            cb.signalTurn(3);
                               lock.acquire(owner2, ReadWriteLock.WRITE_LOCK, 
true,
                                       GenericLock.COMPATIBILITY_REENTRANT, 
true, TIMEOUT);
                           }
  -                        cb.count(8);
                           lock.release(owner2);
  -                        cb.count(9);
                           synchronized (restart) {
                               restart.meet();
                               restart.reset();
  @@ -445,15 +427,13 @@
               Thread t2 = new Thread(new Runnable() {
                   public void run() {
                       try {
  -                        cb.count(4);
  +                        cb.waitForTurn(3);
                           synchronized (lock) {
  -                            cb.count(5);
  +                            cb.signalTurn(4);
                               lock.acquire(owner3, ReadWriteLock.WRITE_LOCK, 
true,
                                       GenericLock.COMPATIBILITY_REENTRANT, 
true, TIMEOUT);
                           }
  -                        cb.count(8);
                           lock.release(owner3);
  -                        cb.count(9);
                           synchronized (restart) {
                               restart.meet();
                               restart.reset();
  @@ -465,14 +445,13 @@
   
               t2.start();
   
  -            cb.count(0);
  +            cb.waitForTurn(1);
               lock.acquireRead(owner1, TIMEOUT);
  -            cb.count(1);
  -            cb.count(6);
  +            cb.signalTurn(2);
  +            cb.waitForTurn(4);
               synchronized (lock) {
                   lock.release(owner1);
               }
  -            cb.count(7);
               synchronized (restart) {
                   restart.meet();
                   restart.reset();
  @@ -496,7 +475,7 @@
   
           final RendezvousBarrier restart = new RendezvousBarrier("restart", 
2, TIMEOUT, sLogger);
   
  -        final SequenceBarrier cb = new SequenceBarrier("cb1", TIMEOUT, 
sLogger);
  +        final TurnBarrier cb = new TurnBarrier("cb1", TIMEOUT, sLogger, 1);
   
           for (int i = 0; i < CONCURRENT_TESTS; i++) {
               
  @@ -505,9 +484,9 @@
               Thread t1 = new Thread(new Runnable() {
                   public void run() {
                       try {
  -                        cb.count(2);
  +                        cb.waitForTurn(2);
                           manager.lock(owner2, res1, 1, true);
  -                        cb.count(3);
  +                        cb.signalTurn(3);
                           manager.releaseAll(owner2);
                           synchronized (restart) {
                               restart.meet();
  @@ -520,11 +499,11 @@
   
               t1.start();
   
  -            cb.count(0);
  -            manager.setGlobalTimeout(owner1, 500);
  +            cb.waitForTurn(1);
               manager.lock(owner1, res1, 1, true);
  -            cb.count(1);
  -            cb.count(4);
  +            manager.setGlobalTimeout(owner1, 500);
  +            cb.signalTurn(2);
  +            cb.waitForTurn(3);
               boolean failed = false;
               try {
                   manager.tryLock(owner1, res1, 1, true);
  @@ -709,4 +688,4 @@
           }
   
       }
  -}
  \ No newline at end of file
  +}
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to