KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tctest > NestedPhysicalTransactionTestApp


1 /*
2  * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright notice. All rights reserved.
3  */

4 package com.tctest;
5
6 import EDU.oswego.cs.dl.util.concurrent.CyclicBarrier;
7 import EDU.oswego.cs.dl.util.concurrent.SynchronizedInt;
8
9 import com.tc.exception.TCRuntimeException;
10 import com.tc.object.config.ConfigVisitor;
11 import com.tc.object.config.DSOClientConfigHelper;
12 import com.tc.object.config.TransparencyClassSpec;
13 import com.tc.object.config.spec.CyclicBarrierSpec;
14 import com.tc.object.config.spec.SynchronizedIntSpec;
15 import com.tc.simulator.app.ApplicationConfig;
16 import com.tc.simulator.listener.ListenerProvider;
17 import com.tctest.runner.AbstractTransparentApp;
18
19 public class NestedPhysicalTransactionTestApp extends AbstractTransparentApp {
20
21   private final MyRoot root;
22   private final CyclicBarrier barrier;
23   private final SynchronizedInt participants;
24
25   public static void visitL1DSOConfig(ConfigVisitor visitor, DSOClientConfigHelper config) {
26     String JavaDoc testClass = NestedPhysicalTransactionTestApp.class.getName();
27     TransparencyClassSpec spec = config.getOrCreateSpec(testClass);
28     String JavaDoc methodExpression = "* " + testClass + "*.*(..)";
29     config.addWriteAutolock(methodExpression);
30     spec.addRoot("root", "the-data-root-yo");
31     spec.addRoot("participants", testClass + ".participants");
32     spec.addRoot("barrier", "barrier");
33     config.addIncludePattern(MyRoot.class.getName());
34     new CyclicBarrierSpec().visit(visitor, config);
35     new SynchronizedIntSpec().visit(visitor, config);
36   }
37
38   public NestedPhysicalTransactionTestApp(String JavaDoc appId, ApplicationConfig cfg, ListenerProvider listenerProvider) {
39     super(appId, cfg, listenerProvider);
40     root = new MyRoot();
41     barrier = new CyclicBarrier(this.getParticipantCount());
42     participants = new SynchronizedInt(0);
43   }
44
45   public void run() {
46     int participantID = participants.increment();
47     try {
48       int count = 0;
49       for (int i = 0; i < this.getIntensity(); i++) {
50         barrier.barrier();
51         if (participantID == 1) {
52           root.incrementByThree();
53           barrier.barrier();
54         } else {
55           barrier.barrier();
56           count += 3;
57           int rootCount = root.getCount();
58           if (rootCount != count) { throw new AssertionError JavaDoc("Expected " + count + " but was " + rootCount); }
59         }
60       }
61     } catch (InterruptedException JavaDoc e) {
62       throw new TCRuntimeException(e);
63     }
64   }
65
66   private static final class MyRoot {
67     private final Object JavaDoc lock1 = new Object JavaDoc();
68     private final Object JavaDoc lock2 = new Object JavaDoc();
69     private int count;
70
71     public int getCount() {
72       return count;
73     }
74
75     public void incrementByThree() {
76       increment1();
77     }
78
79     private synchronized void increment1() {
80       count++;
81       increment2();
82     }
83
84     private void increment2() {
85       synchronized (lock1) {
86         count++;
87         increment3();
88       }
89     }
90
91     private void increment3() {
92       synchronized (lock2) {
93         count++;
94       }
95     }
96
97   }
98
99 }
100
Popular Tags