diff options
| -rw-r--r-- | runtime/openjdkjvmti/Android.bp | 1 | ||||
| -rw-r--r-- | runtime/openjdkjvmti/OpenjdkJvmTi.cc | 7 | ||||
| -rw-r--r-- | runtime/openjdkjvmti/ti_timers.cc | 81 | ||||
| -rw-r--r-- | runtime/openjdkjvmti/ti_timers.h | 51 | ||||
| -rwxr-xr-x | test/927-timers/build | 17 | ||||
| -rw-r--r-- | test/927-timers/expected.txt | 3 | ||||
| -rw-r--r-- | test/927-timers/info.txt | 1 | ||||
| -rwxr-xr-x | test/927-timers/run | 19 | ||||
| -rw-r--r-- | test/927-timers/src/Main.java | 62 | ||||
| -rw-r--r-- | test/927-timers/timers.cc | 84 | ||||
| -rw-r--r-- | test/Android.bp | 1 | ||||
| -rw-r--r-- | test/Android.run-test.mk | 1 |
12 files changed, 325 insertions, 3 deletions
diff --git a/runtime/openjdkjvmti/Android.bp b/runtime/openjdkjvmti/Android.bp index 4bd21b4c2f..42fed50baf 100644 --- a/runtime/openjdkjvmti/Android.bp +++ b/runtime/openjdkjvmti/Android.bp @@ -30,6 +30,7 @@ cc_defaults { "ti_stack.cc", "ti_redefine.cc", "ti_thread.cc", + "ti_timers.cc", "transform.cc"], include_dirs: ["art/runtime"], shared_libs: [ diff --git a/runtime/openjdkjvmti/OpenjdkJvmTi.cc b/runtime/openjdkjvmti/OpenjdkJvmTi.cc index 3825c41e76..4aedec9be0 100644 --- a/runtime/openjdkjvmti/OpenjdkJvmTi.cc +++ b/runtime/openjdkjvmti/OpenjdkJvmTi.cc @@ -58,6 +58,7 @@ #include "ti_redefine.h" #include "ti_stack.h" #include "ti_thread.h" +#include "ti_timers.h" #include "transform.h" // TODO Remove this at some point by annotating all the methods. It was put in to make the skeleton @@ -1033,15 +1034,15 @@ class JvmtiFunctions { } static jvmtiError GetTimerInfo(jvmtiEnv* env, jvmtiTimerInfo* info_ptr) { - return ERR(NOT_IMPLEMENTED); + return TimerUtil::GetTimerInfo(env, info_ptr); } static jvmtiError GetTime(jvmtiEnv* env, jlong* nanos_ptr) { - return ERR(NOT_IMPLEMENTED); + return TimerUtil::GetTime(env, nanos_ptr); } static jvmtiError GetAvailableProcessors(jvmtiEnv* env, jint* processor_count_ptr) { - return ERR(NOT_IMPLEMENTED); + return TimerUtil::GetAvailableProcessors(env, processor_count_ptr); } static jvmtiError AddToBootstrapClassLoaderSearch(jvmtiEnv* env, const char* segment) { diff --git a/runtime/openjdkjvmti/ti_timers.cc b/runtime/openjdkjvmti/ti_timers.cc new file mode 100644 index 0000000000..ce4f5518ae --- /dev/null +++ b/runtime/openjdkjvmti/ti_timers.cc @@ -0,0 +1,81 @@ +/* Copyright (C) 2017 The Android Open Source Project + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This file implements interfaces from the file jvmti.h. This implementation + * is licensed under the same terms as the file jvmti.h. The + * copyright and license information for the file jvmti.h follows. + * + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#include "ti_timers.h" + +#include <limits> + +#include <time.h> +#include <unistd.h> + +#include "art_jvmti.h" +#include "base/macros.h" + +namespace openjdkjvmti { + +jvmtiError TimerUtil::GetAvailableProcessors(jvmtiEnv* env ATTRIBUTE_UNUSED, + jint* processor_count_ptr) { + if (processor_count_ptr == nullptr) { + return ERR(NULL_POINTER); + } + + *processor_count_ptr = static_cast<jint>(sysconf(_SC_NPROCESSORS_CONF)); + + return ERR(NONE); +} + +jvmtiError TimerUtil::GetTimerInfo(jvmtiEnv* env ATTRIBUTE_UNUSED, jvmtiTimerInfo* info_ptr) { + if (info_ptr == nullptr) { + return ERR(NULL_POINTER); + } + + info_ptr->max_value = static_cast<jlong>(std::numeric_limits<uint64_t>::max()); + info_ptr->may_skip_forward = JNI_TRUE; + info_ptr->may_skip_backward = JNI_TRUE; + info_ptr->kind = jvmtiTimerKind::JVMTI_TIMER_ELAPSED; + + return ERR(NONE); +} + +jvmtiError TimerUtil::GetTime(jvmtiEnv* env ATTRIBUTE_UNUSED, jlong* nanos_ptr) { + if (nanos_ptr == nullptr) { + return ERR(NULL_POINTER); + } + + // Use the same implementation as System.nanoTime. + struct timespec now; + clock_gettime(CLOCK_MONOTONIC, &now); + *nanos_ptr = now.tv_sec * 1000000000LL + now.tv_nsec; + + return ERR(NONE); +} + +} // namespace openjdkjvmti diff --git a/runtime/openjdkjvmti/ti_timers.h b/runtime/openjdkjvmti/ti_timers.h new file mode 100644 index 0000000000..6300678ff7 --- /dev/null +++ b/runtime/openjdkjvmti/ti_timers.h @@ -0,0 +1,51 @@ +/* Copyright (C) 2017 The Android Open Source Project + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This file implements interfaces from the file jvmti.h. This implementation + * is licensed under the same terms as the file jvmti.h. The + * copyright and license information for the file jvmti.h follows. + * + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#ifndef ART_RUNTIME_OPENJDKJVMTI_TI_TIMERS_H_ +#define ART_RUNTIME_OPENJDKJVMTI_TI_TIMERS_H_ + +#include "jni.h" +#include "jvmti.h" + +namespace openjdkjvmti { + +class TimerUtil { + public: + static jvmtiError GetAvailableProcessors(jvmtiEnv* env, jint* processor_count_ptr); + + static jvmtiError GetTimerInfo(jvmtiEnv* env, jvmtiTimerInfo* info_ptr); + + static jvmtiError GetTime(jvmtiEnv* env, jlong* nanos_ptr); +}; + +} // namespace openjdkjvmti + +#endif // ART_RUNTIME_OPENJDKJVMTI_TI_TIMERS_H_ diff --git a/test/927-timers/build b/test/927-timers/build new file mode 100755 index 0000000000..898e2e54a2 --- /dev/null +++ b/test/927-timers/build @@ -0,0 +1,17 @@ +#!/bin/bash +# +# Copyright 2016 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +./default-build "$@" --experimental agents diff --git a/test/927-timers/expected.txt b/test/927-timers/expected.txt new file mode 100644 index 0000000000..a4ef4424b6 --- /dev/null +++ b/test/927-timers/expected.txt @@ -0,0 +1,3 @@ +availableProcessors OK +[-1, true, true, 32] +Time OK diff --git a/test/927-timers/info.txt b/test/927-timers/info.txt new file mode 100644 index 0000000000..875a5f6ec1 --- /dev/null +++ b/test/927-timers/info.txt @@ -0,0 +1 @@ +Tests basic functions in the jvmti plugin. diff --git a/test/927-timers/run b/test/927-timers/run new file mode 100755 index 0000000000..4379349cb2 --- /dev/null +++ b/test/927-timers/run @@ -0,0 +1,19 @@ +#!/bin/bash +# +# Copyright 2016 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +./default-run "$@" --experimental agents \ + --experimental runtime-plugins \ + --jvmti diff --git a/test/927-timers/src/Main.java b/test/927-timers/src/Main.java new file mode 100644 index 0000000000..2f5c85cab5 --- /dev/null +++ b/test/927-timers/src/Main.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.Arrays; + +public class Main { + public static void main(String[] args) throws Exception { + System.loadLibrary(args[1]); + + doTest(); + } + + private static void doTest() { + int all1 = Runtime.getRuntime().availableProcessors(); + int all2 = getAvailableProcessors(); + if (all1 != all2) { + throw new RuntimeException("Available processors doesn't match: " + all1 + " vs " + all2); + } + System.out.println("availableProcessors OK"); + + Object info[] = getTimerInfo(); + System.out.println(Arrays.toString(info)); + + // getTime checks. + // Note: there isn't really much to check independent from the implementation. So we check + // a few details of the ART implementation. This may fail on other runtimes. + long time1 = getTime(); + long time2 = getTime(); + + // Under normal circumstances, time1 <= time2. + if (time2 < time1) { + throw new RuntimeException("Time unexpectedly decreased: " + time1 + " vs " + time2); + } + + long time3 = System.nanoTime(); + long time4 = getTime(); + + final long MINUTE = 60l * 1000 * 1000 * 1000; + if (time4 < time3 || (time4 - time3 > MINUTE)) { + throw new RuntimeException("Time unexpectedly divergent: " + time3 + " vs " + time4); + } + + System.out.println("Time OK"); + } + + private static native int getAvailableProcessors(); + private static native Object[] getTimerInfo(); + private static native long getTime(); +} diff --git a/test/927-timers/timers.cc b/test/927-timers/timers.cc new file mode 100644 index 0000000000..58d5c271e6 --- /dev/null +++ b/test/927-timers/timers.cc @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <inttypes.h> + +#include "android-base/stringprintf.h" +#include "base/logging.h" +#include "base/macros.h" +#include "jni.h" +#include "openjdkjvmti/jvmti.h" + +#include "ti-agent/common_helper.h" +#include "ti-agent/common_load.h" + +namespace art { +namespace Test926Timers { + +extern "C" JNIEXPORT jint JNICALL Java_Main_getAvailableProcessors( + JNIEnv* env, jclass Main_klass ATTRIBUTE_UNUSED) { + jint count; + jvmtiError result = jvmti_env->GetAvailableProcessors(&count); + if (JvmtiErrorToException(env, result)) { + return -1; + } + return count; +} + +extern "C" JNIEXPORT jlong JNICALL Java_Main_getTime( + JNIEnv* env, jclass Main_klass ATTRIBUTE_UNUSED) { + jlong time; + jvmtiError result = jvmti_env->GetTime(&time); + if (JvmtiErrorToException(env, result)) { + return -1; + } + return time; +} + +extern "C" JNIEXPORT jobjectArray JNICALL Java_Main_getTimerInfo( + JNIEnv* env, jclass Main_klass ATTRIBUTE_UNUSED) { + jvmtiTimerInfo info; + jvmtiError result = jvmti_env->GetTimerInfo(&info); + if (JvmtiErrorToException(env, result)) { + return nullptr; + } + + auto callback = [&](jint index) -> jobject { + switch (index) { + // Max value. + case 0: + return env->NewStringUTF(android::base::StringPrintf("%" PRId64, info.max_value).c_str()); + + // Skip forward. + case 1: + return env->NewStringUTF(info.may_skip_forward == JNI_TRUE ? "true" : "false"); + // Skip backward. + case 2: + return env->NewStringUTF(info.may_skip_forward == JNI_TRUE ? "true" : "false"); + + // The kind. + case 3: + return env->NewStringUTF( + android::base::StringPrintf("%d", static_cast<jint>(info.kind)).c_str()); + } + LOG(FATAL) << "Should not reach here"; + UNREACHABLE(); + }; + return CreateObjectArray(env, 4, "java/lang/Object", callback); +} + +} // namespace Test926Timers +} // namespace art diff --git a/test/Android.bp b/test/Android.bp index b0f0e5a98d..1ea1252893 100644 --- a/test/Android.bp +++ b/test/Android.bp @@ -265,6 +265,7 @@ art_cc_defaults { "922-properties/properties.cc", "923-monitors/monitors.cc", "924-threads/threads.cc", + "927-timers/timers.cc", ], shared_libs: [ "libbase", diff --git a/test/Android.run-test.mk b/test/Android.run-test.mk index 60688760a4..55cef974ab 100644 --- a/test/Android.run-test.mk +++ b/test/Android.run-test.mk @@ -304,6 +304,7 @@ TEST_ART_BROKEN_TARGET_TESTS += \ 923-monitors \ 924-threads \ 926-multi-obsolescence \ + 927-timers \ ifneq (,$(filter target,$(TARGET_TYPES))) ART_TEST_KNOWN_BROKEN += $(call all-run-test-names,target,$(RUN_TYPES),$(PREBUILD_TYPES), \ |