1 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 testClass = NestedPhysicalTransactionTestApp.class.getName(); 27 TransparencyClassSpec spec = config.getOrCreateSpec(testClass); 28 String 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 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 ("Expected " + count + " but was " + rootCount); } 59 } 60 } 61 } catch (InterruptedException e) { 62 throw new TCRuntimeException(e); 63 } 64 } 65 66 private static final class MyRoot { 67 private final Object lock1 = new Object (); 68 private final Object lock2 = new Object (); 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
|