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);
}