ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/CancelledLockLoops.java
Revision: 1.1
Committed: Mon May 2 19:19:38 2005 UTC (19 years ago) by dl
Branch: MAIN
Log Message:
Put misc performance tests into CVS

File Contents

# User Rev Content
1 dl 1.1 /*
2     * @test
3     * @summary tests lockInterruptibly
4     * Checks for responsiveness of locks to interrupts. Runs under that
5     * assumption that ITERS_VALUE computations require more than TIMEOUT
6     * msecs to complete.
7     */
8     /*
9     * Written by Doug Lea with assistance from members of JCP JSR-166
10     * Expert Group and released to the public domain. Use, modify, and
11     * redistribute this code in any way without acknowledgement.
12     */
13    
14     import java.util.concurrent.*;
15     import java.util.concurrent.locks.*;
16     import java.util.*;
17    
18     public final class CancelledLockLoops {
19     static final Random rng = new Random();
20     static boolean print = false;
21     static final int ITERS = 10000000;
22     static final long TIMEOUT = 100;
23    
24     public static void main(String[] args) throws Exception {
25     int maxThreads = 100;
26     if (args.length > 0)
27     maxThreads = Integer.parseInt(args[0]);
28    
29     print = true;
30    
31     for (int i = 2; i <= maxThreads; i += (i+1) >>> 1) {
32     System.out.print("Threads: " + i);
33     try {
34     new ReentrantLockLoop(i).test();
35     }
36     catch(BrokenBarrierException bb) {
37     // OK, ignore
38     }
39     }
40     }
41    
42     static final class ReentrantLockLoop implements Runnable {
43     private int v = rng.nextInt();
44     private int completed;
45     private volatile int result = 17;
46     private final ReentrantLock lock = new ReentrantLock();
47     private final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
48     private final CyclicBarrier barrier;
49     private final int nthreads;
50     ReentrantLockLoop(int nthreads) {
51     this.nthreads = nthreads;
52     barrier = new CyclicBarrier(nthreads+1, timer);
53     }
54    
55     final void test() throws Exception {
56     Thread[] threads = new Thread[nthreads];
57     for (int i = 0; i < threads.length; ++i)
58     threads[i] = new Thread(this);
59     for (int i = 0; i < threads.length; ++i)
60     threads[i].start();
61     Thread[] cancels = (Thread[]) (threads.clone());
62     Collections.shuffle(Arrays.asList(cancels), rng);
63     barrier.await();
64     Thread.sleep(TIMEOUT);
65     for (int i = 0; i < cancels.length-2; ++i) {
66     cancels[i].interrupt();
67     // make sure all OK even when cancellations spaced out
68     if ( (i & 3) == 0)
69     Thread.sleep(1 + rng.nextInt(10));
70     }
71     barrier.await();
72     if (print) {
73     long time = timer.getTime();
74     double secs = (double)(time) / 1000000000.0;
75     System.out.println("\t " + secs + "s run time");
76     }
77    
78     int c;
79     lock.lock();
80     try {
81     c = completed;
82     }
83     finally {
84     lock.unlock();
85     }
86     if (completed != 2)
87     throw new Error("Completed != 2");
88     int r = result;
89     if (r == 0) // avoid overoptimization
90     System.out.println("useless result: " + r);
91     }
92    
93     public final void run() {
94     try {
95     barrier.await();
96     int sum = v;
97     int x = 0;
98     int n = ITERS;
99     boolean done = false;
100     do {
101     try {
102     lock.lockInterruptibly();
103     }
104     catch (InterruptedException ie) {
105     break;
106     }
107     try {
108     v = x = LoopHelpers.compute1(v);
109     }
110     finally {
111     lock.unlock();
112     }
113     sum += LoopHelpers.compute2(x);
114     } while (n-- > 0);
115     if (n <= 0) {
116     lock.lock();
117     try {
118     ++completed;
119     }
120     finally {
121     lock.unlock();
122     }
123     }
124     barrier.await();
125     result += sum;
126     }
127     catch (Exception ex) {
128     // ex.printStackTrace();
129     return;
130     }
131     }
132     }
133    
134     }