summaryrefslogtreecommitdiff
path: root/java/tests/Concurrency/MutexTest.java
blob: 680266ef071444994483afbca3a27da9113e05f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*************************************************
 *
 * = PACKAGE
 *    tests.Concurrency
 *
 * = FILENAME
 *    MutexTest.java
 *
 *@author Prashant Jain
 *
 *************************************************/
package tests.Concurrency;

import java.io.*;
import JACE.OS.*;
import JACE.Concurrency.*;

class MutexReader extends Thread
{
  MutexReader (int nIterations, Mutex mutex)
    {
      this.nIterations_ = nIterations;
      this.mutex_ = mutex;
    }

  public void run ()
    {
      for (int i = 1; i <= this.nIterations_; i++)
	{
	  // Acquire the mutex (will block until it gets it)
	  try
	    {
	      this.mutex_.acquire ();
	    }
	  catch (InterruptedException e)
	    {
	      ACE.ERROR (e);
	    }

	  MutexTest.count++;
	  ACE.DEBUG (Thread.currentThread ().toString () +
		     " reader acquired mutex in iteration " + i +
		     ", count = " + MutexTest.count);

	  try
	    {
	      Thread.sleep (1);
	    }
	  catch (InterruptedException e)
	    {
	    }
	  // Release the mutex
	  this.mutex_.release ();
	  try
	    {
	      Thread.sleep (1);
	    }
	  catch (InterruptedException e)
	    {
	    }

	}
    }
  
  int nIterations_;
  Mutex mutex_;
}

class MutexWriter extends Thread
{
  MutexWriter (int nIterations, Mutex mutex)
    {
      this.nIterations_ = nIterations;
      this.mutex_ = mutex;
    }

  public void run ()
    {
      for (int i = 1; i <= this.nIterations_; i++)
	{
	  // Acquire the mutex (will block until it gets it)
	  try
	    {
	      this.mutex_.acquire ();
	    }
	  catch (InterruptedException e)
	    {
	      ACE.ERROR (e);
	    }
	  
	  MutexTest.count++;
	  ACE.DEBUG (Thread.currentThread ().toString () +
		     " writer acquired mutex in iteration " + i +
		     ", count = " + MutexTest.count);
	  
	  try
	    {
	      Thread.sleep (1);
	    }
	  catch (InterruptedException e)
	    {
	    }

	  // Release the mutex
	  this.mutex_.release ();
	  try
	    {
	      Thread.sleep (1);
	    }
	  catch (InterruptedException e)
	    {
	    }

	}
    }
  
  int nIterations_;
  Mutex mutex_;
}

public class MutexTest
{
  public static void main (String args[])
    {
      int nReaders = 1;
      int nWriters = 1;
      int nIterations = 100;
      int i;
      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.");
	}

      // Create a lock
      Mutex mutex = new Mutex ();

      // Now spawn off the readers and writers
      for (i = 0; i < nReaders; i++)
	new MutexReader (nIterations, mutex).start ();
      
      for (i = 0; i < nWriters; i++)
	new MutexWriter (nIterations, mutex).start ();            
    }
  public static int count;
}