diff options
author | 2016-10-18 17:32:14 +0000 | |
---|---|---|
committer | 2016-10-18 17:32:15 +0000 | |
commit | 66e69012f9fb6e49e66e8d9d6c7952f58668281b (patch) | |
tree | 215b514ca374d03d6867b5cc6ba8a3dbe05ee14d | |
parent | b07d20b9dd89dec38bde4083b2bf4953a1909b53 (diff) | |
parent | 2427aae0fa7f067dc92991bb1e2d032a4368146d (diff) |
Merge changes If0d5eeeb,Id927f2b5
* changes:
ART: Fix and extend test 904
ART: Better handle multiple event enables
-rw-r--r-- | runtime/openjdkjvmti/events.cc | 8 | ||||
-rw-r--r-- | test/904-object-allocation/src/Main.java | 17 | ||||
-rw-r--r-- | test/904-object-allocation/tracking.cc | 5 |
3 files changed, 24 insertions, 6 deletions
diff --git a/runtime/openjdkjvmti/events.cc b/runtime/openjdkjvmti/events.cc index 9ff6c93c8f..59e01eafa0 100644 --- a/runtime/openjdkjvmti/events.cc +++ b/runtime/openjdkjvmti/events.cc @@ -219,6 +219,8 @@ jvmtiError EventHandler::SetEvent(ArtJvmTiEnv* env, return ERR(INVALID_EVENT_TYPE); } + bool old_state = global_mask.Test(event); + if (mode == JVMTI_ENABLE) { env->event_masks.EnableEvent(thread, event); global_mask.Set(event); @@ -239,8 +241,12 @@ jvmtiError EventHandler::SetEvent(ArtJvmTiEnv* env, global_mask.Set(event, union_value); } + bool new_state = global_mask.Test(event); + // Handle any special work required for the event type. - HandleEventType(event, mode == JVMTI_ENABLE); + if (new_state != old_state) { + HandleEventType(event, mode == JVMTI_ENABLE); + } return ERR(NONE); } diff --git a/test/904-object-allocation/src/Main.java b/test/904-object-allocation/src/Main.java index 9a089bdd78..fc8a112e49 100644 --- a/test/904-object-allocation/src/Main.java +++ b/test/904-object-allocation/src/Main.java @@ -40,7 +40,11 @@ public class Main { } public static void doTest(ArrayList<Object> l) throws Exception { - setupObjectAllocCallback(); + // Disable the global registration from OnLoad, to get into a known state. + enableAllocationTracking(null, false); + + // Enable actual logging callback. + setupObjectAllocCallback(true); enableAllocationTracking(null, true); @@ -74,6 +78,11 @@ public class Main { testThread(l, false, true); l.add(new Byte((byte)0)); + + // Disable actual logging callback and re-enable tracking, so we can keep the event enabled and + // check that shutdown works correctly. + setupObjectAllocCallback(false); + enableAllocationTracking(null, true); } private static void testThread(final ArrayList<Object> l, final boolean sameThread, @@ -82,6 +91,8 @@ public class Main { final SimpleBarrier trackBarrier = new SimpleBarrier(1); final SimpleBarrier disableBarrier = new SimpleBarrier(1); + final Thread thisThread = Thread.currentThread(); + Thread t = new Thread() { public void run() { try { @@ -95,7 +106,7 @@ public class Main { l.add(new Double(0.0)); if (disableTracking) { - enableAllocationTracking(sameThread ? this : Thread.currentThread(), false); + enableAllocationTracking(sameThread ? this : thisThread, false); } } }; @@ -127,6 +138,6 @@ public class Main { } } - private static native void setupObjectAllocCallback(); + private static native void setupObjectAllocCallback(boolean enable); private static native void enableAllocationTracking(Thread thread, boolean enable); } diff --git a/test/904-object-allocation/tracking.cc b/test/904-object-allocation/tracking.cc index b22fc6c8c0..57bfed544e 100644 --- a/test/904-object-allocation/tracking.cc +++ b/test/904-object-allocation/tracking.cc @@ -58,10 +58,10 @@ static void JNICALL ObjectAllocated(jvmtiEnv* ti_env ATTRIBUTE_UNUSED, } extern "C" JNIEXPORT void JNICALL Java_Main_setupObjectAllocCallback( - JNIEnv* env ATTRIBUTE_UNUSED, jclass klass ATTRIBUTE_UNUSED) { + JNIEnv* env ATTRIBUTE_UNUSED, jclass klass ATTRIBUTE_UNUSED, jboolean enable) { jvmtiEventCallbacks callbacks; memset(&callbacks, 0, sizeof(jvmtiEventCallbacks)); - callbacks.VMObjectAlloc = ObjectAllocated; + callbacks.VMObjectAlloc = enable ? ObjectAllocated : nullptr; jvmtiError ret = jvmti_env->SetEventCallbacks(&callbacks, sizeof(callbacks)); if (ret != JVMTI_ERROR_NONE) { @@ -94,6 +94,7 @@ jint OnLoad(JavaVM* vm, printf("Unable to get jvmti env!\n"); return 1; } + jvmti_env->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_OBJECT_ALLOC, nullptr); return 0; } |