ART: Fix ObjectFree reporting

Free events should not be dispatched to all registered envs. They
are specific to the env that the tag came from.

Add a DispatchEvent that takes an env, add an env field to the
tagging table, and connect the two.

Update the stress test. Make it actually work with a tagging
function for the second env.

Bug: 36648696
Test: ./test.py --host -r -t 905
Change-Id: I485ef1a6a57e233a2c2128b30cae93532676b3bf
diff --git a/test/905-object-free/src/Main.java b/test/905-object-free/src/Main.java
index 67811c2..0d57629 100644
--- a/test/905-object-free/src/Main.java
+++ b/test/905-object-free/src/Main.java
@@ -65,20 +65,25 @@
     System.out.println("---");
   }
 
+  private static void stressAllocate(int i) {
+    Object obj = new Object();
+    setTag(obj, i);
+    setTag2(obj, i + 1);
+  }
+
   private static void stress() {
     getCollectedTags(0);
     getCollectedTags(1);
-    for (int i = 0; i <= 1000000; ++i) {
-      Object obj = new Object();
-      setTag(obj, i);
-      obj = null; // Clear vreg.
+    // Allocate objects.
+    for (int i = 1; i <= 100000; ++i) {
+      stressAllocate(i);
     }
     Runtime.getRuntime().gc();
     long[] freedTags1 = getCollectedTags(0);
     long[] freedTags2 = getCollectedTags(1);
     System.out.println("Free counts " + freedTags1.length + " " + freedTags2.length);
     for (int i = 0; i < freedTags1.length; ++i) {
-      if (freedTags1[i] != freedTags2[i]) {
+      if (freedTags1[i] + 1 != freedTags2[i]) {
         System.out.println("Mismatched tags " + freedTags1[i] + " " + freedTags2[i]);
       }
     }
@@ -100,4 +105,5 @@
   private static native void enableFreeTracking(boolean enable);
   private static native void setTag(Object o, long tag);
   private static native long[] getCollectedTags(int index);
+  private static native void setTag2(Object o, long tag);
 }