summaryrefslogtreecommitdiff
path: root/java/JACE/tests/Concurrency/IterationTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/JACE/tests/Concurrency/IterationTest.java')
-rw-r--r--java/JACE/tests/Concurrency/IterationTest.java235
1 files changed, 235 insertions, 0 deletions
diff --git a/java/JACE/tests/Concurrency/IterationTest.java b/java/JACE/tests/Concurrency/IterationTest.java
new file mode 100644
index 00000000000..79e083e7f7a
--- /dev/null
+++ b/java/JACE/tests/Concurrency/IterationTest.java
@@ -0,0 +1,235 @@
+/*************************************************
+ *
+ * = PACKAGE
+ * JACE.tests.Concurrency
+ *
+ * = FILENAME
+ * IterationTest.java
+ *
+ *@author Prashant Jain
+ *@author Everett Anderson
+ *
+ *************************************************/
+package JACE.tests.Concurrency;
+
+import java.io.*;
+import JACE.OS.*;
+import JACE.Concurrency.*;
+
+/**
+ * Test which uses an AbstractLock to prevent threads from mangling
+ * shared data. This currently tests the four local concurrency
+ * mechanisms -- Token, Mutex, RWMutex, and Semaphore.
+ */
+public class IterationTest
+{
+ static class LockReader extends Thread
+ {
+ LockReader (int nIterations, AbstractLock lock)
+ {
+ this.nIterations_ = nIterations;
+ this.lock_ = lock;
+ }
+
+ public void run ()
+ {
+ for (int i = 1; i <= this.nIterations_; i++)
+ {
+ // Acquire the lock (will block until it gets it)
+ try
+ {
+ this.lock_.acquire ();
+ }
+ catch (InterruptedException e)
+ {
+ ACE.ERROR (e);
+ }
+ catch (LockException e)
+ {
+ ACE.ERROR (e);
+ }
+
+ IterationTest.count++;
+ ACE.DEBUG (Thread.currentThread ().toString () +
+ " reader acquired lock in iteration " + i +
+ ", count = " + IterationTest.count);
+
+ try
+ {
+ Thread.sleep (1);
+ }
+ catch (InterruptedException e)
+ {
+ }
+ // Release the lock
+ try
+ {
+ this.lock_.release ();
+ }
+ catch (LockException e)
+ {
+ ACE.ERROR (e);
+ }
+ try
+ {
+ Thread.sleep (1);
+ }
+ catch (InterruptedException e)
+ {
+ }
+
+ }
+ }
+
+ int nIterations_;
+ AbstractLock lock_;
+ }
+
+ static class LockWriter extends Thread
+ {
+ LockWriter (int nIterations, AbstractLock lock)
+ {
+ this.nIterations_ = nIterations;
+ this.lock_ = lock;
+ }
+
+ public void run ()
+ {
+ for (int i = 1; i <= this.nIterations_; i++)
+ {
+ // Acquire the lock (will block until it gets it)
+ try
+ {
+ this.lock_.acquire ();
+ }
+ catch (InterruptedException e)
+ {
+ ACE.ERROR (e);
+ }
+ catch (LockException e)
+ {
+ ACE.ERROR (e);
+ }
+
+
+ IterationTest.count++;
+ ACE.DEBUG (Thread.currentThread ().toString () +
+ " writer acquired lock in iteration " + i +
+ ", count = " + IterationTest.count);
+
+ try
+ {
+ Thread.sleep (1);
+ }
+ catch (InterruptedException e)
+ {
+ }
+
+ // Release the lock
+ try
+ {
+ this.lock_.release ();
+ }
+ catch (LockException e)
+ {
+ ACE.ERROR (e);
+ }
+
+ try
+ {
+ Thread.sleep (1);
+ }
+ catch (InterruptedException e)
+ {
+ }
+
+ }
+ }
+
+ int nIterations_;
+ AbstractLock lock_;
+ }
+
+ final static int TOKEN = 0;
+ final static int MUTEX = 1;
+ final static int RWMUTEX = 2;
+ final static int SEMAPHORE = 3;
+
+ /**
+ * Command line arguments:
+ *
+ * (number of readers) (number of writers) (number of iterations)
+ */
+ public static void main (String args[]) throws InterruptedException
+ {
+ int nReaders = 1;
+ int nWriters = 1;
+ int nIterations = 100;
+ int i;
+
+ ACE.enableDebugging ();
+
+ try
+ {
+ if (args.length == 3)
+ {
+ nReaders = Integer.parseInt (args[0]);
+ nWriters = Integer.parseInt (args[1]);
+ nIterations = Integer.parseInt (args[2]);
+ }
+ }
+ catch (NumberFormatException e)
+ {
+ ACE.ERROR ("Illegal argument.");
+ }
+
+ AbstractLock lock = null;
+ Thread threads[] = new Thread [nReaders + nWriters];
+
+ for (int state = TOKEN; state <= SEMAPHORE; state++) {
+
+ count = 0;
+
+ switch (state)
+ {
+ case TOKEN:
+ ACE.DEBUG ("--------\nTesting Token:");
+ lock = new Token ();
+ break;
+ case MUTEX:
+ ACE.DEBUG ("--------\nTesting Mutex:");
+ lock = new Mutex ();
+ break;
+ case RWMUTEX:
+ ACE.DEBUG ("--------\nTesting RWMutex:");
+ lock = new RWMutex ();
+ break;
+ case SEMAPHORE:
+ ACE.DEBUG ("--------\nTesting Semaphore:");
+ lock = new Semaphore ();
+ break;
+ }
+
+ int numThreads = 0;
+
+ // Spawn off the readers and writers
+ for (i = 0; i < nReaders; i++) {
+ threads[numThreads] = new LockReader (nIterations, lock);
+ threads[numThreads].start ();
+ numThreads++;
+ }
+
+ for (i = 0; i < nWriters; i++) {
+ threads[numThreads] = new LockWriter (nIterations, lock);
+ threads[numThreads].start ();
+ numThreads++;
+ }
+
+ for (i = 0; i < numThreads; i++)
+ threads[i].join ();
+
+ }
+ }
+
+ public static int count;
+}