Snap for 4574286 from 6c3ded30e516793d3bdfdead872ceb3700be8453 to pi-release

Change-Id: I4ea7a71f459ad4ffeb19f4b742cc452ada3b9086
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Agent.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Agent.java
index f6c1e76..b4dd0c1 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Agent.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Agent.java
@@ -82,6 +82,8 @@
 	/**
 	 * Returns a global instance which is already started. If an agent has not
 	 * been initialized then one will be created via {@link Offline#createAgent()}.
+	 * This will capture any data written via {@link Offline#getProbes} prior to
+	 * this call, but not subsequently.
 	 * 
 	 * @return global instance
 	 * @throws IllegalStateException
diff --git a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Offline.java b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Offline.java
index 21a78bb..7eac19f 100644
--- a/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Offline.java
+++ b/org.jacoco.agent.rt/src/org/jacoco/agent/rt/internal/Offline.java
@@ -11,8 +11,11 @@
  *******************************************************************************/
 package org.jacoco.agent.rt.internal;
 
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Properties;
 
+import org.jacoco.core.data.ExecutionData;
 import org.jacoco.core.data.ExecutionDataStore;
 import org.jacoco.core.runtime.AgentOptions;
 import org.jacoco.core.runtime.RuntimeData;
@@ -25,18 +28,17 @@
 
 	// BEGIN android-change
 	// private static final RuntimeData DATA;
-	private static final ExecutionDataStore DATA;
+	private static final Map<Long, ExecutionData> DATA = new HashMap<Long, ExecutionData>();
 	// END android-change
 	private static final String CONFIG_RESOURCE = "/jacoco-agent.properties";
 
-	static {
-		// BEGIN android-change
-		// final Properties config = ConfigLoader.load(CONFIG_RESOURCE,
-		//		System.getProperties());
-		// DATA = Agent.getInstance(new AgentOptions(config)).getData();
-		DATA = new ExecutionDataStore();
-		// END android-change
-	}
+	// BEGIN android-change
+	// static {
+	//	 final Properties config = ConfigLoader.load(CONFIG_RESOURCE,
+	//			System.getProperties());
+	//	 DATA = Agent.getInstance(new AgentOptions(config)).getData();
+	// }
+	// END android-change
 
 	private Offline() {
 		// no instances
@@ -59,7 +61,14 @@
 		// return DATA.getExecutionData(Long.valueOf(classid), classname,
 		//		probecount).getProbes();
 		synchronized (DATA) {
-			return DATA.get(classid, classname, probecount).getProbes();
+			ExecutionData entry = DATA.get(classid);
+			if (entry == null) {
+				entry = new ExecutionData(classid, classname, probecount);
+				DATA.put(classid, entry);
+			} else {
+				entry.assertCompatibility(classid, classname, probecount);
+			}
+			return entry.getProbes();
 		}
 		// END android-change
 	}
@@ -68,14 +77,21 @@
 	/**
 	 * Creates a default agent, using config loaded from the classpath resource and the system
 	 * properties, and a runtime data instance populated with the execution data accumulated by
-	 * the probes.
+	 * the probes up until this call is made (subsequent probe updates will not be reflected in
+	 * this agent).
 	 *
 	 * @return the new agent
 	 */
 	static Agent createAgent() {
 		final Properties config = ConfigLoader.load(CONFIG_RESOURCE,
 				System.getProperties());
-		return Agent.getInstance(new AgentOptions(config), new RuntimeData(DATA));
+		synchronized (DATA) {
+			ExecutionDataStore store = new ExecutionDataStore();
+			for (ExecutionData data : DATA.values()) {
+				store.put(data);
+			}
+			return Agent.getInstance(new AgentOptions(config), new RuntimeData(store));
+		}
 	}
 	// END android-change
 }