kamg@551: /* coleenp@4037: * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. kamg@551: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. kamg@551: * kamg@551: * This code is free software; you can redistribute it and/or modify it kamg@551: * under the terms of the GNU General Public License version 2 only, as kamg@551: * published by the Free Software Foundation. kamg@551: * kamg@551: * This code is distributed in the hope that it will be useful, but WITHOUT kamg@551: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or kamg@551: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License kamg@551: * version 2 for more details (a copy is included in the LICENSE file that kamg@551: * accompanied this code). kamg@551: * kamg@551: * You should have received a copy of the GNU General Public License version kamg@551: * 2 along with this work; if not, write to the Free Software Foundation, kamg@551: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. kamg@551: * trims@1907: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA trims@1907: * or visit www.oracle.com if you need additional information or have any trims@1907: * questions. kamg@551: * kamg@551: */ kamg@551: stefank@2314: #include "precompiled.hpp" stefank@2314: #include "classfile/javaClasses.hpp" stefank@2314: #include "code/codeBlob.hpp" stefank@2314: #include "memory/allocation.hpp" stefank@2314: #include "prims/jvm.h" stefank@2314: #include "runtime/dtraceJSDT.hpp" stefank@2314: #include "runtime/jniHandles.hpp" stefank@2314: #include "runtime/os.hpp" stefank@2314: #include "utilities/exceptions.hpp" stefank@2314: #include "utilities/globalDefinitions.hpp" stefank@2314: #include "utilities/utf8.hpp" kamg@551: kamg@551: #ifdef HAVE_DTRACE_H kamg@551: kamg@551: jlong DTraceJSDT::activate( kamg@551: jint version, jstring module_name, jint providers_count, kamg@551: JVM_DTraceProvider* providers, TRAPS) { kamg@551: kamg@551: size_t count = 0; kamg@551: RegisteredProbes* probes = NULL; kamg@551: kamg@551: if (!is_supported()) { kamg@551: return 0; kamg@551: } kamg@551: kamg@551: assert(module_name != NULL, "valid module name"); kamg@551: assert(providers != NULL, "valid provider array"); kamg@551: kamg@551: for (int i = 0; i < providers_count; ++i) { kamg@551: count += providers[i].probe_count; kamg@551: } kamg@551: probes = new RegisteredProbes(count); kamg@551: count = 0; kamg@551: kamg@551: for (int i = 0; i < providers_count; ++i) { kamg@551: assert(providers[i].name != NULL, "valid provider name"); kamg@551: assert(providers[i].probe_count == 0 || providers[i].probes != NULL, kamg@551: "valid probe count"); kamg@551: for (int j = 0; j < providers[i].probe_count; ++j) { kamg@551: JVM_DTraceProbe* probe = &(providers[i].probes[j]); kamg@551: assert(probe != NULL, "valid probe"); kamg@551: assert(probe->method != NULL, "valid method"); kamg@551: assert(probe->name != NULL, "valid probe name"); kamg@551: assert(probe->function != NULL, "valid probe function spec"); kamg@551: methodHandle h_method = coleenp@4037: methodHandle(THREAD, Method::resolve_jmethod_id(probe->method)); kamg@551: nmethod* nm = AdapterHandlerLibrary::create_dtrace_nmethod(h_method); kvn@1177: if (nm == NULL) { kvn@1177: delete probes; kvn@1177: THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), kvn@1177: "Unable to register DTrace probes (CodeCache: no room for DTrace nmethods)."); kvn@1177: } iveresov@2138: h_method()->set_not_compilable(); kamg@551: h_method()->set_code(h_method, nm); kamg@551: probes->nmethod_at_put(count++, nm); kamg@551: } kamg@551: } kamg@551: kamg@551: int handle = pd_activate((void*)probes, kamg@551: module_name, providers_count, providers); kamg@3554: if (handle < 0) { kamg@551: delete probes; kamg@551: THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), kamg@551: "Unable to register DTrace probes (internal error)."); kamg@551: } kamg@551: probes->set_helper_handle(handle); kamg@551: return RegisteredProbes::toOpaqueProbes(probes); kamg@551: } kamg@551: kamg@551: jboolean DTraceJSDT::is_probe_enabled(jmethodID method) { coleenp@4037: Method* m = Method::resolve_jmethod_id(method); kamg@551: return nativeInstruction_at(m->code()->trap_address())->is_dtrace_trap(); kamg@551: } kamg@551: kamg@551: void DTraceJSDT::dispose(OpaqueProbes probes) { kamg@551: RegisteredProbes* p = RegisteredProbes::toRegisteredProbes(probes); kamg@551: if (probes != -1 && p != NULL) { kamg@551: pd_dispose(p->helper_handle()); kamg@551: delete p; kamg@551: } kamg@551: } kamg@551: kamg@551: jboolean DTraceJSDT::is_supported() { kamg@551: return pd_is_supported(); kamg@551: } kamg@551: kamg@551: #else // HAVE_DTRACE_H kamg@551: kamg@551: jlong DTraceJSDT::activate( kamg@551: jint version, jstring module_name, jint providers_count, kamg@551: JVM_DTraceProvider* providers, TRAPS) { kamg@551: return 0; kamg@551: } kamg@551: kamg@551: jboolean DTraceJSDT::is_probe_enabled(jmethodID method) { kamg@551: return false; kamg@551: } kamg@551: kamg@551: void DTraceJSDT::dispose(OpaqueProbes probes) { kamg@551: return; kamg@551: } kamg@551: kamg@551: jboolean DTraceJSDT::is_supported() { kamg@551: return false; kamg@551: } kamg@551: kamg@551: #endif // ndef HAVE_DTRACE_H