1 /* 2 * Copyright (c) 2006, 2019, 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 #include "precompiled.hpp" 26 #include "code/codeCache.hpp" 27 #include "memory/resourceArea.hpp" 28 #include "runtime/deoptimization.hpp" 29 #include "runtime/flags/jvmFlag.hpp" 30 #include "runtime/vmThread.hpp" 31 #include "runtime/vmOperations.hpp" 32 #include "services/dtraceAttacher.hpp" 33 34 #ifdef SOLARIS 35 36 static void set_bool_flag(const char* name, bool value) { 37 JVMFlag* flag = JVMFlag::find_flag(name); 38 JVMFlag::boolAtPut(flag, &value, JVMFlag::ATTACH_ON_DEMAND); 39 } 40 41 // Enable only the "fine grained" flags. Do *not* touch 42 // the overall "ExtendedDTraceProbes" flag. 43 void DTrace::enable_dprobes(int probes) { 44 bool changed = false; 45 if (!DTraceAllocProbes && (probes & DTRACE_ALLOC_PROBES)) { 46 set_bool_flag("DTraceAllocProbes", true); 47 changed = true; 48 } 49 if (!DTraceMethodProbes && (probes & DTRACE_METHOD_PROBES)) { 50 set_bool_flag("DTraceMethodProbes", true); 51 changed = true; 52 } 53 if (!DTraceMonitorProbes && (probes & DTRACE_MONITOR_PROBES)) { 54 set_bool_flag("DTraceMonitorProbes", true); 55 changed = true; 56 } 57 58 if (changed) { 59 // one or more flags changed, need to deoptimize 60 CodeCache::mark_all_nmethods_for_deoptimization(); 61 Deoptimization::deoptimize_all_marked(); 62 } 63 } 64 65 // Disable only the "fine grained" flags. Do *not* touch 66 // the overall "ExtendedDTraceProbes" flag. 67 void DTrace::disable_dprobes(int probes) { 68 bool changed = false; 69 if (DTraceAllocProbes && (probes & DTRACE_ALLOC_PROBES)) { 70 set_bool_flag("DTraceAllocProbes", false); 71 changed = true; 72 } 73 if (DTraceMethodProbes && (probes & DTRACE_METHOD_PROBES)) { 74 set_bool_flag("DTraceMethodProbes", false); 75 changed = true; 76 } 77 if (DTraceMonitorProbes && (probes & DTRACE_MONITOR_PROBES)) { 78 set_bool_flag("DTraceMonitorProbes", false); 79 changed = true; 80 } 81 if (changed) { 82 // one or more flags changed, need to deoptimize 83 CodeCache::mark_all_nmethods_for_deoptimization(); 84 Deoptimization::deoptimize_all_marked(); 85 } 86 } 87 88 // Do clean-up on "all door clients detached" event. 89 void DTrace::detach_all_clients() { 90 /* 91 * We restore the state of the fine grained flags 92 * to be consistent with overall ExtendedDTraceProbes. 93 * This way, we will honour command line setting or the 94 * last explicit modification of ExtendedDTraceProbes by 95 * a call to set_extended_dprobes. 96 */ 97 if (ExtendedDTraceProbes) { 98 enable_dprobes(DTRACE_ALL_PROBES); 99 } else { 100 disable_dprobes(DTRACE_ALL_PROBES); 101 } 102 } 103 104 void DTrace::set_extended_dprobes(bool flag) { 105 // explicit setting of ExtendedDTraceProbes flag 106 set_bool_flag("ExtendedDTraceProbes", flag); 107 108 // make sure that the fine grained flags reflect the change. 109 if (flag) { 110 enable_dprobes(DTRACE_ALL_PROBES); 111 } else { 112 /* 113 * FIXME: Revisit this: currently all-client-detach detection 114 * does not work and hence disabled. The following scheme does 115 * not work. So, we have to disable fine-grained flags here. 116 * 117 * disable_dprobes call has to be delayed till next "detach all "event. 118 * This is to be done so that concurrent DTrace clients that may 119 * have enabled one or more fine grained dprobes and may be running 120 * still. On "detach all" clients event, we would sync ExtendedDTraceProbes 121 * with fine grained flags which would take care of disabling fine grained flags. 122 */ 123 disable_dprobes(DTRACE_ALL_PROBES); 124 } 125 } 126 127 void DTrace::set_monitor_dprobes(bool flag) { 128 // explicit setting of DTraceMonitorProbes flag 129 set_bool_flag("DTraceMonitorProbes", flag); 130 } 131 132 #endif /* SOLARIS */