29package com.jogamp.common.util.locks;
31import java.io.IOException;
32import java.util.Collections;
33import java.util.HashMap;
34import java.util.Iterator;
37import org.junit.Assert;
40import com.jogamp.common.os.Clock;
41import com.jogamp.common.os.Platform;
42import com.jogamp.common.util.InterruptSource;
43import com.jogamp.junit.util.SingletonJunitCase;
45import org.junit.FixMethodOrder;
46import org.junit.runners.MethodSorters;
48@FixMethodOrder(MethodSorters.NAME_ASCENDING)
52 NONE(0), YIELD(1), SLEEP(2);
61 static void yield_thread(
final YieldMode mode) {
69 }
catch (
final InterruptedException ie) {
79 static class LockedObject {
80 static final boolean DEBUG =
false;
82 static class ThreadStat {
91 private final RecursiveLock locker;
92 private int deferredThreadCount = 0;
93 private final Map<String, ThreadStat> threadWaitMap = Collections.synchronizedMap(
new HashMap<String, ThreadStat>());
99 public LockedObject(
final LockFactory.ImplType implType,
final boolean fair) {
100 locker = LockFactory.createRecursiveLock(implType, fair);
103 private synchronized void incrDeferredThreadCount() {
104 deferredThreadCount++;
106 private synchronized void decrDeferredThreadCount() {
107 deferredThreadCount--;
109 public synchronized int getDeferredThreadCount() {
110 return deferredThreadCount;
113 public final void action1Direct(
int l,
final YieldMode yieldMode) {
115 System.err.print(
"<a1");
120 System.err.print(
"+");
123 yield_thread(yieldMode);
126 System.err.print(
"-");
130 System.err.println(
">");
135 class Action2
implements Runnable {
139 Action2(
final int l,
final YieldMode yieldMode) {
141 this.yieldMode=yieldMode;
142 incrDeferredThreadCount();
148 System.err.print(
"[a2");
153 System.err.print(
"+");
156 yield_thread(yieldMode);
159 System.err.print(
"-");
163 System.err.println(
"]");
166 decrDeferredThreadCount();
167 final int dc = getDeferredThreadCount();
169 throw new InternalError(
"deferredThreads: "+dc);
174 public final void action2Deferred(
final int l,
final YieldMode yieldMode) {
175 final Action2 action2 =
new Action2(l, yieldMode);
176 new InterruptSource.Thread(
null, action2, Thread.currentThread().getName()+
"-deferred").start();
179 public final void lock() {
180 long td = Clock.currentNanos();
182 td = Clock.currentNanos() - td;
184 final String cur = Thread.currentThread().getName();
185 ThreadStat ts = threadWaitMap.get(cur);
187 ts =
new ThreadStat();
191 threadWaitMap.put(cur, ts);
194 public final void unlock() {
198 public final boolean isLocked() {
199 return locker.isLocked();
202 public void stats(
final boolean dump) {
205 for(
final Iterator<String> i = threadWaitMap.keySet().iterator(); i.hasNext(); ) {
206 final String name = i.next();
207 final ThreadStat ts = threadWaitMap.get(name);
208 timeAllLocks += ts.total;
209 numAllLocks += ts.counter;
211 max_deviation = Long.MIN_VALUE;
212 min_deviation = Long.MAX_VALUE;
213 avrg = timeAllLocks/numAllLocks;
215 System.err.printf(
"Average: %6d ms / %6d times = %8d ns",
216 timeAllLocks/1000000, numAllLocks, avrg);
217 System.err.println();
219 for(
final Iterator<String> i = threadWaitMap.keySet().iterator(); i.hasNext(); numAllLocks++) {
220 final String name = i.next();
221 final ThreadStat ts = threadWaitMap.get(name);
222 final long a = ts.total/ts.counter;
223 final long d = a - avrg;
224 max_deviation = Math.max(max_deviation, d);
225 min_deviation = Math.min(min_deviation, d);
227 System.err.printf(
"%-35s %12d ns / %6d times, a %8d ns, d %8d ns",
228 name, ts.total, ts.counter, a, d);
229 System.err.println();
233 System.err.printf(
"Deviation (min/max): [%8d ns - %8d ns]", min_deviation, max_deviation);
234 System.err.println();
240 interface LockedObjectRunner
extends Runnable {
243 void waitUntilStopped();
246 class LockedObjectRunner1
implements LockedObjectRunner {
247 volatile boolean shouldStop;
248 volatile boolean stopped;
254 public LockedObjectRunner1(
final LockedObject lo,
final int loops,
final int iloops,
final YieldMode yieldMode) {
257 this.iloops = iloops;
258 this.shouldStop =
false;
259 this.stopped =
false;
260 this.yieldMode = yieldMode;
264 public final void stop() {
269 public final boolean isStopped() {
274 public void waitUntilStopped() {
279 }
catch (
final InterruptedException e) {
290 while(!shouldStop && loops>0) {
291 lo.action1Direct(iloops, yieldMode);
292 lo.action2Deferred(iloops, yieldMode);
302 final int threadNum,
final int loops,
final int iloops,
final YieldMode yieldMode)
throws InterruptedException {
303 final long t0 = System.currentTimeMillis();
304 final LockedObject lo =
new LockedObject(implType, fair);
305 final LockedObjectRunner[] runners =
new LockedObjectRunner[threadNum];
309 for(i=0; i<threadNum; i++) {
310 runners[i] =
new LockedObjectRunner1(lo, loops, iloops, yieldMode);
312 final String name =
"ActionThread-"+i+
"_of_"+threadNum;
317 for( i=0; i<threadNum; i++ ) {
318 runners[i].waitUntilStopped();
320 while( 0 < lo.getDeferredThreadCount() ) {
323 Assert.assertEquals(0, lo.locker.getHoldCount());
324 Assert.assertEquals(
false, lo.locker.isLocked());
325 Assert.assertEquals(0, lo.getDeferredThreadCount());
327 final long dt = System.currentTimeMillis()-t0;
330 System.err.println();
331 final String fair_S = fair ?
"fair " :
"unfair" ;
332 System.err.printf(
"---- TestRecursiveLock01.testLockedObjectThreading: i %5s, %s, threads %2d, loops-outter %6d, loops-inner %6d, yield %5s - dt %6d ms, avrg %8d ns, deviation [ %8d .. %8d ] ns",
333 implType, fair_S, threadNum, loops, iloops, yieldMode, dt, lo.avrg, lo.min_deviation, lo.max_deviation);
334 System.err.println();
341 final boolean fair=
true;
348 threadNum=5; loops=5; iloops=10;
351 testLockedObjectImpl(t, fair, threadNum, loops, iloops, yieldMode);
357 final boolean fair=
true;
364 threadNum=5; loops=5; iloops=10;
367 testLockedObjectImpl(t, fair, threadNum, loops, iloops, yieldMode);
373 final boolean fair=
false;
380 threadNum=5; loops=5; iloops=10;
383 testLockedObjectImpl(t, fair, threadNum, loops, iloops, yieldMode);
389 final boolean fair=
false;
396 threadNum=5; loops=5; iloops=10;
399 testLockedObjectImpl(t, fair, threadNum, loops, iloops, yieldMode);
405 final boolean fair=
true;
412 threadNum=5; loops=5; iloops=10;
415 testLockedObjectImpl(t, fair, threadNum, loops, iloops, yieldMode);
421 final boolean fair=
true;
428 threadNum=5; loops=5; iloops=10;
431 testLockedObjectImpl(t, fair, threadNum, loops, iloops, yieldMode);
437 final boolean fair=
false;
444 threadNum=5; loops=5; iloops=10;
447 testLockedObjectImpl(t, fair, threadNum, loops, iloops, yieldMode);
453 final boolean fair=
false;
460 threadNum=5; loops=5; iloops=10;
463 testLockedObjectImpl(t, fair, threadNum, loops, iloops, yieldMode);
469 final boolean fair=
true;
476 threadNum=5; loops=5; iloops=10;
479 testLockedObjectImpl(t, fair, threadNum, loops, iloops, yieldMode);
485 final boolean fair=
true;
492 threadNum=5; loops=5; iloops=10;
495 testLockedObjectImpl(t, fair, threadNum, loops, iloops, yieldMode);
501 final boolean fair=
true;
508 threadNum=5; loops=5; iloops=10;
511 testLockedObjectImpl(t, fair, threadNum, loops, iloops, yieldMode);
517 final boolean fair=
true;
524 threadNum=5; loops=5; iloops=10;
527 testLockedObjectImpl(t, fair, threadNum, loops, iloops, yieldMode);
533 final boolean fair=
false;
540 threadNum=5; loops=5; iloops=10;
543 testLockedObjectImpl(t, fair, threadNum, loops, iloops, yieldMode);
549 final boolean fair=
false;
556 threadNum=5; loops=5; iloops=10;
559 testLockedObjectImpl(t, fair, threadNum, loops, iloops, yieldMode);
562 static int atoi(
final String a) {
565 i = Integer.parseInt(a);
566 }
catch (
final Exception ex) { ex.printStackTrace(); }
570 public static void main(
final String args[])
throws IOException, InterruptedException {
572 org.junit.runner.JUnitCore.
main(tstname);
java.lang.Thread specialization implementing InterruptSource to track java.lang.Thread#interrupt() ca...
void testLockedObjectThreading5x1000x10000N_Java5_Fair()
void testLockedObjectThreading25x100x100N_Java5_Fair()
long testLockedObjectImpl(final LockFactory.ImplType implType, final boolean fair, final int threadNum, final int loops, final int iloops, final YieldMode yieldMode)
void testLockedObjectThreading25x100x100S_Java5()
void testLockedObjectThreading5x1000x10000N_Int01_Fair()
void testLockedObjectThreading25x100x100N_Int01_Unfair()
void testLockedObjectThreading25x100x100N_Java5_Unfair()
static void main(final String args[])
void testLockedObjectThreading25x100x100S_Int01_Fair()
void testLockedObjectThreading25x100x100Y_Int01_Fair()
void testLockedObjectThreading25x100x100Y_Java5_Unfair()
void testLockedObjectThreading25x100x100Y_Java5_Fair()
void testLockedObjectThreading25x100x100N_Int01_Fair()
void testLockedObjectThreading5x1000x10000N_Java5_Unfair()
void testLockedObjectThreading25x100x100Y_Int01_Unair()
void testLockedObjectThreading5x1000x10000N_Int01_Unfair()
Interface exposing java.lang.Thread#interrupt() source, intended for java.lang.Thread specializations...