Fix lock order for jvmti kTaggingLockLevel

Add test for duplicate env free order.

Bug: 36648696

Test: ./test.py --host

Change-Id: I76fc8187b29f5e66cc29674320e887dbc508fe19
diff --git a/test/905-object-free/src/Main.java b/test/905-object-free/src/Main.java
index e41e378..67811c2 100644
--- a/test/905-object-free/src/Main.java
+++ b/test/905-object-free/src/Main.java
@@ -33,6 +33,9 @@
 
     enableFreeTracking(false);
     run(l);
+
+    enableFreeTracking(true);
+    stress();
   }
 
   private static void run(ArrayList<Object> l) {
@@ -62,6 +65,25 @@
     System.out.println("---");
   }
 
+  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.
+    }
+    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]) {
+        System.out.println("Mismatched tags " + freedTags1[i] + " " + freedTags2[i]);
+      }
+    }
+  }
+
   private static void allocate(ArrayList<Object> l, long tag) {
     Object obj = new Object();
     l.add(obj);
@@ -69,7 +91,7 @@
   }
 
   private static void getAndPrintTags() {
-    long[] freedTags = getCollectedTags();
+    long[] freedTags = getCollectedTags(0);
     Arrays.sort(freedTags);
     System.out.println(Arrays.toString(freedTags));
   }
@@ -77,5 +99,5 @@
   private static native void setupObjectFreeCallback();
   private static native void enableFreeTracking(boolean enable);
   private static native void setTag(Object o, long tag);
-  private static native long[] getCollectedTags();
+  private static native long[] getCollectedTags(int index);
 }