1 /* 2 * Copyright (c) 1997, 2010, 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_sparc 33 # include "nativeInst_sparc.hpp" 34 #endif 35 #ifdef TARGET_ARCH_zero 36 # include "nativeInst_zero.hpp" 37 #endif 38 39 class RegisteredProbes; 40 typedef jlong OpaqueProbes; 41 42 class DTraceJSDT : AllStatic { 43 private: 44 45 static int pd_activate(void* moduleBaseAddress, jstring module, 46 jint providers_count, JVM_DTraceProvider* providers); 47 static void pd_dispose(int handle); 48 static jboolean pd_is_supported(); 49 50 public: 51 52 static OpaqueProbes activate( 53 jint version, jstring module_name, jint providers_count, 54 JVM_DTraceProvider* providers, TRAPS); 55 static jboolean is_probe_enabled(jmethodID method); 56 static void dispose(OpaqueProbes handle); 57 static jboolean is_supported(); 58 }; 59 60 class RegisteredProbes : public CHeapObj { 61 private: 62 nmethod** _nmethods; // all the probe methods 63 size_t _count; // number of probe methods 64 int _helper_handle; // DTrace-assigned identifier 65 66 public: 67 RegisteredProbes(size_t count) { 68 _count = count; 69 _nmethods = NEW_C_HEAP_ARRAY(nmethod*, count); 70 } 71 72 ~RegisteredProbes() { 73 for (size_t i = 0; i < _count; ++i) { 74 // Let the sweeper reclaim it 75 _nmethods[i]->make_not_entrant(); 76 _nmethods[i]->method()->clear_code(); 77 } 78 FREE_C_HEAP_ARRAY(nmethod*, _nmethods); 79 _nmethods = NULL; 80 _count = 0; 81 } 82 83 static RegisteredProbes* toRegisteredProbes(OpaqueProbes p) { 84 return (RegisteredProbes*)(intptr_t)p; 85 } 86 87 static OpaqueProbes toOpaqueProbes(RegisteredProbes* p) { 88 return (OpaqueProbes)(intptr_t)p; 89 } 90 91 void set_helper_handle(int handle) { _helper_handle = handle; } 92 int helper_handle() const { return _helper_handle; } 93 94 nmethod* nmethod_at(size_t i) { 95 assert(i >= 0 && i < _count, "bad nmethod index"); 96 return _nmethods[i]; 97 } 98 99 void nmethod_at_put(size_t i, nmethod* nm) { 100 assert(i >= 0 && i < _count, "bad nmethod index"); 101 _nmethods[i] = nm; 102 } 103 }; 104 105 #endif // SHARE_VM_RUNTIME_DTRACEJSDT_HPP