src/share/vm/runtime/dtraceJSDT.cpp

Fri, 03 Sep 2010 17:51:07 -0700

author
iveresov
date
Fri, 03 Sep 2010 17:51:07 -0700
changeset 2138
d5d065957597
parent 1907
c18cbe5936b8
child 2314
f95d63e2154a
permissions
-rw-r--r--

6953144: Tiered compilation
Summary: Infrastructure for tiered compilation support (interpreter + c1 + c2) for 32 and 64 bit. Simple tiered policy implementation.
Reviewed-by: kvn, never, phh, twisti

kamg@551 1 /*
trims@1907 2 * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved.
kamg@551 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
kamg@551 4 *
kamg@551 5 * This code is free software; you can redistribute it and/or modify it
kamg@551 6 * under the terms of the GNU General Public License version 2 only, as
kamg@551 7 * published by the Free Software Foundation.
kamg@551 8 *
kamg@551 9 * This code is distributed in the hope that it will be useful, but WITHOUT
kamg@551 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
kamg@551 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kamg@551 12 * version 2 for more details (a copy is included in the LICENSE file that
kamg@551 13 * accompanied this code).
kamg@551 14 *
kamg@551 15 * You should have received a copy of the GNU General Public License version
kamg@551 16 * 2 along with this work; if not, write to the Free Software Foundation,
kamg@551 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
kamg@551 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
kamg@551 22 *
kamg@551 23 */
kamg@551 24
kamg@551 25 #include "incls/_precompiled.incl"
kamg@551 26 #include "incls/_dtraceJSDT.cpp.incl"
kamg@551 27
kamg@551 28 #ifdef HAVE_DTRACE_H
kamg@551 29
kamg@551 30 jlong DTraceJSDT::activate(
kamg@551 31 jint version, jstring module_name, jint providers_count,
kamg@551 32 JVM_DTraceProvider* providers, TRAPS) {
kamg@551 33
kamg@551 34 size_t count = 0;
kamg@551 35 RegisteredProbes* probes = NULL;
kamg@551 36
kamg@551 37 if (!is_supported()) {
kamg@551 38 return 0;
kamg@551 39 }
kamg@551 40
kamg@551 41 assert(module_name != NULL, "valid module name");
kamg@551 42 assert(providers != NULL, "valid provider array");
kamg@551 43
kamg@551 44 for (int i = 0; i < providers_count; ++i) {
kamg@551 45 count += providers[i].probe_count;
kamg@551 46 }
kamg@551 47 probes = new RegisteredProbes(count);
kamg@551 48 count = 0;
kamg@551 49
kamg@551 50 for (int i = 0; i < providers_count; ++i) {
kamg@551 51 assert(providers[i].name != NULL, "valid provider name");
kamg@551 52 assert(providers[i].probe_count == 0 || providers[i].probes != NULL,
kamg@551 53 "valid probe count");
kamg@551 54 for (int j = 0; j < providers[i].probe_count; ++j) {
kamg@551 55 JVM_DTraceProbe* probe = &(providers[i].probes[j]);
kamg@551 56 assert(probe != NULL, "valid probe");
kamg@551 57 assert(probe->method != NULL, "valid method");
kamg@551 58 assert(probe->name != NULL, "valid probe name");
kamg@551 59 assert(probe->function != NULL, "valid probe function spec");
kamg@551 60 methodHandle h_method =
kamg@551 61 methodHandle(THREAD, JNIHandles::resolve_jmethod_id(probe->method));
kamg@551 62 nmethod* nm = AdapterHandlerLibrary::create_dtrace_nmethod(h_method);
kvn@1177 63 if (nm == NULL) {
kvn@1177 64 delete probes;
kvn@1177 65 THROW_MSG_0(vmSymbols::java_lang_RuntimeException(),
kvn@1177 66 "Unable to register DTrace probes (CodeCache: no room for DTrace nmethods).");
kvn@1177 67 }
iveresov@2138 68 h_method()->set_not_compilable();
kamg@551 69 h_method()->set_code(h_method, nm);
kamg@551 70 probes->nmethod_at_put(count++, nm);
kamg@551 71 }
kamg@551 72 }
kamg@551 73
kamg@551 74 int handle = pd_activate((void*)probes,
kamg@551 75 module_name, providers_count, providers);
kamg@551 76 if (handle <= 0) {
kamg@551 77 delete probes;
kamg@551 78 THROW_MSG_0(vmSymbols::java_lang_RuntimeException(),
kamg@551 79 "Unable to register DTrace probes (internal error).");
kamg@551 80 }
kamg@551 81 probes->set_helper_handle(handle);
kamg@551 82 return RegisteredProbes::toOpaqueProbes(probes);
kamg@551 83 }
kamg@551 84
kamg@551 85 jboolean DTraceJSDT::is_probe_enabled(jmethodID method) {
kamg@551 86 methodOop m = JNIHandles::resolve_jmethod_id(method);
kamg@551 87 return nativeInstruction_at(m->code()->trap_address())->is_dtrace_trap();
kamg@551 88 }
kamg@551 89
kamg@551 90 void DTraceJSDT::dispose(OpaqueProbes probes) {
kamg@551 91 RegisteredProbes* p = RegisteredProbes::toRegisteredProbes(probes);
kamg@551 92 if (probes != -1 && p != NULL) {
kamg@551 93 pd_dispose(p->helper_handle());
kamg@551 94 delete p;
kamg@551 95 }
kamg@551 96 }
kamg@551 97
kamg@551 98 jboolean DTraceJSDT::is_supported() {
kamg@551 99 return pd_is_supported();
kamg@551 100 }
kamg@551 101
kamg@551 102 #else // HAVE_DTRACE_H
kamg@551 103
kamg@551 104 jlong DTraceJSDT::activate(
kamg@551 105 jint version, jstring module_name, jint providers_count,
kamg@551 106 JVM_DTraceProvider* providers, TRAPS) {
kamg@551 107 return 0;
kamg@551 108 }
kamg@551 109
kamg@551 110 jboolean DTraceJSDT::is_probe_enabled(jmethodID method) {
kamg@551 111 return false;
kamg@551 112 }
kamg@551 113
kamg@551 114 void DTraceJSDT::dispose(OpaqueProbes probes) {
kamg@551 115 return;
kamg@551 116 }
kamg@551 117
kamg@551 118 jboolean DTraceJSDT::is_supported() {
kamg@551 119 return false;
kamg@551 120 }
kamg@551 121
kamg@551 122 #endif // ndef HAVE_DTRACE_H

mercurial