summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <treehugger-gerrit@google.com> 2016-10-18 17:32:14 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2016-10-18 17:32:15 +0000
commit66e69012f9fb6e49e66e8d9d6c7952f58668281b (patch)
tree215b514ca374d03d6867b5cc6ba8a3dbe05ee14d
parentb07d20b9dd89dec38bde4083b2bf4953a1909b53 (diff)
parent2427aae0fa7f067dc92991bb1e2d032a4368146d (diff)
Merge changes If0d5eeeb,Id927f2b5
* changes: ART: Fix and extend test 904 ART: Better handle multiple event enables
-rw-r--r--runtime/openjdkjvmti/events.cc8
-rw-r--r--test/904-object-allocation/src/Main.java17
-rw-r--r--test/904-object-allocation/tracking.cc5
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;
}