| 1 4 package com.tctest.performance.timedtask; 5 6 import com.tc.object.config.ConfigVisitor; 7 import com.tc.object.config.DSOApplicationConfig; 8 import com.tc.object.config.DSOClientConfigHelper; 9 import com.tc.object.config.TransparencyClassSpec; 10 import com.tc.simulator.app.ApplicationConfig; 11 import com.tc.simulator.listener.ListenerProvider; 12 import com.tctest.runner.AbstractTransparentApp; 13 14 import java.util.concurrent.BlockingQueue ; 15 import java.util.concurrent.BrokenBarrierException ; 16 import java.util.concurrent.CyclicBarrier ; 17 import java.util.concurrent.LinkedBlockingQueue ; 18 19 public final class TimedObjectFaultTestApp extends AbstractTransparentApp { 20 21 private final BlockingQueue rootQueue; 22 private final CyclicBarrier barrier; 23 private final CyclicBarrier writerBarrier; 24 private final int writers; 25 private int writerCounter; 26 private boolean isLocalWriter, isMasterNode; 27 private long starttime, endtime; 28 private static final int VOLUME = 10000; 29 private static final double NANOSEC = 1000000000D; 30 31 public TimedObjectFaultTestApp(String appId, ApplicationConfig cfg, ListenerProvider listenerProvider) { 32 super(appId, cfg, listenerProvider); 33 writers = getIntensity(); 34 barrier = new CyclicBarrier (getParticipantCount()); 35 writerBarrier = new CyclicBarrier (writers); 36 rootQueue = new LinkedBlockingQueue (100); 37 } 38 39 public static void visitL1DSOConfig(ConfigVisitor visitor, DSOClientConfigHelper config) { 40 TransparencyClassSpec spec = config.getOrCreateSpec(CyclicBarrier .class.getName()); 41 String className = TimedObjectFaultTestApp.class.getName(); 42 spec = config.getOrCreateSpec(className); 43 44 String methodExpression = "* " + className + "*.*(..)"; 45 config.addWriteAutolock(methodExpression); 46 config.addWriteAutolock("* " + CyclicBarrier .class.getName() + "*.*(..)"); 47 48 spec.addRoot("rootQueue", "rootQueue"); 49 spec.addRoot("writerCounter", "writerCounter"); 50 spec.addRoot("starttime", "starttime"); 51 spec.addRoot("endtime", "endtime"); 52 spec.addRoot("barrier", "barrier"); 53 spec.addRoot("writerBarrier", "writerBarrier"); 54 } 55 56 public static void visitDSOApplicationConfig(ConfigVisitor visitor, DSOApplicationConfig config) { 57 config.addIncludePattern(CyclicBarrier .class.getName()); 58 String className = TimedObjectFaultTestApp.class.getName(); 59 config.addIncludePattern(className); 60 61 String methodExpression = "* " + className + "*.*(..)"; 62 config.addWriteAutolock(methodExpression); 63 config.addWriteAutolock("* " + CyclicBarrier .class.getName() + "*.*(..)"); 64 65 config.addRoot("rootQueue", className + ".rootQueue"); 66 config.addRoot("writerCounter", className + ".writerCounter"); 67 config.addRoot("starttime", className + ".starttime"); 68 config.addRoot("endtime", className + ".endtime"); 69 config.addRoot("barrier", className + ".barrier"); 70 config.addRoot("writerBarrier", className + ".writerBarrier"); 71 } 72 73 public void run() { 74 synchronized (barrier) { 75 if (++writerCounter <= writers) { 76 if (writerCounter == 1) isMasterNode = true; 77 isLocalWriter = true; 78 } 79 } 80 81 try { 82 83 barrier.await(); 84 85 if (isLocalWriter) writer(); 86 else reader(); 87 88 barrier.await(); 89 90 } catch (Throwable t) { 91 notifyError(t); 92 } 93 94 if (isMasterNode) { 95 printResult(starttime, endtime); 96 } 97 } 98 99 private void writer() throws InterruptedException , BrokenBarrierException { 100 int iterations = VOLUME / writers; 101 starttime = System.nanoTime(); 102 for (int i = 0; i < iterations; i++) { 103 rootQueue.put(new Object ()); 104 } 105 106 writerBarrier.await(); 107 108 if (isMasterNode) { 109 for (int i = 0; i < getParticipantCount() - writers; i++) { 110 rootQueue.put("stop"); 111 } 112 } 113 } 114 115 private void reader() throws InterruptedException { 116 while (true) { 117 if (rootQueue.take() instanceof String ) break; 118 } 119 endtime = System.nanoTime(); 120 } 121 122 private void printResult(long start, long end) { 123 double time = (end - start); 124 long result = Math.round(VOLUME / (time / NANOSEC)); 125 System.out.println("**%% TERRACOTTA TEST STATISTICS %%**: value=" + result + " obj/sec"); 126 } 127 } 128 | Popular Tags |