annotate src/share/vm/services/attachListener.cpp @ 5763:a3d71693e0ce

removed bytecode disassembly from CodeCacheRuntime into separate BytecodeDisassembler class removed VM call for doing bytecode disassembly added support for explicitly excluding classes from JaCoCo (put '// JaCoCo Exclude' somewhere in the source file) added node intrinsics to MaterializeNode added snippets for the UnsignedMath classes each file opened by CFGPrinter now includes a unique id in its name to avoid a race of multiple threads writing to the same file the IdealGraphPrinter uses the new BytecodeDisassembler mechanism teh UnsignedMath class is exclude from JaCoCo processing as it is used in snippets
author Doug Simon <doug.simon@oracle.com>
date Wed, 04 Jul 2012 21:57:49 +0200
parents 4f25538b54c9
children d2a62e0f25eb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2426
1d1603768966 7010070: Update all 2010 Oracle-changed OpenJDK files to have the proper copyright dates - second pass
trims
parents: 2177
diff changeset
2 * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1142
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1142
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1142
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #include "classfile/javaClasses.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "gc_implementation/shared/vmGCOperations.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "prims/jvmtiExport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32 #include "runtime/globals.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
33 #include "runtime/java.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
34 #include "runtime/javaCalls.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
35 #include "runtime/os.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
36 #include "services/attachListener.hpp"
4133
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
37 #include "services/diagnosticCommand.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
38 #include "services/heapDumper.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
39
a61af66fc99e Initial load
duke
parents:
diff changeset
40 volatile bool AttachListener::_initialized;
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // Implementation of "properties" command.
a61af66fc99e Initial load
duke
parents:
diff changeset
43 //
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // Invokes sun.misc.VMSupport.serializePropertiesToByteArray to serialize
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // the system properties into a byte array.
a61af66fc99e Initial load
duke
parents:
diff changeset
46
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
47 static klassOop load_and_initialize_klass(Symbol* sh, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
48 klassOop k = SystemDictionary::resolve_or_fail(sh, true, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
49 instanceKlassHandle ik (THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
50 if (ik->should_be_initialized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
51 ik->initialize(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
52 }
a61af66fc99e Initial load
duke
parents:
diff changeset
53 return ik();
a61af66fc99e Initial load
duke
parents:
diff changeset
54 }
a61af66fc99e Initial load
duke
parents:
diff changeset
55
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
56 static jint get_properties(AttachOperation* op, outputStream* out, Symbol* serializePropertiesMethod) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
57 Thread* THREAD = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
58 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // load sun.misc.VMSupport
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
61 Symbol* klass = vmSymbols::sun_misc_VMSupport();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
62 klassOop k = load_and_initialize_klass(klass, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
63 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
64 java_lang_Throwable::print(PENDING_EXCEPTION, out);
a61af66fc99e Initial load
duke
parents:
diff changeset
65 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 }
a61af66fc99e Initial load
duke
parents:
diff changeset
68 instanceKlassHandle ik(THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // invoke the serializePropertiesToByteArray method
a61af66fc99e Initial load
duke
parents:
diff changeset
71 JavaValue result(T_OBJECT);
a61af66fc99e Initial load
duke
parents:
diff changeset
72 JavaCallArguments args;
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
75 Symbol* signature = vmSymbols::serializePropertiesToByteArray_signature();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
76 JavaCalls::call_static(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
77 ik,
a61af66fc99e Initial load
duke
parents:
diff changeset
78 serializePropertiesMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
79 signature,
a61af66fc99e Initial load
duke
parents:
diff changeset
80 &args,
a61af66fc99e Initial load
duke
parents:
diff changeset
81 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
82 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
83 java_lang_Throwable::print(PENDING_EXCEPTION, out);
a61af66fc99e Initial load
duke
parents:
diff changeset
84 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
85 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 }
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // The result should be a [B
a61af66fc99e Initial load
duke
parents:
diff changeset
89 oop res = (oop)result.get_jobject();
a61af66fc99e Initial load
duke
parents:
diff changeset
90 assert(res->is_typeArray(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
91 assert(typeArrayKlass::cast(res->klass())->element_type() == T_BYTE, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // copy the bytes to the output stream
a61af66fc99e Initial load
duke
parents:
diff changeset
94 typeArrayOop ba = typeArrayOop(res);
a61af66fc99e Initial load
duke
parents:
diff changeset
95 jbyte* addr = typeArrayOop(res)->byte_at_addr(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
96 out->print_raw((const char*)addr, ba->length());
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
99 }
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // Implementation of "properties" command.
4773
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
102 // See also: PrintSystemPropertiesDCmd class
0
a61af66fc99e Initial load
duke
parents:
diff changeset
103 static jint get_system_properties(AttachOperation* op, outputStream* out) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
104 return get_properties(op, out, vmSymbols::serializePropertiesToByteArray_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // Implementation of "agent_properties" command.
a61af66fc99e Initial load
duke
parents:
diff changeset
108 static jint get_agent_properties(AttachOperation* op, outputStream* out) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
109 return get_properties(op, out, vmSymbols::serializeAgentPropertiesToByteArray_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // Implementation of "datadump" command.
a61af66fc99e Initial load
duke
parents:
diff changeset
113 //
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // Raises a SIGBREAK signal so that VM dump threads, does deadlock detection,
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // etc. In theory this command should only post a DataDumpRequest to any
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // JVMTI environment that has enabled this event. However it's useful to
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // trigger the SIGBREAK handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 static jint data_dump(AttachOperation* op, outputStream* out) {
a61af66fc99e Initial load
duke
parents:
diff changeset
120 if (!ReduceSignalUsage) {
a61af66fc99e Initial load
duke
parents:
diff changeset
121 AttachListener::pd_data_dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
122 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 if (JvmtiExport::should_post_data_dump()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
124 JvmtiExport::post_data_dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
127 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // Implementation of "threaddump" command - essentially a remote ctrl-break
4773
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
131 // See also: ThreadDumpDCmd class
0
a61af66fc99e Initial load
duke
parents:
diff changeset
132 //
a61af66fc99e Initial load
duke
parents:
diff changeset
133 static jint thread_dump(AttachOperation* op, outputStream* out) {
a61af66fc99e Initial load
duke
parents:
diff changeset
134 bool print_concurrent_locks = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
135 if (op->arg(0) != NULL && strcmp(op->arg(0), "-l") == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
136 print_concurrent_locks = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // thread stacks
a61af66fc99e Initial load
duke
parents:
diff changeset
140 VM_PrintThreads op1(out, print_concurrent_locks);
a61af66fc99e Initial load
duke
parents:
diff changeset
141 VMThread::execute(&op1);
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // JNI global handles
a61af66fc99e Initial load
duke
parents:
diff changeset
144 VM_PrintJNI op2(out);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 VMThread::execute(&op2);
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // Deadlock detection
a61af66fc99e Initial load
duke
parents:
diff changeset
148 VM_FindDeadlocks op3(out);
a61af66fc99e Initial load
duke
parents:
diff changeset
149 VMThread::execute(&op3);
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
153
4133
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
154 // A jcmd attach operation request was received, which will now
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
155 // dispatch to the diagnostic commands used for serviceability functions.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
156 static jint jcmd(AttachOperation* op, outputStream* out) {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
157 Thread* THREAD = Thread::current();
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
158 // All the supplied jcmd arguments are stored as a single
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
159 // string (op->arg(0)). This is parsed by the Dcmd framework.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
160 DCmd::parse_and_execute(out, op->arg(0), ' ', THREAD);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
161 if (HAS_PENDING_EXCEPTION) {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
162 java_lang_Throwable::print(PENDING_EXCEPTION, out);
4773
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
163 out->cr();
4133
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
164 CLEAR_PENDING_EXCEPTION;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
165 // The exception has been printed on the output stream
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
166 // If the JVM returns JNI_ERR, the attachAPI throws a generic I/O
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
167 // exception and the content of the output stream is not processed.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
168 // By returning JNI_OK, the exception will be displayed on the client side
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
169 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
170 return JNI_OK;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
171 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
172
0
a61af66fc99e Initial load
duke
parents:
diff changeset
173 #ifndef SERVICES_KERNEL // Heap dumping not supported
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // Implementation of "dumpheap" command.
4773
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
175 // See also: HeapDumpDCmd class
0
a61af66fc99e Initial load
duke
parents:
diff changeset
176 //
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // Input arguments :-
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // arg0: Name of the dump file
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // arg1: "-live" or "-all"
a61af66fc99e Initial load
duke
parents:
diff changeset
180 jint dump_heap(AttachOperation* op, outputStream* out) {
a61af66fc99e Initial load
duke
parents:
diff changeset
181 const char* path = op->arg(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
182 if (path == NULL || path[0] == '\0') {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 out->print_cr("No dump file specified");
a61af66fc99e Initial load
duke
parents:
diff changeset
184 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
185 bool live_objects_only = true; // default is true to retain the behavior before this change is made
a61af66fc99e Initial load
duke
parents:
diff changeset
186 const char* arg1 = op->arg(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
187 if (arg1 != NULL && (strlen(arg1) > 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
188 if (strcmp(arg1, "-all") != 0 && strcmp(arg1, "-live") != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
189 out->print_cr("Invalid argument to dumpheap operation: %s", arg1);
a61af66fc99e Initial load
duke
parents:
diff changeset
190 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
192 live_objects_only = strcmp(arg1, "-live") == 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
194
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // Request a full GC before heap dump if live_objects_only = true
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // This helps reduces the amount of unreachable objects in the dump
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // and makes it easier to browse.
a61af66fc99e Initial load
duke
parents:
diff changeset
198 HeapDumper dumper(live_objects_only /* request GC */);
a61af66fc99e Initial load
duke
parents:
diff changeset
199 int res = dumper.dump(op->arg(0));
a61af66fc99e Initial load
duke
parents:
diff changeset
200 if (res == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
201 out->print_cr("Heap dump file created");
a61af66fc99e Initial load
duke
parents:
diff changeset
202 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // heap dump failed
a61af66fc99e Initial load
duke
parents:
diff changeset
204 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
205 char* error = dumper.error_as_C_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
206 if (error == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 out->print_cr("Dump failed - reason unknown");
a61af66fc99e Initial load
duke
parents:
diff changeset
208 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
209 out->print_cr("%s", error);
a61af66fc99e Initial load
duke
parents:
diff changeset
210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
213 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
215 #endif // SERVICES_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // Implementation of "inspectheap" command
4773
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
218 // See also: ClassHistogramDCmd class
0
a61af66fc99e Initial load
duke
parents:
diff changeset
219 //
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // Input arguments :-
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // arg0: "-live" or "-all"
a61af66fc99e Initial load
duke
parents:
diff changeset
222 static jint heap_inspection(AttachOperation* op, outputStream* out) {
a61af66fc99e Initial load
duke
parents:
diff changeset
223 bool live_objects_only = true; // default is true to retain the behavior before this change is made
a61af66fc99e Initial load
duke
parents:
diff changeset
224 const char* arg0 = op->arg(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
225 if (arg0 != NULL && (strlen(arg0) > 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
226 if (strcmp(arg0, "-all") != 0 && strcmp(arg0, "-live") != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
227 out->print_cr("Invalid argument to inspectheap operation: %s", arg0);
a61af66fc99e Initial load
duke
parents:
diff changeset
228 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
230 live_objects_only = strcmp(arg0, "-live") == 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
231 }
615
c6c601a0f2d6 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 0
diff changeset
232 VM_GC_HeapInspection heapop(out, live_objects_only /* request full gc */, true /* need_prologue */);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
233 VMThread::execute(&heapop);
a61af66fc99e Initial load
duke
parents:
diff changeset
234 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
235 }
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // set a boolean global flag using value from AttachOperation
a61af66fc99e Initial load
duke
parents:
diff changeset
238 static jint set_bool_flag(const char* name, AttachOperation* op, outputStream* out) {
a61af66fc99e Initial load
duke
parents:
diff changeset
239 bool value = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
240 const char* arg1;
a61af66fc99e Initial load
duke
parents:
diff changeset
241 if ((arg1 = op->arg(1)) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
242 int tmp;
a61af66fc99e Initial load
duke
parents:
diff changeset
243 int n = sscanf(arg1, "%d", &tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
244 if (n != 1) {
1067
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
245 out->print_cr("flag value must be a boolean (1 or 0)");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
246 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
248 value = (tmp != 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
250 bool res = CommandLineFlags::boolAtPut((char*)name, &value, ATTACH_ON_DEMAND);
a61af66fc99e Initial load
duke
parents:
diff changeset
251 if (! res) {
a61af66fc99e Initial load
duke
parents:
diff changeset
252 out->print_cr("setting flag %s failed", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
254 return res? JNI_OK : JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257 // set a intx global flag using value from AttachOperation
a61af66fc99e Initial load
duke
parents:
diff changeset
258 static jint set_intx_flag(const char* name, AttachOperation* op, outputStream* out) {
a61af66fc99e Initial load
duke
parents:
diff changeset
259 intx value;
a61af66fc99e Initial load
duke
parents:
diff changeset
260 const char* arg1;
a61af66fc99e Initial load
duke
parents:
diff changeset
261 if ((arg1 = op->arg(1)) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
262 int n = sscanf(arg1, INTX_FORMAT, &value);
a61af66fc99e Initial load
duke
parents:
diff changeset
263 if (n != 1) {
1067
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
264 out->print_cr("flag value must be an integer");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
265 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
267 }
1067
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
268 bool res = CommandLineFlags::intxAtPut((char*)name, &value, ATTACH_ON_DEMAND);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
269 if (! res) {
a61af66fc99e Initial load
duke
parents:
diff changeset
270 out->print_cr("setting flag %s failed", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 return res? JNI_OK : JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
274 }
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // set a uintx global flag using value from AttachOperation
a61af66fc99e Initial load
duke
parents:
diff changeset
277 static jint set_uintx_flag(const char* name, AttachOperation* op, outputStream* out) {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 uintx value;
a61af66fc99e Initial load
duke
parents:
diff changeset
279 const char* arg1;
a61af66fc99e Initial load
duke
parents:
diff changeset
280 if ((arg1 = op->arg(1)) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 int n = sscanf(arg1, UINTX_FORMAT, &value);
a61af66fc99e Initial load
duke
parents:
diff changeset
282 if (n != 1) {
1067
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
283 out->print_cr("flag value must be an unsigned integer");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
284 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
1067
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
287 bool res = CommandLineFlags::uintxAtPut((char*)name, &value, ATTACH_ON_DEMAND);
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
288 if (! res) {
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
289 out->print_cr("setting flag %s failed", name);
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
290 }
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
291
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
292 return res? JNI_OK : JNI_ERR;
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
293 }
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
294
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
295 // set a uint64_t global flag using value from AttachOperation
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
296 static jint set_uint64_t_flag(const char* name, AttachOperation* op, outputStream* out) {
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
297 uint64_t value;
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
298 const char* arg1;
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
299 if ((arg1 = op->arg(1)) != NULL) {
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
300 int n = sscanf(arg1, UINT64_FORMAT, &value);
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
301 if (n != 1) {
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
302 out->print_cr("flag value must be an unsigned 64-bit integer");
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
303 return JNI_ERR;
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
304 }
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
305 }
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
306 bool res = CommandLineFlags::uint64_tAtPut((char*)name, &value, ATTACH_ON_DEMAND);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
307 if (! res) {
a61af66fc99e Initial load
duke
parents:
diff changeset
308 out->print_cr("setting flag %s failed", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311 return res? JNI_OK : JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 // set a string global flag using value from AttachOperation
a61af66fc99e Initial load
duke
parents:
diff changeset
315 static jint set_ccstr_flag(const char* name, AttachOperation* op, outputStream* out) {
a61af66fc99e Initial load
duke
parents:
diff changeset
316 const char* value;
a61af66fc99e Initial load
duke
parents:
diff changeset
317 if ((value = op->arg(1)) == NULL) {
1067
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
318 out->print_cr("flag value must be a string");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
319 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
320 }
1067
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
321 bool res = CommandLineFlags::ccstrAtPut((char*)name, &value, ATTACH_ON_DEMAND);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
322 if (res) {
a61af66fc99e Initial load
duke
parents:
diff changeset
323 FREE_C_HEAP_ARRAY(char, value);
a61af66fc99e Initial load
duke
parents:
diff changeset
324 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
325 out->print_cr("setting flag %s failed", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
327
a61af66fc99e Initial load
duke
parents:
diff changeset
328 return res? JNI_OK : JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
329 }
a61af66fc99e Initial load
duke
parents:
diff changeset
330
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // Implementation of "setflag" command
a61af66fc99e Initial load
duke
parents:
diff changeset
332 static jint set_flag(AttachOperation* op, outputStream* out) {
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334 const char* name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
335 if ((name = op->arg(0)) == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
336 out->print_cr("flag name is missing");
a61af66fc99e Initial load
duke
parents:
diff changeset
337 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
338 }
a61af66fc99e Initial load
duke
parents:
diff changeset
339
a61af66fc99e Initial load
duke
parents:
diff changeset
340 Flag* f = Flag::find_flag((char*)name, strlen(name));
a61af66fc99e Initial load
duke
parents:
diff changeset
341 if (f && f->is_external() && f->is_writeable()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
342 if (f->is_bool()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
343 return set_bool_flag(name, op, out);
a61af66fc99e Initial load
duke
parents:
diff changeset
344 } else if (f->is_intx()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
345 return set_intx_flag(name, op, out);
a61af66fc99e Initial load
duke
parents:
diff changeset
346 } else if (f->is_uintx()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
347 return set_uintx_flag(name, op, out);
1067
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
348 } else if (f->is_uint64_t()) {
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 615
diff changeset
349 return set_uint64_t_flag(name, op, out);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
350 } else if (f->is_ccstr()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
351 return set_ccstr_flag(name, op, out);
a61af66fc99e Initial load
duke
parents:
diff changeset
352 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
353 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
354 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
356 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
357 return AttachListener::pd_set_flag(op, out);
a61af66fc99e Initial load
duke
parents:
diff changeset
358 }
a61af66fc99e Initial load
duke
parents:
diff changeset
359 }
a61af66fc99e Initial load
duke
parents:
diff changeset
360
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // Implementation of "printflag" command
4773
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
362 // See also: PrintVMFlagsDCmd class
0
a61af66fc99e Initial load
duke
parents:
diff changeset
363 static jint print_flag(AttachOperation* op, outputStream* out) {
a61af66fc99e Initial load
duke
parents:
diff changeset
364 const char* name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
365 if ((name = op->arg(0)) == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
366 out->print_cr("flag name is missing");
a61af66fc99e Initial load
duke
parents:
diff changeset
367 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
369 Flag* f = Flag::find_flag((char*)name, strlen(name));
a61af66fc99e Initial load
duke
parents:
diff changeset
370 if (f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
371 f->print_as_flag(out);
a61af66fc99e Initial load
duke
parents:
diff changeset
372 out->print_cr("");
a61af66fc99e Initial load
duke
parents:
diff changeset
373 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
374 out->print_cr("no such flag '%s'", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
375 }
a61af66fc99e Initial load
duke
parents:
diff changeset
376 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
377 }
a61af66fc99e Initial load
duke
parents:
diff changeset
378
a61af66fc99e Initial load
duke
parents:
diff changeset
379 // Table to map operation names to functions.
a61af66fc99e Initial load
duke
parents:
diff changeset
380
a61af66fc99e Initial load
duke
parents:
diff changeset
381 // names must be of length <= AttachOperation::name_length_max
a61af66fc99e Initial load
duke
parents:
diff changeset
382 static AttachOperationFunctionInfo funcs[] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
383 { "agentProperties", get_agent_properties },
a61af66fc99e Initial load
duke
parents:
diff changeset
384 { "datadump", data_dump },
a61af66fc99e Initial load
duke
parents:
diff changeset
385 #ifndef SERVICES_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
386 { "dumpheap", dump_heap },
a61af66fc99e Initial load
duke
parents:
diff changeset
387 #endif // SERVICES_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
388 { "load", JvmtiExport::load_agent_library },
a61af66fc99e Initial load
duke
parents:
diff changeset
389 { "properties", get_system_properties },
a61af66fc99e Initial load
duke
parents:
diff changeset
390 { "threaddump", thread_dump },
a61af66fc99e Initial load
duke
parents:
diff changeset
391 { "inspectheap", heap_inspection },
a61af66fc99e Initial load
duke
parents:
diff changeset
392 { "setflag", set_flag },
a61af66fc99e Initial load
duke
parents:
diff changeset
393 { "printflag", print_flag },
4133
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents: 2426
diff changeset
394 { "jcmd", jcmd },
0
a61af66fc99e Initial load
duke
parents:
diff changeset
395 { NULL, NULL }
a61af66fc99e Initial load
duke
parents:
diff changeset
396 };
a61af66fc99e Initial load
duke
parents:
diff changeset
397
a61af66fc99e Initial load
duke
parents:
diff changeset
398
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // The Attach Listener threads services a queue. It dequeues an operation
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // from the queue, examines the operation name (command), and dispatches
a61af66fc99e Initial load
duke
parents:
diff changeset
402 // to the corresponding function to perform the operation.
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 static void attach_listener_thread_entry(JavaThread* thread, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
405 os::set_priority(thread, NearMaxPriority);
a61af66fc99e Initial load
duke
parents:
diff changeset
406
a61af66fc99e Initial load
duke
parents:
diff changeset
407 if (AttachListener::pd_init() != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
408 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
410 AttachListener::set_initialized();
a61af66fc99e Initial load
duke
parents:
diff changeset
411
a61af66fc99e Initial load
duke
parents:
diff changeset
412 for (;;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
413 AttachOperation* op = AttachListener::dequeue();
a61af66fc99e Initial load
duke
parents:
diff changeset
414 if (op == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
415 return; // dequeue failed or shutdown
a61af66fc99e Initial load
duke
parents:
diff changeset
416 }
a61af66fc99e Initial load
duke
parents:
diff changeset
417
a61af66fc99e Initial load
duke
parents:
diff changeset
418 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
419 bufferedStream st;
a61af66fc99e Initial load
duke
parents:
diff changeset
420 jint res = JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // handle special detachall operation
a61af66fc99e Initial load
duke
parents:
diff changeset
423 if (strcmp(op->name(), AttachOperation::detachall_operation_name()) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
424 AttachListener::detachall();
a61af66fc99e Initial load
duke
parents:
diff changeset
425 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // find the function to dispatch too
a61af66fc99e Initial load
duke
parents:
diff changeset
427 AttachOperationFunctionInfo* info = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
428 for (int i=0; funcs[i].name != NULL; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
429 const char* name = funcs[i].name;
a61af66fc99e Initial load
duke
parents:
diff changeset
430 assert(strlen(name) <= AttachOperation::name_length_max, "operation <= name_length_max");
a61af66fc99e Initial load
duke
parents:
diff changeset
431 if (strcmp(op->name(), name) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
432 info = &(funcs[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
433 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
435 }
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // check for platform dependent attach operation
a61af66fc99e Initial load
duke
parents:
diff changeset
438 if (info == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
439 info = AttachListener::pd_find_operation(op->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
440 }
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 if (info != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // dispatch to the function that implements this operation
a61af66fc99e Initial load
duke
parents:
diff changeset
444 res = (info->func)(op, &st);
a61af66fc99e Initial load
duke
parents:
diff changeset
445 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
446 st.print("Operation %s not recognized!", op->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
447 res = JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
448 }
a61af66fc99e Initial load
duke
parents:
diff changeset
449 }
a61af66fc99e Initial load
duke
parents:
diff changeset
450
a61af66fc99e Initial load
duke
parents:
diff changeset
451 // operation complete - send result and output to client
a61af66fc99e Initial load
duke
parents:
diff changeset
452 op->complete(res, &st);
a61af66fc99e Initial load
duke
parents:
diff changeset
453 }
a61af66fc99e Initial load
duke
parents:
diff changeset
454 }
a61af66fc99e Initial load
duke
parents:
diff changeset
455
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // Starts the Attach Listener thread
a61af66fc99e Initial load
duke
parents:
diff changeset
457 void AttachListener::init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
458 EXCEPTION_MARK;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
459 klassOop k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
460 instanceKlassHandle klass (THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
461 instanceHandle thread_oop = klass->allocate_instance_handle(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
462
a61af66fc99e Initial load
duke
parents:
diff changeset
463 const char thread_name[] = "Attach Listener";
a61af66fc99e Initial load
duke
parents:
diff changeset
464 Handle string = java_lang_String::create_from_str(thread_name, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466 // Initialize thread_oop to put it into the system threadGroup
a61af66fc99e Initial load
duke
parents:
diff changeset
467 Handle thread_group (THREAD, Universe::system_thread_group());
a61af66fc99e Initial load
duke
parents:
diff changeset
468 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
469 JavaCalls::call_special(&result, thread_oop,
a61af66fc99e Initial load
duke
parents:
diff changeset
470 klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
471 vmSymbols::object_initializer_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
472 vmSymbols::threadgroup_string_void_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
473 thread_group,
a61af66fc99e Initial load
duke
parents:
diff changeset
474 string,
a61af66fc99e Initial load
duke
parents:
diff changeset
475 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
476
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1067
diff changeset
477 KlassHandle group(THREAD, SystemDictionary::ThreadGroup_klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
478 JavaCalls::call_special(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
479 thread_group,
a61af66fc99e Initial load
duke
parents:
diff changeset
480 group,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
481 vmSymbols::add_method_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
482 vmSymbols::thread_void_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
483 thread_oop, // ARG 1
a61af66fc99e Initial load
duke
parents:
diff changeset
484 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
485
a61af66fc99e Initial load
duke
parents:
diff changeset
486 { MutexLocker mu(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
487 JavaThread* listener_thread = new JavaThread(&attach_listener_thread_entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
488
a61af66fc99e Initial load
duke
parents:
diff changeset
489 // Check that thread and osthread were created
a61af66fc99e Initial load
duke
parents:
diff changeset
490 if (listener_thread == NULL || listener_thread->osthread() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
491 vm_exit_during_initialization("java.lang.OutOfMemoryError",
a61af66fc99e Initial load
duke
parents:
diff changeset
492 "unable to create new native thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
493 }
a61af66fc99e Initial load
duke
parents:
diff changeset
494
a61af66fc99e Initial load
duke
parents:
diff changeset
495 java_lang_Thread::set_thread(thread_oop(), listener_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
496 java_lang_Thread::set_daemon(thread_oop());
a61af66fc99e Initial load
duke
parents:
diff changeset
497
a61af66fc99e Initial load
duke
parents:
diff changeset
498 listener_thread->set_threadObj(thread_oop());
a61af66fc99e Initial load
duke
parents:
diff changeset
499 Threads::add(listener_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
500 Thread::start(listener_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
501 }
a61af66fc99e Initial load
duke
parents:
diff changeset
502 }
a61af66fc99e Initial load
duke
parents:
diff changeset
503
a61af66fc99e Initial load
duke
parents:
diff changeset
504 // Performs clean-up tasks on platforms where we can detect that the last
a61af66fc99e Initial load
duke
parents:
diff changeset
505 // client has detached
a61af66fc99e Initial load
duke
parents:
diff changeset
506 void AttachListener::detachall() {
a61af66fc99e Initial load
duke
parents:
diff changeset
507 // call the platform dependent clean-up
a61af66fc99e Initial load
duke
parents:
diff changeset
508 pd_detachall();
a61af66fc99e Initial load
duke
parents:
diff changeset
509 }