You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by pm...@apache.org on 2011/11/24 23:00:56 UTC

svn commit: r1205992 - in /jmeter/trunk/src/components/org/apache/jmeter/timers: BarrierWrapper.java SyncTimer.java SyncTimer.java.tmp SyncTimer.java.tmp2

Author: pmouawad
Date: Thu Nov 24 22:00:55 2011
New Revision: 1205992

URL: http://svn.apache.org/viewvc?rev=1205992&view=rev
Log:
Bug 52183 - SyncTimer could be improved (performance+reliability)
Made BarrierWrapper class private and commented setup.

Removed:
    jmeter/trunk/src/components/org/apache/jmeter/timers/BarrierWrapper.java
    jmeter/trunk/src/components/org/apache/jmeter/timers/SyncTimer.java.tmp
    jmeter/trunk/src/components/org/apache/jmeter/timers/SyncTimer.java.tmp2
Modified:
    jmeter/trunk/src/components/org/apache/jmeter/timers/SyncTimer.java

Modified: jmeter/trunk/src/components/org/apache/jmeter/timers/SyncTimer.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/timers/SyncTimer.java?rev=1205992&r1=1205991&r2=1205992&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/timers/SyncTimer.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/timers/SyncTimer.java Thu Nov 24 22:00:55 2011
@@ -20,6 +20,7 @@ package org.apache.jmeter.timers;
 
 import java.io.Serializable;
 import java.util.concurrent.BrokenBarrierException;
+import java.util.concurrent.CyclicBarrier;
 
 import org.apache.jmeter.engine.event.LoopIterationEvent;
 import org.apache.jmeter.testbeans.TestBean;
@@ -35,6 +36,71 @@ import org.apache.jmeter.threads.JMeterC
  *
  */
 public class SyncTimer extends AbstractTestElement implements Timer, Serializable, TestBean, TestListener, ThreadListener {
+	
+	/**
+	 * Wrapper to {@link CyclicBarrier} to allow lazy init of CyclicBarrier when SyncTimer is configured with 0
+	 */
+	private static final class BarrierWrapper implements Cloneable {
+		private CyclicBarrier barrier;
+
+		/**
+		 * 
+		 */
+		public BarrierWrapper() {
+			this.barrier = null;
+		}
+		
+		/**
+		 * @param parties Number of parties
+		 */
+		public BarrierWrapper(int parties) {
+			this.barrier = new CyclicBarrier(parties);
+		}
+		
+		/**
+		 * Synchronized is required to ensure CyclicBarrier is initialized only once per Thread Group
+		 * @param parties Number of parties
+		 */
+		public synchronized void setup(int parties) {
+			if(this.barrier== null) {
+				this.barrier = new CyclicBarrier(parties);
+			}
+		}
+		
+		/**
+		 * @see CyclicBarrier#await()
+		 * @return int 
+		 * @throws InterruptedException
+		 * @throws BrokenBarrierException
+		 * @see java.util.concurrent.CyclicBarrier#await()
+		 */
+		public int await() throws InterruptedException, BrokenBarrierException {
+			return barrier.await();
+		}
+
+		/**
+		 * @see java.util.concurrent.CyclicBarrier#reset()
+		 */
+		public void reset() {
+			barrier.reset();
+		}
+
+		/**
+		 * @see java.lang.Object#clone()
+		 */
+		@Override
+		protected Object clone()  {
+			BarrierWrapper barrierWrapper=  null;
+			try {
+				barrierWrapper = (BarrierWrapper) super.clone();
+				barrierWrapper.barrier = this.barrier;
+			} catch (CloneNotSupportedException e) {
+				//Cannot happen
+			}
+			return barrierWrapper;
+		}	
+	}
+	
     private static final long serialVersionUID = 2;
     
     private BarrierWrapper barrier;