1 4 package com.tcsimulator; 5 6 import EDU.oswego.cs.dl.util.concurrent.BrokenBarrierException; 7 import EDU.oswego.cs.dl.util.concurrent.CountDown; 8 import EDU.oswego.cs.dl.util.concurrent.CyclicBarrier; 9 import EDU.oswego.cs.dl.util.concurrent.TimeoutException; 10 11 import com.tc.object.config.ConfigVisitor; 12 import com.tc.object.config.DSOClientConfigHelper; 13 import com.tc.object.config.spec.CountDownSpec; 14 import com.tc.object.config.spec.CyclicBarrierSpec; 15 import com.tc.simulator.control.Control; 16 import com.tc.simulator.control.TCBrokenBarrierException; 17 import com.tc.util.TCTimeoutException; 18 19 public class ControlImpl implements Control { 20 private final int startParties; 21 private final int completeParties; 22 private final CyclicBarrier startBarrier; 23 private final CountDown countdown; 24 25 public ControlImpl(int parties) { 26 this(parties, parties); 27 } 28 29 public ControlImpl(int startParties, int completeParties) { 30 this.startParties = startParties; 31 this.completeParties = completeParties; 32 this.startBarrier = new CyclicBarrier(startParties); 33 this.countdown = new CountDown(completeParties); 34 } 35 36 public static void visitL1DSOConfig(ConfigVisitor visitor, DSOClientConfigHelper config) { 37 String classname = ControlImpl.class.getName(); 38 config.addIncludePattern(classname); 39 config.addWriteAutolock("* " + classname + ".*(..)"); 40 41 String cyclicBarrierClassname = CyclicBarrier.class.getName(); 42 config.addIncludePattern(cyclicBarrierClassname); 43 config.addWriteAutolock("* " + cyclicBarrierClassname + ".*(..)"); 44 45 String countdownClassname = CountDown.class.getName(); 46 config.addIncludePattern(countdownClassname); 47 config.addWriteAutolock("* " + countdownClassname + ".*(..)"); 48 } 49 50 public static void visitDSOApplicationConfig(com.tc.object.config.ConfigVisitor visitor, 51 com.tc.object.config.DSOApplicationConfig config) { 52 String classname = ControlImpl.class.getName(); 53 config.addIncludePattern(classname); 54 config.addWriteAutolock("* " + classname + ".*(..)"); 55 56 new CyclicBarrierSpec().visit(visitor, config); 57 new CountDownSpec().visit(visitor, config); 58 59 } 60 61 public String toString() { 62 return getClass().getName() + "[ startParties=" + startParties + ", completeParties=" + 63 completeParties + ", startBarrier=" 64 + startBarrier + ", countdown=" + countdown + "]"; 65 } 66 67 public void waitForStart(long timeout) throws InterruptedException , TCBrokenBarrierException, TCTimeoutException { 68 try { 69 try { 70 this.startBarrier.attemptBarrier(timeout); 71 } catch (InterruptedException e1) { 72 throw e1; 73 } 74 } catch (TimeoutException e) { 75 throw new TCTimeoutException(e); 76 } catch (BrokenBarrierException e) { 77 throw new TCBrokenBarrierException(e); 78 } 79 } 80 81 public void notifyComplete() { 82 this.countdown.release(); 83 } 84 85 public boolean waitForAllComplete(long timeout) throws InterruptedException { 86 if (timeout < 0) { 87 while (true) { 88 synchronized (this) { 89 wait(); 90 } 91 } 92 } 93 try { 94 boolean rv = this.countdown.attempt(timeout); 95 return rv; 96 } catch (InterruptedException e) { 97 throw e; 98 } 99 } 100 } | Popular Tags |