/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 */

package org.apache.jmeter.threads;

/**
 * @version $Revision$
 */
public final class JMeterContextService {
	static private ThreadLocal threadContext = new ThreadLocal() {
		public Object initialValue() {
			return new JMeterContext();
		}
	};

	private static long testStart = 0;

	private static int numberOfThreads = 0; // Active thread count
    
    private static int totalThreads = 0;

	/**
	 * Private constructor to prevent instantiation.
	 */
	private JMeterContextService() {
	}

	static public JMeterContext getContext() {
		return (JMeterContext) threadContext.get();
	}

	static public void startTest() {//TODO should this be synchronized?
		if (testStart == 0) {
			numberOfThreads = 0;
			testStart = System.currentTimeMillis();
			threadContext = new ThreadLocal() {
				public Object initialValue() {
					return new JMeterContext();
				}
			};
		}
	}

	static synchronized void incrNumberOfThreads() {
		numberOfThreads++;
	}

	static synchronized void decrNumberOfThreads() {
		numberOfThreads--;
	}

	static public synchronized int getNumberOfThreads() {
		return numberOfThreads;
	}

	static public void endTest() {//TODO should this be synchronized?
		testStart = 0;
		numberOfThreads = 0;
	}

	static public long getTestStartTime() {// NOT USED
		return testStart;
	}

    public static synchronized int getTotalThreads() {
        return totalThreads;
    }

    public static synchronized void addTotalThreads(int thisGroup) {
        totalThreads += thisGroup;
    }

    public static synchronized void clearTotalThreads() {
        totalThreads = 0;
    }
}

@@ -845,27 +845,102 @@
 %0A * 
-@version $Revision$
+Provides context service for JMeter threads.%0A * Keeps track of active and total thread counts.
 %0A */
@@ -1176,32 +1176,38 @@
 tic int numberOf
+Active
 Threads = 0; // 
@@ -1206,31 +1206,8 @@
 = 0;
- // Active thread count
 %0A   
@@ -1453,24 +1453,37 @@
 atic public 
+synchronized 
 void startTe
@@ -1492,43 +1492,8 @@
 () %7B
-//TODO should this be synchronized?
 %0A%09%09i
@@ -1516,32 +1516,38 @@
 0) %7B%0A%09%09%09numberOf
+Active
 Threads = 0;%0A%09%09%09
@@ -1709,24 +1709,74 @@
 %09%7D;%0A%09%09%7D%0A%09%7D%0A%0A
+%09/**%0A%09 * Increment number of active threads.%0A%09 */%0A
 %09static sync
@@ -1819,24 +1819,30 @@
 %7B%0A%09%09numberOf
+Active
 Threads++;%0A%09
@@ -1840,24 +1840,74 @@
 eads++;%0A%09%7D%0A%0A
+%09/**%0A%09 * Decrement number of active threads.%0A%09 */%0A
 %09static sync
@@ -1950,24 +1950,30 @@
 %7B%0A%09%09numberOf
+Active
 Threads--;%0A%09
@@ -1971,24 +1971,113 @@
 eads--;%0A%09%7D%0A%0A
+%09/**%0A%09 * Get the number of currently active threads%0A%09 * @return active thread count%0A%09 */%0A
 %09static publ
@@ -2132,24 +2132,30 @@
 urn numberOf
+Active
 Threads;%0A%09%7D%0A
@@ -2170,16 +2170,29 @@
  public 
+synchronized 
 void end
@@ -2203,43 +2203,8 @@
 () %7B
-//TODO should this be synchronized?
 %0A%09%09t
@@ -2223,24 +2223,30 @@
 ;%0A%09%09numberOf
+Active
 Threads = 0;
@@ -2265,16 +2265,29 @@
  public 
+synchronized 
 long get
@@ -2339,16 +2339,105 @@
 rt;%0A%09%7D%0A%0A
+%09/**%0A%09 * Get the total number of threads (%3E= active)%0A%09 * @return total thread count%0A%09 */%0A
     publ
@@ -2511,32 +2511,153 @@
 Threads;%0A    %7D%0A%0A
+    /**%0A     * Update the total number of threads%0A     * @param thisGroup number of threads in this thread group%0A     */%0A
     public stati
@@ -2747,24 +2747,73 @@
 oup;%0A    %7D%0A%0A
+    /**%0A     * Set total threads to zero%0A     */%0A
     public s

Update Javadoc Ensure all accesses to counts are synchronized