Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/services/dtraceAttacher.cpp
32285 views
1
/*
2
* Copyright (c) 2006, 2013, 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/vmThread.hpp"
30
#include "runtime/vm_operations.hpp"
31
#include "services/dtraceAttacher.hpp"
32
33
#ifdef SOLARIS
34
35
class VM_DeoptimizeTheWorld : public VM_Operation {
36
public:
37
VMOp_Type type() const {
38
return VMOp_DeoptimizeTheWorld;
39
}
40
void doit() {
41
CodeCache::mark_all_nmethods_for_deoptimization();
42
ResourceMark rm;
43
DeoptimizationMarker dm;
44
// Deoptimize all activations depending on marked methods
45
Deoptimization::deoptimize_dependents();
46
47
// Mark the dependent methods non entrant
48
CodeCache::make_marked_nmethods_not_entrant();
49
}
50
};
51
52
static void set_bool_flag(const char* flag, bool value) {
53
CommandLineFlags::boolAtPut((char*)flag, strlen(flag), &value,
54
Flag::ATTACH_ON_DEMAND);
55
}
56
57
// Enable only the "fine grained" flags. Do *not* touch
58
// the overall "ExtendedDTraceProbes" flag.
59
void DTrace::enable_dprobes(int probes) {
60
bool changed = false;
61
if (!DTraceAllocProbes && (probes & DTRACE_ALLOC_PROBES)) {
62
set_bool_flag("DTraceAllocProbes", true);
63
changed = true;
64
}
65
if (!DTraceMethodProbes && (probes & DTRACE_METHOD_PROBES)) {
66
set_bool_flag("DTraceMethodProbes", true);
67
changed = true;
68
}
69
if (!DTraceMonitorProbes && (probes & DTRACE_MONITOR_PROBES)) {
70
set_bool_flag("DTraceMonitorProbes", true);
71
changed = true;
72
}
73
74
if (changed) {
75
// one or more flags changed, need to deoptimize
76
VM_DeoptimizeTheWorld op;
77
VMThread::execute(&op);
78
}
79
}
80
81
// Disable only the "fine grained" flags. Do *not* touch
82
// the overall "ExtendedDTraceProbes" flag.
83
void DTrace::disable_dprobes(int probes) {
84
bool changed = false;
85
if (DTraceAllocProbes && (probes & DTRACE_ALLOC_PROBES)) {
86
set_bool_flag("DTraceAllocProbes", false);
87
changed = true;
88
}
89
if (DTraceMethodProbes && (probes & DTRACE_METHOD_PROBES)) {
90
set_bool_flag("DTraceMethodProbes", false);
91
changed = true;
92
}
93
if (DTraceMonitorProbes && (probes & DTRACE_MONITOR_PROBES)) {
94
set_bool_flag("DTraceMonitorProbes", false);
95
changed = true;
96
}
97
if (changed) {
98
// one or more flags changed, need to deoptimize
99
VM_DeoptimizeTheWorld op;
100
VMThread::execute(&op);
101
}
102
}
103
104
// Do clean-up on "all door clients detached" event.
105
void DTrace::detach_all_clients() {
106
/*
107
* We restore the state of the fine grained flags
108
* to be consistent with overall ExtendedDTraceProbes.
109
* This way, we will honour command line setting or the
110
* last explicit modification of ExtendedDTraceProbes by
111
* a call to set_extended_dprobes.
112
*/
113
if (ExtendedDTraceProbes) {
114
enable_dprobes(DTRACE_ALL_PROBES);
115
} else {
116
disable_dprobes(DTRACE_ALL_PROBES);
117
}
118
}
119
120
void DTrace::set_extended_dprobes(bool flag) {
121
// explicit setting of ExtendedDTraceProbes flag
122
set_bool_flag("ExtendedDTraceProbes", flag);
123
124
// make sure that the fine grained flags reflect the change.
125
if (flag) {
126
enable_dprobes(DTRACE_ALL_PROBES);
127
} else {
128
/*
129
* FIXME: Revisit this: currently all-client-detach detection
130
* does not work and hence disabled. The following scheme does
131
* not work. So, we have to disable fine-grained flags here.
132
*
133
* disable_dprobes call has to be delayed till next "detach all "event.
134
* This is to be done so that concurrent DTrace clients that may
135
* have enabled one or more fine grained dprobes and may be running
136
* still. On "detach all" clients event, we would sync ExtendedDTraceProbes
137
* with fine grained flags which would take care of disabling fine grained flags.
138
*/
139
disable_dprobes(DTRACE_ALL_PROBES);
140
}
141
}
142
143
void DTrace::set_monitor_dprobes(bool flag) {
144
// explicit setting of DTraceMonitorProbes flag
145
set_bool_flag("DTraceMonitorProbes", flag);
146
}
147
148
#endif /* SOLARIS */
149
150