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