1 /* 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #ifndef SHARE_VM_RUNTIME_DTRACEJSDT_HPP 26 #define SHARE_VM_RUNTIME_DTRACEJSDT_HPP 27 28 #include "code/nmethod.hpp" 29 #ifdef TARGET_ARCH_x86 30 # include "nativeInst_x86.hpp" 31 #endif 32 #ifdef TARGET_ARCH_aarch64 33 # include "nativeInst_aarch64.hpp" 34 #endif 35 #ifdef TARGET_ARCH_sparc 36 # include "nativeInst_sparc.hpp" 37 #endif 38 #ifdef TARGET_ARCH_zero 39 # include "nativeInst_zero.hpp" 40 #endif 41 #ifdef TARGET_ARCH_arm 42 # include "nativeInst_arm.hpp" 43 #endif 44 #ifdef TARGET_ARCH_ppc 45 # include "nativeInst_ppc.hpp" 46 #endif 47 48 class RegisteredProbes; 49 typedef jlong OpaqueProbes; 50 51 class DTraceJSDT : AllStatic { 52 private: 53 54 static int pd_activate(void* moduleBaseAddress, jstring module, 55 jint providers_count, JVM_DTraceProvider* providers); 56 static void pd_dispose(int handle); 57 static jboolean pd_is_supported(); 58 59 public: 60 61 static OpaqueProbes activate( 62 jint version, jstring module_name, jint providers_count, 63 JVM_DTraceProvider* providers, TRAPS); 64 static jboolean is_probe_enabled(jmethodID method); 65 static void dispose(OpaqueProbes handle); 66 static jboolean is_supported(); 67 }; 68 69 class RegisteredProbes : public CHeapObj<mtInternal> { 70 private: 71 nmethod** _nmethods; // all the probe methods 72 size_t _count; // number of probe methods 73 int _helper_handle; // DTrace-assigned identifier 74 75 public: 76 RegisteredProbes(size_t count) { 77 _count = count; 78 _nmethods = NEW_C_HEAP_ARRAY(nmethod*, count, mtInternal); 79 } 80 81 ~RegisteredProbes() { 82 for (size_t i = 0; i < _count; ++i) { 83 // Let the sweeper reclaim it 84 _nmethods[i]->make_not_entrant(); 85 _nmethods[i]->method()->clear_code(); 86 } 87 FREE_C_HEAP_ARRAY(nmethod*, _nmethods, mtInternal); 88 _nmethods = NULL; 89 _count = 0; 90 } 91 92 static RegisteredProbes* toRegisteredProbes(OpaqueProbes p) { 93 return (RegisteredProbes*)(intptr_t)p; 94 } 95 96 static OpaqueProbes toOpaqueProbes(RegisteredProbes* p) { 97 return (OpaqueProbes)(intptr_t)p; 98 } 99 100 void set_helper_handle(int handle) { _helper_handle = handle; } 101 int helper_handle() const { return _helper_handle; } 102 103 nmethod* nmethod_at(size_t i) { 104 assert(i >= 0 && i < _count, "bad nmethod index"); 105 return _nmethods[i]; 106 } 107 108 void nmethod_at_put(size_t i, nmethod* nm) { 109 assert(i >= 0 && i < _count, "bad nmethod index"); 110 _nmethods[i] = nm; 111 } 112 }; 113 114 #endif // SHARE_VM_RUNTIME_DTRACEJSDT_HPP