annotate src/share/vm/prims/jvmtiEnv.cpp @ 3992:d1bdeef3e3e2

7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76 Summary: There is a race between one thread successfully forwarding and copying the klass mirror for the SoftReference class (including the static master clock) and another thread attempting to use the master clock while attempting to discover a soft reference object. Maintain a shadow copy of the soft reference master clock and use the shadow during reference discovery and reference processing. Reviewed-by: tonyp, brutisso, ysr
author johnc
date Wed, 12 Oct 2011 10:25:51 -0700
parents f08d439fab8c
children a6eef545f1a2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2019
diff changeset
2 * Copyright (c) 2003, 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: 1149
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1149
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: 1149
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: 1905
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
26 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
27 #include "classfile/vmSymbols.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
28 #include "interpreter/bytecodeStream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
29 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
30 #include "jvmtifiles/jvmtiEnv.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
31 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
32 #include "memory/universe.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
33 #include "oops/cpCacheOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
34 #include "oops/instanceKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
35 #include "prims/jniCheck.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
36 #include "prims/jvm_misc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
37 #include "prims/jvmtiAgentThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
38 #include "prims/jvmtiClassFileReconstituter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
39 #include "prims/jvmtiCodeBlobEvents.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
40 #include "prims/jvmtiExtensions.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
41 #include "prims/jvmtiGetLoadedClasses.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
42 #include "prims/jvmtiImpl.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
43 #include "prims/jvmtiManageCapabilities.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
44 #include "prims/jvmtiRawMonitor.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
45 #include "prims/jvmtiRedefineClasses.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
46 #include "prims/jvmtiTagMap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
47 #include "prims/jvmtiThreadState.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
48 #include "prims/jvmtiUtil.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
49 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
50 #include "runtime/deoptimization.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
51 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
52 #include "runtime/javaCalls.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
53 #include "runtime/jfieldIDWorkaround.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
54 #include "runtime/osThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
55 #include "runtime/reflectionUtils.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
56 #include "runtime/signature.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
57 #include "runtime/vframe.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
58 #include "runtime/vmThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
59 #include "services/threadService.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
60 #include "utilities/exceptions.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
61 #include "utilities/preserveException.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
62 #ifdef TARGET_OS_FAMILY_linux
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
63 # include "thread_linux.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
64 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
65 #ifdef TARGET_OS_FAMILY_solaris
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
66 # include "thread_solaris.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
67 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
68 #ifdef TARGET_OS_FAMILY_windows
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
69 # include "thread_windows.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
70 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3938
diff changeset
71 #ifdef TARGET_OS_FAMILY_bsd
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3938
diff changeset
72 # include "thread_bsd.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3938
diff changeset
73 #endif
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1905
diff changeset
74
0
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 #define FIXLATER 0 // REMOVE this when completed.
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // FIXLATER: hook into JvmtiTrace
a61af66fc99e Initial load
duke
parents:
diff changeset
80 #define TraceJVMTICalls false
a61af66fc99e Initial load
duke
parents:
diff changeset
81
1121
98cd9901c161 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1120
diff changeset
82 JvmtiEnv::JvmtiEnv(jint version) : JvmtiEnvBase(version) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
83 }
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 JvmtiEnv::~JvmtiEnv() {
a61af66fc99e Initial load
duke
parents:
diff changeset
86 }
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88 JvmtiEnv*
1121
98cd9901c161 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1120
diff changeset
89 JvmtiEnv::create_a_jvmti(jint version) {
98cd9901c161 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1120
diff changeset
90 return new JvmtiEnv(version);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
91 }
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // VM operation class to copy jni function table at safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // More than one java threads or jvmti agents may be reading/
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // modifying jni function tables. To reduce the risk of bad
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // interaction b/w these threads it is copied at safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
97 class VM_JNIFunctionTableCopier : public VM_Operation {
a61af66fc99e Initial load
duke
parents:
diff changeset
98 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
99 const struct JNINativeInterface_ *_function_table;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
101 VM_JNIFunctionTableCopier(const struct JNINativeInterface_ *func_tbl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 _function_table = func_tbl;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 };
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 VMOp_Type type() const { return VMOp_JNIFunctionTableCopier; }
a61af66fc99e Initial load
duke
parents:
diff changeset
106 void doit() {
a61af66fc99e Initial load
duke
parents:
diff changeset
107 copy_jni_function_table(_function_table);
a61af66fc99e Initial load
duke
parents:
diff changeset
108 };
a61af66fc99e Initial load
duke
parents:
diff changeset
109 };
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111 //
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // Do not change the "prefix" marker below, everything above it is copied
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // unchanged into the filled stub, everything below is controlled by the
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // stub filler (only method bodies are carried forward, and then only for
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // functionality still in the spec).
a61af66fc99e Initial load
duke
parents:
diff changeset
116 //
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // end file prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 //
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // Memory Management functions
a61af66fc99e Initial load
duke
parents:
diff changeset
121 //
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // mem_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
124 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
125 JvmtiEnv::Allocate(jlong size, unsigned char** mem_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
126 return allocate(size, mem_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
127 } /* end Allocate */
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // mem - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
131 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
132 JvmtiEnv::Deallocate(unsigned char* mem) {
a61af66fc99e Initial load
duke
parents:
diff changeset
133 return deallocate(mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
134 } /* end Deallocate */
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
137 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // data - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
139 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
140 JvmtiEnv::SetThreadLocalStorage(JavaThread* java_thread, const void* data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
141 JvmtiThreadState* state = java_thread->jvmti_thread_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
142 if (state == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 if (data == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // leaving state unset same as data set to NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
145 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // otherwise, create the state
a61af66fc99e Initial load
duke
parents:
diff changeset
148 state = JvmtiThreadState::state_for(java_thread);
609
ea20d7ce26b0 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 0
diff changeset
149 if (state == NULL) {
ea20d7ce26b0 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 0
diff changeset
150 return JVMTI_ERROR_THREAD_NOT_ALIVE;
ea20d7ce26b0 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 0
diff changeset
151 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
153 state->env_thread_state(this)->set_agent_thread_local_storage_data((void*)data);
a61af66fc99e Initial load
duke
parents:
diff changeset
154 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
155 } /* end SetThreadLocalStorage */
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // Threads_lock NOT held
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // thread - NOT pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // data_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
161 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
162 JvmtiEnv::GetThreadLocalStorage(jthread thread, void** data_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
163 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
164 if (thread == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
165 JvmtiThreadState* state = current_thread->jvmti_thread_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
166 *data_ptr = (state == NULL) ? NULL :
a61af66fc99e Initial load
duke
parents:
diff changeset
167 state->env_thread_state(this)->get_agent_thread_local_storage_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
168 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // jvmti_GetThreadLocalStorage is "in native" and doesn't transition
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // the thread to _thread_in_vm. However, when the TLS for a thread
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // other than the current thread is required we need to transition
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // from native so as to resolve the jthread.
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 ThreadInVMfromNative __tiv(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
176 __ENTRY(jvmtiError, JvmtiEnv::GetThreadLocalStorage , current_thread)
a61af66fc99e Initial load
duke
parents:
diff changeset
177 debug_only(VMNativeEntryWrapper __vew;)
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179 oop thread_oop = JNIHandles::resolve_external_guard(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
180 if (thread_oop == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
181 return JVMTI_ERROR_INVALID_THREAD;
a61af66fc99e Initial load
duke
parents:
diff changeset
182 }
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 609
diff changeset
183 if (!thread_oop->is_a(SystemDictionary::Thread_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
184 return JVMTI_ERROR_INVALID_THREAD;
a61af66fc99e Initial load
duke
parents:
diff changeset
185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
186 JavaThread* java_thread = java_lang_Thread::thread(thread_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
187 if (java_thread == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
188 return JVMTI_ERROR_THREAD_NOT_ALIVE;
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190 JvmtiThreadState* state = java_thread->jvmti_thread_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
191 *data_ptr = (state == NULL) ? NULL :
a61af66fc99e Initial load
duke
parents:
diff changeset
192 state->env_thread_state(this)->get_agent_thread_local_storage_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
194 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
195 } /* end GetThreadLocalStorage */
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 //
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // Class functions
a61af66fc99e Initial load
duke
parents:
diff changeset
199 //
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // class_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // classes_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
203 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
204 JvmtiEnv::GetLoadedClasses(jint* class_count_ptr, jclass** classes_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
205 return JvmtiGetLoadedClasses::getLoadedClasses(this, class_count_ptr, classes_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
206 } /* end GetLoadedClasses */
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // initiating_loader - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // class_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // classes_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
212 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
213 JvmtiEnv::GetClassLoaderClasses(jobject initiating_loader, jint* class_count_ptr, jclass** classes_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 return JvmtiGetLoadedClasses::getClassLoaderClasses(this, initiating_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
215 class_count_ptr, classes_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
216 } /* end GetClassLoaderClasses */
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // k_mirror - may be primitive, this must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // is_modifiable_class_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
220 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
221 JvmtiEnv::IsModifiableClass(oop k_mirror, jboolean* is_modifiable_class_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
222 *is_modifiable_class_ptr = VM_RedefineClasses::is_modifiable_class(k_mirror)?
a61af66fc99e Initial load
duke
parents:
diff changeset
223 JNI_TRUE : JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
224 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
225 } /* end IsModifiableClass */
a61af66fc99e Initial load
duke
parents:
diff changeset
226
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // class_count - pre-checked to be greater than or equal to 0
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // classes - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
229 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
230 JvmtiEnv::RetransformClasses(jint class_count, const jclass* classes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
231 //TODO: add locking
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 int index;
a61af66fc99e Initial load
duke
parents:
diff changeset
234 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
235 ResourceMark rm(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237 jvmtiClassDefinition* class_definitions =
a61af66fc99e Initial load
duke
parents:
diff changeset
238 NEW_RESOURCE_ARRAY(jvmtiClassDefinition, class_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
239 NULL_CHECK(class_definitions, JVMTI_ERROR_OUT_OF_MEMORY);
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 for (index = 0; index < class_count; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
242 HandleMark hm(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
243
a61af66fc99e Initial load
duke
parents:
diff changeset
244 jclass jcls = classes[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
245 oop k_mirror = JNIHandles::resolve_external_guard(jcls);
a61af66fc99e Initial load
duke
parents:
diff changeset
246 if (k_mirror == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
247 return JVMTI_ERROR_INVALID_CLASS;
a61af66fc99e Initial load
duke
parents:
diff changeset
248 }
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 609
diff changeset
249 if (!k_mirror->is_a(SystemDictionary::Class_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
250 return JVMTI_ERROR_INVALID_CLASS;
a61af66fc99e Initial load
duke
parents:
diff changeset
251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253 if (java_lang_Class::is_primitive(k_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
254 return JVMTI_ERROR_UNMODIFIABLE_CLASS;
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257 klassOop k_oop = java_lang_Class::as_klassOop(k_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
258 KlassHandle klass(current_thread, k_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260 jint status = klass->jvmti_class_status();
a61af66fc99e Initial load
duke
parents:
diff changeset
261 if (status & (JVMTI_CLASS_STATUS_ERROR)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
262 return JVMTI_ERROR_INVALID_CLASS;
a61af66fc99e Initial load
duke
parents:
diff changeset
263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
264 if (status & (JVMTI_CLASS_STATUS_ARRAY)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
265 return JVMTI_ERROR_UNMODIFIABLE_CLASS;
a61af66fc99e Initial load
duke
parents:
diff changeset
266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 instanceKlassHandle ikh(current_thread, k_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
269 if (ikh->get_cached_class_file_bytes() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // not cached, we need to reconstitute the class file from VM representation
a61af66fc99e Initial load
duke
parents:
diff changeset
271 constantPoolHandle constants(current_thread, ikh->constants());
a61af66fc99e Initial load
duke
parents:
diff changeset
272 ObjectLocker ol(constants, current_thread); // lock constant pool while we query it
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 JvmtiClassFileReconstituter reconstituter(ikh);
a61af66fc99e Initial load
duke
parents:
diff changeset
275 if (reconstituter.get_error() != JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
276 return reconstituter.get_error();
a61af66fc99e Initial load
duke
parents:
diff changeset
277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 class_definitions[index].class_byte_count = (jint)reconstituter.class_file_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
280 class_definitions[index].class_bytes = (unsigned char*)
a61af66fc99e Initial load
duke
parents:
diff changeset
281 reconstituter.class_file_bytes();
a61af66fc99e Initial load
duke
parents:
diff changeset
282 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // it is cached, get it from the cache
a61af66fc99e Initial load
duke
parents:
diff changeset
284 class_definitions[index].class_byte_count = ikh->get_cached_class_file_len();
a61af66fc99e Initial load
duke
parents:
diff changeset
285 class_definitions[index].class_bytes = ikh->get_cached_class_file_bytes();
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
287 class_definitions[index].klass = jcls;
a61af66fc99e Initial load
duke
parents:
diff changeset
288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
289 VM_RedefineClasses op(class_count, class_definitions, jvmti_class_load_kind_retransform);
a61af66fc99e Initial load
duke
parents:
diff changeset
290 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
291 return (op.check_error());
a61af66fc99e Initial load
duke
parents:
diff changeset
292 } /* end RetransformClasses */
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // class_count - pre-checked to be greater than or equal to 0
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // class_definitions - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
297 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
298 JvmtiEnv::RedefineClasses(jint class_count, const jvmtiClassDefinition* class_definitions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
299 //TODO: add locking
a61af66fc99e Initial load
duke
parents:
diff changeset
300 VM_RedefineClasses op(class_count, class_definitions, jvmti_class_load_kind_redefine);
a61af66fc99e Initial load
duke
parents:
diff changeset
301 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
302 return (op.check_error());
a61af66fc99e Initial load
duke
parents:
diff changeset
303 } /* end RedefineClasses */
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306 //
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // Object functions
a61af66fc99e Initial load
duke
parents:
diff changeset
308 //
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // size_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
311 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
312 JvmtiEnv::GetObjectSize(jobject object, jlong* size_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
313 oop mirror = JNIHandles::resolve_external_guard(object);
a61af66fc99e Initial load
duke
parents:
diff changeset
314 NULL_CHECK(mirror, JVMTI_ERROR_INVALID_OBJECT);
a61af66fc99e Initial load
duke
parents:
diff changeset
315
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 609
diff changeset
316 if (mirror->klass() == SystemDictionary::Class_klass()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
317 if (!java_lang_Class::is_primitive(mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
318 mirror = java_lang_Class::as_klassOop(mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
319 assert(mirror != NULL, "class for non-primitive mirror must exist");
a61af66fc99e Initial load
duke
parents:
diff changeset
320 }
a61af66fc99e Initial load
duke
parents:
diff changeset
321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
322
a61af66fc99e Initial load
duke
parents:
diff changeset
323 *size_ptr = mirror->size() * wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
324 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
325 } /* end GetObjectSize */
a61af66fc99e Initial load
duke
parents:
diff changeset
326
a61af66fc99e Initial load
duke
parents:
diff changeset
327 //
a61af66fc99e Initial load
duke
parents:
diff changeset
328 // Method functions
a61af66fc99e Initial load
duke
parents:
diff changeset
329 //
a61af66fc99e Initial load
duke
parents:
diff changeset
330
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // prefix - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
332 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
333 JvmtiEnv::SetNativeMethodPrefix(const char* prefix) {
a61af66fc99e Initial load
duke
parents:
diff changeset
334 return prefix == NULL?
a61af66fc99e Initial load
duke
parents:
diff changeset
335 SetNativeMethodPrefixes(0, NULL) :
a61af66fc99e Initial load
duke
parents:
diff changeset
336 SetNativeMethodPrefixes(1, (char**)&prefix);
a61af66fc99e Initial load
duke
parents:
diff changeset
337 } /* end SetNativeMethodPrefix */
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339
a61af66fc99e Initial load
duke
parents:
diff changeset
340 // prefix_count - pre-checked to be greater than or equal to 0
a61af66fc99e Initial load
duke
parents:
diff changeset
341 // prefixes - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
342 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
343 JvmtiEnv::SetNativeMethodPrefixes(jint prefix_count, char** prefixes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
344 // Have to grab JVMTI thread state lock to be sure that some thread
a61af66fc99e Initial load
duke
parents:
diff changeset
345 // isn't accessing the prefixes at the same time we are setting them.
a61af66fc99e Initial load
duke
parents:
diff changeset
346 // No locks during VM bring-up.
a61af66fc99e Initial load
duke
parents:
diff changeset
347 if (Threads::number_of_threads() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
348 return set_native_method_prefixes(prefix_count, prefixes);
a61af66fc99e Initial load
duke
parents:
diff changeset
349 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
350 MutexLocker mu(JvmtiThreadState_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
351 return set_native_method_prefixes(prefix_count, prefixes);
a61af66fc99e Initial load
duke
parents:
diff changeset
352 }
a61af66fc99e Initial load
duke
parents:
diff changeset
353 } /* end SetNativeMethodPrefixes */
a61af66fc99e Initial load
duke
parents:
diff changeset
354
a61af66fc99e Initial load
duke
parents:
diff changeset
355 //
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // Event Management functions
a61af66fc99e Initial load
duke
parents:
diff changeset
357 //
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // callbacks - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
360 // size_of_callbacks - pre-checked to be greater than or equal to 0
a61af66fc99e Initial load
duke
parents:
diff changeset
361 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
362 JvmtiEnv::SetEventCallbacks(const jvmtiEventCallbacks* callbacks, jint size_of_callbacks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
363 JvmtiEventController::set_event_callbacks(this, callbacks, size_of_callbacks);
a61af66fc99e Initial load
duke
parents:
diff changeset
364 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
365 } /* end SetEventCallbacks */
a61af66fc99e Initial load
duke
parents:
diff changeset
366
a61af66fc99e Initial load
duke
parents:
diff changeset
367
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // event_thread - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
369 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
370 JvmtiEnv::SetEventNotificationMode(jvmtiEventMode mode, jvmtiEvent event_type, jthread event_thread, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
371 JavaThread* java_thread = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
372 if (event_thread != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
373 oop thread_oop = JNIHandles::resolve_external_guard(event_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
374 if (thread_oop == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
375 return JVMTI_ERROR_INVALID_THREAD;
a61af66fc99e Initial load
duke
parents:
diff changeset
376 }
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 609
diff changeset
377 if (!thread_oop->is_a(SystemDictionary::Thread_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
378 return JVMTI_ERROR_INVALID_THREAD;
a61af66fc99e Initial load
duke
parents:
diff changeset
379 }
a61af66fc99e Initial load
duke
parents:
diff changeset
380 java_thread = java_lang_Thread::thread(thread_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
381 if (java_thread == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
382 return JVMTI_ERROR_THREAD_NOT_ALIVE;
a61af66fc99e Initial load
duke
parents:
diff changeset
383 }
a61af66fc99e Initial load
duke
parents:
diff changeset
384 }
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // event_type must be valid
a61af66fc99e Initial load
duke
parents:
diff changeset
387 if (!JvmtiEventController::is_valid_event_type(event_type)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
388 return JVMTI_ERROR_INVALID_EVENT_TYPE;
a61af66fc99e Initial load
duke
parents:
diff changeset
389 }
a61af66fc99e Initial load
duke
parents:
diff changeset
390
a61af66fc99e Initial load
duke
parents:
diff changeset
391 // global events cannot be controlled at thread level.
a61af66fc99e Initial load
duke
parents:
diff changeset
392 if (java_thread != NULL && JvmtiEventController::is_global_event(event_type)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
393 return JVMTI_ERROR_ILLEGAL_ARGUMENT;
a61af66fc99e Initial load
duke
parents:
diff changeset
394 }
a61af66fc99e Initial load
duke
parents:
diff changeset
395
a61af66fc99e Initial load
duke
parents:
diff changeset
396 bool enabled = (mode == JVMTI_ENABLE);
a61af66fc99e Initial load
duke
parents:
diff changeset
397
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // assure that needed capabilities are present
a61af66fc99e Initial load
duke
parents:
diff changeset
399 if (enabled && !JvmtiUtil::has_event_capability(event_type, get_capabilities())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
400 return JVMTI_ERROR_MUST_POSSESS_CAPABILITY;
a61af66fc99e Initial load
duke
parents:
diff changeset
401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
402
a61af66fc99e Initial load
duke
parents:
diff changeset
403 if (event_type == JVMTI_EVENT_CLASS_FILE_LOAD_HOOK && enabled) {
a61af66fc99e Initial load
duke
parents:
diff changeset
404 record_class_file_load_hook_enabled();
a61af66fc99e Initial load
duke
parents:
diff changeset
405 }
a61af66fc99e Initial load
duke
parents:
diff changeset
406 JvmtiEventController::set_user_enabled(this, java_thread, event_type, enabled);
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
409 } /* end SetEventNotificationMode */
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 //
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // Capability functions
a61af66fc99e Initial load
duke
parents:
diff changeset
413 //
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // capabilities_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
416 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
417 JvmtiEnv::GetPotentialCapabilities(jvmtiCapabilities* capabilities_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
418 JvmtiManageCapabilities::get_potential_capabilities(get_capabilities(),
a61af66fc99e Initial load
duke
parents:
diff changeset
419 get_prohibited_capabilities(),
a61af66fc99e Initial load
duke
parents:
diff changeset
420 capabilities_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
421 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
422 } /* end GetPotentialCapabilities */
a61af66fc99e Initial load
duke
parents:
diff changeset
423
a61af66fc99e Initial load
duke
parents:
diff changeset
424
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // capabilities_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
426 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
427 JvmtiEnv::AddCapabilities(const jvmtiCapabilities* capabilities_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
428 return JvmtiManageCapabilities::add_capabilities(get_capabilities(),
a61af66fc99e Initial load
duke
parents:
diff changeset
429 get_prohibited_capabilities(),
a61af66fc99e Initial load
duke
parents:
diff changeset
430 capabilities_ptr,
a61af66fc99e Initial load
duke
parents:
diff changeset
431 get_capabilities());
a61af66fc99e Initial load
duke
parents:
diff changeset
432 } /* end AddCapabilities */
a61af66fc99e Initial load
duke
parents:
diff changeset
433
a61af66fc99e Initial load
duke
parents:
diff changeset
434
a61af66fc99e Initial load
duke
parents:
diff changeset
435 // capabilities_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
436 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
437 JvmtiEnv::RelinquishCapabilities(const jvmtiCapabilities* capabilities_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
438 JvmtiManageCapabilities::relinquish_capabilities(get_capabilities(), capabilities_ptr, get_capabilities());
a61af66fc99e Initial load
duke
parents:
diff changeset
439 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
440 } /* end RelinquishCapabilities */
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // capabilities_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
444 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
445 JvmtiEnv::GetCapabilities(jvmtiCapabilities* capabilities_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
446 JvmtiManageCapabilities::copy_capabilities(get_capabilities(), capabilities_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
447 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
448 } /* end GetCapabilities */
a61af66fc99e Initial load
duke
parents:
diff changeset
449
a61af66fc99e Initial load
duke
parents:
diff changeset
450 //
a61af66fc99e Initial load
duke
parents:
diff changeset
451 // Class Loader Search functions
a61af66fc99e Initial load
duke
parents:
diff changeset
452 //
a61af66fc99e Initial load
duke
parents:
diff changeset
453
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // segment - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
455 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
456 JvmtiEnv::AddToBootstrapClassLoaderSearch(const char* segment) {
a61af66fc99e Initial load
duke
parents:
diff changeset
457 jvmtiPhase phase = get_phase();
a61af66fc99e Initial load
duke
parents:
diff changeset
458 if (phase == JVMTI_PHASE_ONLOAD) {
a61af66fc99e Initial load
duke
parents:
diff changeset
459 Arguments::append_sysclasspath(segment);
a61af66fc99e Initial load
duke
parents:
diff changeset
460 return JVMTI_ERROR_NONE;
1121
98cd9901c161 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1120
diff changeset
461 } else if (use_version_1_0_semantics()) {
98cd9901c161 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1120
diff changeset
462 // This JvmtiEnv requested version 1.0 semantics and this function
98cd9901c161 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1120
diff changeset
463 // is only allowed in the ONLOAD phase in version 1.0 so we need to
98cd9901c161 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1120
diff changeset
464 // return an error here.
98cd9901c161 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1120
diff changeset
465 return JVMTI_ERROR_WRONG_PHASE;
1120
9127aa69352e 6648438: 4/4 src/share/vm/prims/jvmtiEnv.cpp:457 assert(phase == JVMTI_PHASE_LIVE,"sanity check")
dcubed
parents: 0
diff changeset
466 } else if (phase == JVMTI_PHASE_LIVE) {
9127aa69352e 6648438: 4/4 src/share/vm/prims/jvmtiEnv.cpp:457 assert(phase == JVMTI_PHASE_LIVE,"sanity check")
dcubed
parents: 0
diff changeset
467 // The phase is checked by the wrapper that called this function,
9127aa69352e 6648438: 4/4 src/share/vm/prims/jvmtiEnv.cpp:457 assert(phase == JVMTI_PHASE_LIVE,"sanity check")
dcubed
parents: 0
diff changeset
468 // but this thread could be racing with the thread that is
9127aa69352e 6648438: 4/4 src/share/vm/prims/jvmtiEnv.cpp:457 assert(phase == JVMTI_PHASE_LIVE,"sanity check")
dcubed
parents: 0
diff changeset
469 // terminating the VM so we check one more time.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471 // create the zip entry
a61af66fc99e Initial load
duke
parents:
diff changeset
472 ClassPathZipEntry* zip_entry = ClassLoader::create_class_path_zip_entry(segment);
a61af66fc99e Initial load
duke
parents:
diff changeset
473 if (zip_entry == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
474 return JVMTI_ERROR_ILLEGAL_ARGUMENT;
a61af66fc99e Initial load
duke
parents:
diff changeset
475 }
a61af66fc99e Initial load
duke
parents:
diff changeset
476
a61af66fc99e Initial load
duke
parents:
diff changeset
477 // lock the loader
a61af66fc99e Initial load
duke
parents:
diff changeset
478 Thread* thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
479 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
480 Handle loader_lock = Handle(thread, SystemDictionary::system_loader_lock());
a61af66fc99e Initial load
duke
parents:
diff changeset
481
a61af66fc99e Initial load
duke
parents:
diff changeset
482 ObjectLocker ol(loader_lock, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
483
a61af66fc99e Initial load
duke
parents:
diff changeset
484 // add the jar file to the bootclasspath
a61af66fc99e Initial load
duke
parents:
diff changeset
485 if (TraceClassLoading) {
a61af66fc99e Initial load
duke
parents:
diff changeset
486 tty->print_cr("[Opened %s]", zip_entry->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
487 }
a61af66fc99e Initial load
duke
parents:
diff changeset
488 ClassLoader::add_to_list(zip_entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
489 return JVMTI_ERROR_NONE;
1120
9127aa69352e 6648438: 4/4 src/share/vm/prims/jvmtiEnv.cpp:457 assert(phase == JVMTI_PHASE_LIVE,"sanity check")
dcubed
parents: 0
diff changeset
490 } else {
9127aa69352e 6648438: 4/4 src/share/vm/prims/jvmtiEnv.cpp:457 assert(phase == JVMTI_PHASE_LIVE,"sanity check")
dcubed
parents: 0
diff changeset
491 return JVMTI_ERROR_WRONG_PHASE;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
493
a61af66fc99e Initial load
duke
parents:
diff changeset
494 } /* end AddToBootstrapClassLoaderSearch */
a61af66fc99e Initial load
duke
parents:
diff changeset
495
a61af66fc99e Initial load
duke
parents:
diff changeset
496
a61af66fc99e Initial load
duke
parents:
diff changeset
497 // segment - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
498 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
499 JvmtiEnv::AddToSystemClassLoaderSearch(const char* segment) {
a61af66fc99e Initial load
duke
parents:
diff changeset
500 jvmtiPhase phase = get_phase();
a61af66fc99e Initial load
duke
parents:
diff changeset
501
a61af66fc99e Initial load
duke
parents:
diff changeset
502 if (phase == JVMTI_PHASE_ONLOAD) {
a61af66fc99e Initial load
duke
parents:
diff changeset
503 for (SystemProperty* p = Arguments::system_properties(); p != NULL; p = p->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
504 if (strcmp("java.class.path", p->key()) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
505 p->append_value(segment);
a61af66fc99e Initial load
duke
parents:
diff changeset
506 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
507 }
a61af66fc99e Initial load
duke
parents:
diff changeset
508 }
a61af66fc99e Initial load
duke
parents:
diff changeset
509 return JVMTI_ERROR_NONE;
1120
9127aa69352e 6648438: 4/4 src/share/vm/prims/jvmtiEnv.cpp:457 assert(phase == JVMTI_PHASE_LIVE,"sanity check")
dcubed
parents: 0
diff changeset
510 } else if (phase == JVMTI_PHASE_LIVE) {
9127aa69352e 6648438: 4/4 src/share/vm/prims/jvmtiEnv.cpp:457 assert(phase == JVMTI_PHASE_LIVE,"sanity check")
dcubed
parents: 0
diff changeset
511 // The phase is checked by the wrapper that called this function,
9127aa69352e 6648438: 4/4 src/share/vm/prims/jvmtiEnv.cpp:457 assert(phase == JVMTI_PHASE_LIVE,"sanity check")
dcubed
parents: 0
diff changeset
512 // but this thread could be racing with the thread that is
9127aa69352e 6648438: 4/4 src/share/vm/prims/jvmtiEnv.cpp:457 assert(phase == JVMTI_PHASE_LIVE,"sanity check")
dcubed
parents: 0
diff changeset
513 // terminating the VM so we check one more time.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
514 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // create the zip entry (which will open the zip file and hence
a61af66fc99e Initial load
duke
parents:
diff changeset
517 // check that the segment is indeed a zip file).
a61af66fc99e Initial load
duke
parents:
diff changeset
518 ClassPathZipEntry* zip_entry = ClassLoader::create_class_path_zip_entry(segment);
a61af66fc99e Initial load
duke
parents:
diff changeset
519 if (zip_entry == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
520 return JVMTI_ERROR_ILLEGAL_ARGUMENT;
a61af66fc99e Initial load
duke
parents:
diff changeset
521 }
a61af66fc99e Initial load
duke
parents:
diff changeset
522 delete zip_entry; // no longer needed
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 // lock the loader
a61af66fc99e Initial load
duke
parents:
diff changeset
525 Thread* THREAD = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
526 Handle loader = Handle(THREAD, SystemDictionary::java_system_loader());
a61af66fc99e Initial load
duke
parents:
diff changeset
527
a61af66fc99e Initial load
duke
parents:
diff changeset
528 ObjectLocker ol(loader, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 // need the path as java.lang.String
3246
fcc932c8238c 7007254: NullPointerException occurs with jvisualvm placed under a dir. including Japanese chars
thurka
parents: 2177
diff changeset
531 Handle path = java_lang_String::create_from_platform_dependent_str(segment, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
532 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
533 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
534 return JVMTI_ERROR_INTERNAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
536
a61af66fc99e Initial load
duke
parents:
diff changeset
537 instanceKlassHandle loader_ik(THREAD, loader->klass());
a61af66fc99e Initial load
duke
parents:
diff changeset
538
a61af66fc99e Initial load
duke
parents:
diff changeset
539 // Invoke the appendToClassPathForInstrumentation method - if the method
a61af66fc99e Initial load
duke
parents:
diff changeset
540 // is not found it means the loader doesn't support adding to the class path
a61af66fc99e Initial load
duke
parents:
diff changeset
541 // in the live phase.
a61af66fc99e Initial load
duke
parents:
diff changeset
542 {
a61af66fc99e Initial load
duke
parents:
diff changeset
543 JavaValue res(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
544 JavaCalls::call_special(&res,
a61af66fc99e Initial load
duke
parents:
diff changeset
545 loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
546 loader_ik,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2100
diff changeset
547 vmSymbols::appendToClassPathForInstrumentation_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2100
diff changeset
548 vmSymbols::appendToClassPathForInstrumentation_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
549 path,
a61af66fc99e Initial load
duke
parents:
diff changeset
550 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
551 if (HAS_PENDING_EXCEPTION) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2100
diff changeset
552 Symbol* ex_name = PENDING_EXCEPTION->klass()->klass_part()->name();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
553 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
554
a61af66fc99e Initial load
duke
parents:
diff changeset
555 if (ex_name == vmSymbols::java_lang_NoSuchMethodError()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
556 return JVMTI_ERROR_CLASS_LOADER_UNSUPPORTED;
a61af66fc99e Initial load
duke
parents:
diff changeset
557 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
558 return JVMTI_ERROR_INTERNAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
559 }
a61af66fc99e Initial load
duke
parents:
diff changeset
560 }
a61af66fc99e Initial load
duke
parents:
diff changeset
561 }
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563 return JVMTI_ERROR_NONE;
1120
9127aa69352e 6648438: 4/4 src/share/vm/prims/jvmtiEnv.cpp:457 assert(phase == JVMTI_PHASE_LIVE,"sanity check")
dcubed
parents: 0
diff changeset
564 } else {
9127aa69352e 6648438: 4/4 src/share/vm/prims/jvmtiEnv.cpp:457 assert(phase == JVMTI_PHASE_LIVE,"sanity check")
dcubed
parents: 0
diff changeset
565 return JVMTI_ERROR_WRONG_PHASE;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
566 }
a61af66fc99e Initial load
duke
parents:
diff changeset
567 } /* end AddToSystemClassLoaderSearch */
a61af66fc99e Initial load
duke
parents:
diff changeset
568
a61af66fc99e Initial load
duke
parents:
diff changeset
569 //
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // General functions
a61af66fc99e Initial load
duke
parents:
diff changeset
571 //
a61af66fc99e Initial load
duke
parents:
diff changeset
572
a61af66fc99e Initial load
duke
parents:
diff changeset
573 // phase_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
574 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
575 JvmtiEnv::GetPhase(jvmtiPhase* phase_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
576 *phase_ptr = get_phase();
a61af66fc99e Initial load
duke
parents:
diff changeset
577 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
578 } /* end GetPhase */
a61af66fc99e Initial load
duke
parents:
diff changeset
579
a61af66fc99e Initial load
duke
parents:
diff changeset
580
a61af66fc99e Initial load
duke
parents:
diff changeset
581 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
582 JvmtiEnv::DisposeEnvironment() {
a61af66fc99e Initial load
duke
parents:
diff changeset
583 dispose();
a61af66fc99e Initial load
duke
parents:
diff changeset
584 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
585 } /* end DisposeEnvironment */
a61af66fc99e Initial load
duke
parents:
diff changeset
586
a61af66fc99e Initial load
duke
parents:
diff changeset
587
a61af66fc99e Initial load
duke
parents:
diff changeset
588 // data - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
589 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
590 JvmtiEnv::SetEnvironmentLocalStorage(const void* data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
591 set_env_local_storage(data);
a61af66fc99e Initial load
duke
parents:
diff changeset
592 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
593 } /* end SetEnvironmentLocalStorage */
a61af66fc99e Initial load
duke
parents:
diff changeset
594
a61af66fc99e Initial load
duke
parents:
diff changeset
595
a61af66fc99e Initial load
duke
parents:
diff changeset
596 // data_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
597 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
598 JvmtiEnv::GetEnvironmentLocalStorage(void** data_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
599 *data_ptr = (void*)get_env_local_storage();
a61af66fc99e Initial load
duke
parents:
diff changeset
600 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
601 } /* end GetEnvironmentLocalStorage */
a61af66fc99e Initial load
duke
parents:
diff changeset
602
a61af66fc99e Initial load
duke
parents:
diff changeset
603 // version_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
604 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
605 JvmtiEnv::GetVersionNumber(jint* version_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
606 *version_ptr = JVMTI_VERSION;
a61af66fc99e Initial load
duke
parents:
diff changeset
607 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
608 } /* end GetVersionNumber */
a61af66fc99e Initial load
duke
parents:
diff changeset
609
a61af66fc99e Initial load
duke
parents:
diff changeset
610
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // name_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
612 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
613 JvmtiEnv::GetErrorName(jvmtiError error, char** name_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
614 if (error < JVMTI_ERROR_NONE || error > JVMTI_ERROR_MAX) {
a61af66fc99e Initial load
duke
parents:
diff changeset
615 return JVMTI_ERROR_ILLEGAL_ARGUMENT;
a61af66fc99e Initial load
duke
parents:
diff changeset
616 }
a61af66fc99e Initial load
duke
parents:
diff changeset
617 const char *name = JvmtiUtil::error_name(error);
a61af66fc99e Initial load
duke
parents:
diff changeset
618 if (name == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
619 return JVMTI_ERROR_ILLEGAL_ARGUMENT;
a61af66fc99e Initial load
duke
parents:
diff changeset
620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
621 size_t len = strlen(name) + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
622 jvmtiError err = allocate(len, (unsigned char**)name_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
623 if (err == JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
624 memcpy(*name_ptr, name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
625 }
a61af66fc99e Initial load
duke
parents:
diff changeset
626 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
627 } /* end GetErrorName */
a61af66fc99e Initial load
duke
parents:
diff changeset
628
a61af66fc99e Initial load
duke
parents:
diff changeset
629
a61af66fc99e Initial load
duke
parents:
diff changeset
630 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
631 JvmtiEnv::SetVerboseFlag(jvmtiVerboseFlag flag, jboolean value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
632 switch (flag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
633 case JVMTI_VERBOSE_OTHER:
a61af66fc99e Initial load
duke
parents:
diff changeset
634 // ignore
a61af66fc99e Initial load
duke
parents:
diff changeset
635 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
636 case JVMTI_VERBOSE_CLASS:
a61af66fc99e Initial load
duke
parents:
diff changeset
637 TraceClassLoading = value != 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
638 TraceClassUnloading = value != 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
639 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
640 case JVMTI_VERBOSE_GC:
a61af66fc99e Initial load
duke
parents:
diff changeset
641 PrintGC = value != 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
642 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
643 case JVMTI_VERBOSE_JNI:
a61af66fc99e Initial load
duke
parents:
diff changeset
644 PrintJNIResolving = value != 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
645 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
646 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
647 return JVMTI_ERROR_ILLEGAL_ARGUMENT;
a61af66fc99e Initial load
duke
parents:
diff changeset
648 };
a61af66fc99e Initial load
duke
parents:
diff changeset
649 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
650 } /* end SetVerboseFlag */
a61af66fc99e Initial load
duke
parents:
diff changeset
651
a61af66fc99e Initial load
duke
parents:
diff changeset
652
a61af66fc99e Initial load
duke
parents:
diff changeset
653 // format_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
654 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
655 JvmtiEnv::GetJLocationFormat(jvmtiJlocationFormat* format_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
656 *format_ptr = JVMTI_JLOCATION_JVMBCI;
a61af66fc99e Initial load
duke
parents:
diff changeset
657 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
658 } /* end GetJLocationFormat */
a61af66fc99e Initial load
duke
parents:
diff changeset
659
a61af66fc99e Initial load
duke
parents:
diff changeset
660 #ifndef JVMTI_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
661
a61af66fc99e Initial load
duke
parents:
diff changeset
662 //
a61af66fc99e Initial load
duke
parents:
diff changeset
663 // Thread functions
a61af66fc99e Initial load
duke
parents:
diff changeset
664 //
a61af66fc99e Initial load
duke
parents:
diff changeset
665
a61af66fc99e Initial load
duke
parents:
diff changeset
666 // Threads_lock NOT held
a61af66fc99e Initial load
duke
parents:
diff changeset
667 // thread - NOT pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
668 // thread_state_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
669 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
670 JvmtiEnv::GetThreadState(jthread thread, jint* thread_state_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
671 jint state;
a61af66fc99e Initial load
duke
parents:
diff changeset
672 oop thread_oop;
a61af66fc99e Initial load
duke
parents:
diff changeset
673 JavaThread* thr;
a61af66fc99e Initial load
duke
parents:
diff changeset
674
a61af66fc99e Initial load
duke
parents:
diff changeset
675 if (thread == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
676 thread_oop = JavaThread::current()->threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
677 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
678 thread_oop = JNIHandles::resolve_external_guard(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
679 }
a61af66fc99e Initial load
duke
parents:
diff changeset
680
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 609
diff changeset
681 if (thread_oop == NULL || !thread_oop->is_a(SystemDictionary::Thread_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
682 return JVMTI_ERROR_INVALID_THREAD;
a61af66fc99e Initial load
duke
parents:
diff changeset
683 }
a61af66fc99e Initial load
duke
parents:
diff changeset
684
a61af66fc99e Initial load
duke
parents:
diff changeset
685 // get most state bits
a61af66fc99e Initial load
duke
parents:
diff changeset
686 state = (jint)java_lang_Thread::get_thread_status(thread_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
687
a61af66fc99e Initial load
duke
parents:
diff changeset
688 // add more state bits
a61af66fc99e Initial load
duke
parents:
diff changeset
689 thr = java_lang_Thread::thread(thread_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
690 if (thr != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
691 JavaThreadState jts = thr->thread_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
692
a61af66fc99e Initial load
duke
parents:
diff changeset
693 if (thr->is_being_ext_suspended()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
694 state |= JVMTI_THREAD_STATE_SUSPENDED;
a61af66fc99e Initial load
duke
parents:
diff changeset
695 }
a61af66fc99e Initial load
duke
parents:
diff changeset
696 if (jts == _thread_in_native) {
a61af66fc99e Initial load
duke
parents:
diff changeset
697 state |= JVMTI_THREAD_STATE_IN_NATIVE;
a61af66fc99e Initial load
duke
parents:
diff changeset
698 }
a61af66fc99e Initial load
duke
parents:
diff changeset
699 OSThread* osThread = thr->osthread();
a61af66fc99e Initial load
duke
parents:
diff changeset
700 if (osThread != NULL && osThread->interrupted()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
701 state |= JVMTI_THREAD_STATE_INTERRUPTED;
a61af66fc99e Initial load
duke
parents:
diff changeset
702 }
a61af66fc99e Initial load
duke
parents:
diff changeset
703 }
a61af66fc99e Initial load
duke
parents:
diff changeset
704
a61af66fc99e Initial load
duke
parents:
diff changeset
705 *thread_state_ptr = state;
a61af66fc99e Initial load
duke
parents:
diff changeset
706 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
707 } /* end GetThreadState */
a61af66fc99e Initial load
duke
parents:
diff changeset
708
a61af66fc99e Initial load
duke
parents:
diff changeset
709
a61af66fc99e Initial load
duke
parents:
diff changeset
710 // thread_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
711 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
712 JvmtiEnv::GetCurrentThread(jthread* thread_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
713 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
714 *thread_ptr = (jthread)JNIHandles::make_local(current_thread, current_thread->threadObj());
a61af66fc99e Initial load
duke
parents:
diff changeset
715 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
716 } /* end GetCurrentThread */
a61af66fc99e Initial load
duke
parents:
diff changeset
717
a61af66fc99e Initial load
duke
parents:
diff changeset
718
a61af66fc99e Initial load
duke
parents:
diff changeset
719 // threads_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
720 // threads_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
721 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
722 JvmtiEnv::GetAllThreads(jint* threads_count_ptr, jthread** threads_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
723 int nthreads = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
724 Handle *thread_objs = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
725 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
726 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
727
a61af66fc99e Initial load
duke
parents:
diff changeset
728 // enumerate threads (including agent threads)
a61af66fc99e Initial load
duke
parents:
diff changeset
729 ThreadsListEnumerator tle(Thread::current(), true);
a61af66fc99e Initial load
duke
parents:
diff changeset
730 nthreads = tle.num_threads();
a61af66fc99e Initial load
duke
parents:
diff changeset
731 *threads_count_ptr = nthreads;
a61af66fc99e Initial load
duke
parents:
diff changeset
732
a61af66fc99e Initial load
duke
parents:
diff changeset
733 if (nthreads == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
734 *threads_ptr = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
735 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
736 }
a61af66fc99e Initial load
duke
parents:
diff changeset
737
a61af66fc99e Initial load
duke
parents:
diff changeset
738 thread_objs = NEW_RESOURCE_ARRAY(Handle, nthreads);
a61af66fc99e Initial load
duke
parents:
diff changeset
739 NULL_CHECK(thread_objs, JVMTI_ERROR_OUT_OF_MEMORY);
a61af66fc99e Initial load
duke
parents:
diff changeset
740
a61af66fc99e Initial load
duke
parents:
diff changeset
741 for (int i=0; i < nthreads; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
742 thread_objs[i] = Handle(tle.get_threadObj(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
743 }
a61af66fc99e Initial load
duke
parents:
diff changeset
744
a61af66fc99e Initial load
duke
parents:
diff changeset
745 // have to make global handles outside of Threads_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
746 jthread *jthreads = new_jthreadArray(nthreads, thread_objs);
a61af66fc99e Initial load
duke
parents:
diff changeset
747 NULL_CHECK(jthreads, JVMTI_ERROR_OUT_OF_MEMORY);
a61af66fc99e Initial load
duke
parents:
diff changeset
748
a61af66fc99e Initial load
duke
parents:
diff changeset
749 *threads_ptr = jthreads;
a61af66fc99e Initial load
duke
parents:
diff changeset
750 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
751 } /* end GetAllThreads */
a61af66fc99e Initial load
duke
parents:
diff changeset
752
a61af66fc99e Initial load
duke
parents:
diff changeset
753
a61af66fc99e Initial load
duke
parents:
diff changeset
754 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
755 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
756 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
757 JvmtiEnv::SuspendThread(JavaThread* java_thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
758 // don't allow hidden thread suspend request.
a61af66fc99e Initial load
duke
parents:
diff changeset
759 if (java_thread->is_hidden_from_external_view()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
760 return (JVMTI_ERROR_NONE);
a61af66fc99e Initial load
duke
parents:
diff changeset
761 }
a61af66fc99e Initial load
duke
parents:
diff changeset
762
a61af66fc99e Initial load
duke
parents:
diff changeset
763 {
a61af66fc99e Initial load
duke
parents:
diff changeset
764 MutexLockerEx ml(java_thread->SR_lock(), Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
765 if (java_thread->is_external_suspend()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
766 // don't allow nested external suspend requests.
a61af66fc99e Initial load
duke
parents:
diff changeset
767 return (JVMTI_ERROR_THREAD_SUSPENDED);
a61af66fc99e Initial load
duke
parents:
diff changeset
768 }
a61af66fc99e Initial load
duke
parents:
diff changeset
769 if (java_thread->is_exiting()) { // thread is in the process of exiting
a61af66fc99e Initial load
duke
parents:
diff changeset
770 return (JVMTI_ERROR_THREAD_NOT_ALIVE);
a61af66fc99e Initial load
duke
parents:
diff changeset
771 }
a61af66fc99e Initial load
duke
parents:
diff changeset
772 java_thread->set_external_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
773 }
a61af66fc99e Initial load
duke
parents:
diff changeset
774
a61af66fc99e Initial load
duke
parents:
diff changeset
775 if (!JvmtiSuspendControl::suspend(java_thread)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
776 // the thread was in the process of exiting
a61af66fc99e Initial load
duke
parents:
diff changeset
777 return (JVMTI_ERROR_THREAD_NOT_ALIVE);
a61af66fc99e Initial load
duke
parents:
diff changeset
778 }
a61af66fc99e Initial load
duke
parents:
diff changeset
779 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
780 } /* end SuspendThread */
a61af66fc99e Initial load
duke
parents:
diff changeset
781
a61af66fc99e Initial load
duke
parents:
diff changeset
782
a61af66fc99e Initial load
duke
parents:
diff changeset
783 // request_count - pre-checked to be greater than or equal to 0
a61af66fc99e Initial load
duke
parents:
diff changeset
784 // request_list - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
785 // results - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
786 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
787 JvmtiEnv::SuspendThreadList(jint request_count, const jthread* request_list, jvmtiError* results) {
a61af66fc99e Initial load
duke
parents:
diff changeset
788 int needSafepoint = 0; // > 0 if we need a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
789 for (int i = 0; i < request_count; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
790 JavaThread *java_thread = get_JavaThread(request_list[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
791 if (java_thread == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
792 results[i] = JVMTI_ERROR_INVALID_THREAD;
a61af66fc99e Initial load
duke
parents:
diff changeset
793 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
794 }
a61af66fc99e Initial load
duke
parents:
diff changeset
795 // the thread has not yet run or has exited (not on threads list)
a61af66fc99e Initial load
duke
parents:
diff changeset
796 if (java_thread->threadObj() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
797 results[i] = JVMTI_ERROR_THREAD_NOT_ALIVE;
a61af66fc99e Initial load
duke
parents:
diff changeset
798 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
799 }
a61af66fc99e Initial load
duke
parents:
diff changeset
800 if (java_lang_Thread::thread(java_thread->threadObj()) == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
801 results[i] = JVMTI_ERROR_THREAD_NOT_ALIVE;
a61af66fc99e Initial load
duke
parents:
diff changeset
802 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
803 }
a61af66fc99e Initial load
duke
parents:
diff changeset
804 // don't allow hidden thread suspend request.
a61af66fc99e Initial load
duke
parents:
diff changeset
805 if (java_thread->is_hidden_from_external_view()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
806 results[i] = JVMTI_ERROR_NONE; // indicate successful suspend
a61af66fc99e Initial load
duke
parents:
diff changeset
807 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
808 }
a61af66fc99e Initial load
duke
parents:
diff changeset
809
a61af66fc99e Initial load
duke
parents:
diff changeset
810 {
a61af66fc99e Initial load
duke
parents:
diff changeset
811 MutexLockerEx ml(java_thread->SR_lock(), Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
812 if (java_thread->is_external_suspend()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
813 // don't allow nested external suspend requests.
a61af66fc99e Initial load
duke
parents:
diff changeset
814 results[i] = JVMTI_ERROR_THREAD_SUSPENDED;
a61af66fc99e Initial load
duke
parents:
diff changeset
815 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
816 }
a61af66fc99e Initial load
duke
parents:
diff changeset
817 if (java_thread->is_exiting()) { // thread is in the process of exiting
a61af66fc99e Initial load
duke
parents:
diff changeset
818 results[i] = JVMTI_ERROR_THREAD_NOT_ALIVE;
a61af66fc99e Initial load
duke
parents:
diff changeset
819 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
820 }
a61af66fc99e Initial load
duke
parents:
diff changeset
821 java_thread->set_external_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
822 }
a61af66fc99e Initial load
duke
parents:
diff changeset
823 if (java_thread->thread_state() == _thread_in_native) {
a61af66fc99e Initial load
duke
parents:
diff changeset
824 // We need to try and suspend native threads here. Threads in
a61af66fc99e Initial load
duke
parents:
diff changeset
825 // other states will self-suspend on their next transition.
a61af66fc99e Initial load
duke
parents:
diff changeset
826 if (!JvmtiSuspendControl::suspend(java_thread)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
827 // The thread was in the process of exiting. Force another
a61af66fc99e Initial load
duke
parents:
diff changeset
828 // safepoint to make sure that this thread transitions.
a61af66fc99e Initial load
duke
parents:
diff changeset
829 needSafepoint++;
a61af66fc99e Initial load
duke
parents:
diff changeset
830 results[i] = JVMTI_ERROR_THREAD_NOT_ALIVE;
a61af66fc99e Initial load
duke
parents:
diff changeset
831 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
832 }
a61af66fc99e Initial load
duke
parents:
diff changeset
833 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
834 needSafepoint++;
a61af66fc99e Initial load
duke
parents:
diff changeset
835 }
a61af66fc99e Initial load
duke
parents:
diff changeset
836 results[i] = JVMTI_ERROR_NONE; // indicate successful suspend
a61af66fc99e Initial load
duke
parents:
diff changeset
837 }
a61af66fc99e Initial load
duke
parents:
diff changeset
838 if (needSafepoint > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
839 VM_ForceSafepoint vfs;
a61af66fc99e Initial load
duke
parents:
diff changeset
840 VMThread::execute(&vfs);
a61af66fc99e Initial load
duke
parents:
diff changeset
841 }
a61af66fc99e Initial load
duke
parents:
diff changeset
842 // per-thread suspend results returned via results parameter
a61af66fc99e Initial load
duke
parents:
diff changeset
843 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
844 } /* end SuspendThreadList */
a61af66fc99e Initial load
duke
parents:
diff changeset
845
a61af66fc99e Initial load
duke
parents:
diff changeset
846
a61af66fc99e Initial load
duke
parents:
diff changeset
847 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
848 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
849 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
850 JvmtiEnv::ResumeThread(JavaThread* java_thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
851 // don't allow hidden thread resume request.
a61af66fc99e Initial load
duke
parents:
diff changeset
852 if (java_thread->is_hidden_from_external_view()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
853 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
854 }
a61af66fc99e Initial load
duke
parents:
diff changeset
855
a61af66fc99e Initial load
duke
parents:
diff changeset
856 if (!java_thread->is_being_ext_suspended()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
857 return JVMTI_ERROR_THREAD_NOT_SUSPENDED;
a61af66fc99e Initial load
duke
parents:
diff changeset
858 }
a61af66fc99e Initial load
duke
parents:
diff changeset
859
a61af66fc99e Initial load
duke
parents:
diff changeset
860 if (!JvmtiSuspendControl::resume(java_thread)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
861 return JVMTI_ERROR_INTERNAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
862 }
a61af66fc99e Initial load
duke
parents:
diff changeset
863 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
864 } /* end ResumeThread */
a61af66fc99e Initial load
duke
parents:
diff changeset
865
a61af66fc99e Initial load
duke
parents:
diff changeset
866
a61af66fc99e Initial load
duke
parents:
diff changeset
867 // request_count - pre-checked to be greater than or equal to 0
a61af66fc99e Initial load
duke
parents:
diff changeset
868 // request_list - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
869 // results - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
870 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
871 JvmtiEnv::ResumeThreadList(jint request_count, const jthread* request_list, jvmtiError* results) {
a61af66fc99e Initial load
duke
parents:
diff changeset
872 for (int i = 0; i < request_count; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
873 JavaThread *java_thread = get_JavaThread(request_list[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
874 if (java_thread == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
875 results[i] = JVMTI_ERROR_INVALID_THREAD;
a61af66fc99e Initial load
duke
parents:
diff changeset
876 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
877 }
a61af66fc99e Initial load
duke
parents:
diff changeset
878 // don't allow hidden thread resume request.
a61af66fc99e Initial load
duke
parents:
diff changeset
879 if (java_thread->is_hidden_from_external_view()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
880 results[i] = JVMTI_ERROR_NONE; // indicate successful resume
a61af66fc99e Initial load
duke
parents:
diff changeset
881 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
882 }
a61af66fc99e Initial load
duke
parents:
diff changeset
883 if (!java_thread->is_being_ext_suspended()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
884 results[i] = JVMTI_ERROR_THREAD_NOT_SUSPENDED;
a61af66fc99e Initial load
duke
parents:
diff changeset
885 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
886 }
a61af66fc99e Initial load
duke
parents:
diff changeset
887
a61af66fc99e Initial load
duke
parents:
diff changeset
888 if (!JvmtiSuspendControl::resume(java_thread)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
889 results[i] = JVMTI_ERROR_INTERNAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
890 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
891 }
a61af66fc99e Initial load
duke
parents:
diff changeset
892
a61af66fc99e Initial load
duke
parents:
diff changeset
893 results[i] = JVMTI_ERROR_NONE; // indicate successful suspend
a61af66fc99e Initial load
duke
parents:
diff changeset
894 }
a61af66fc99e Initial load
duke
parents:
diff changeset
895 // per-thread resume results returned via results parameter
a61af66fc99e Initial load
duke
parents:
diff changeset
896 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
897 } /* end ResumeThreadList */
a61af66fc99e Initial load
duke
parents:
diff changeset
898
a61af66fc99e Initial load
duke
parents:
diff changeset
899
a61af66fc99e Initial load
duke
parents:
diff changeset
900 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
901 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
902 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
903 JvmtiEnv::StopThread(JavaThread* java_thread, jobject exception) {
a61af66fc99e Initial load
duke
parents:
diff changeset
904 oop e = JNIHandles::resolve_external_guard(exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
905 NULL_CHECK(e, JVMTI_ERROR_NULL_POINTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
906
a61af66fc99e Initial load
duke
parents:
diff changeset
907 JavaThread::send_async_exception(java_thread->threadObj(), e);
a61af66fc99e Initial load
duke
parents:
diff changeset
908
a61af66fc99e Initial load
duke
parents:
diff changeset
909 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
910
a61af66fc99e Initial load
duke
parents:
diff changeset
911 } /* end StopThread */
a61af66fc99e Initial load
duke
parents:
diff changeset
912
a61af66fc99e Initial load
duke
parents:
diff changeset
913
a61af66fc99e Initial load
duke
parents:
diff changeset
914 // Threads_lock NOT held
a61af66fc99e Initial load
duke
parents:
diff changeset
915 // thread - NOT pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
916 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
917 JvmtiEnv::InterruptThread(jthread thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
918 oop thread_oop = JNIHandles::resolve_external_guard(thread);
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 609
diff changeset
919 if (thread_oop == NULL || !thread_oop->is_a(SystemDictionary::Thread_klass()))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
920 return JVMTI_ERROR_INVALID_THREAD;
a61af66fc99e Initial load
duke
parents:
diff changeset
921
a61af66fc99e Initial load
duke
parents:
diff changeset
922 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
923
a61af66fc99e Initial load
duke
parents:
diff changeset
924 // Todo: this is a duplicate of JVM_Interrupt; share code in future
a61af66fc99e Initial load
duke
parents:
diff changeset
925 // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
a61af66fc99e Initial load
duke
parents:
diff changeset
926 MutexLockerEx ml(current_thread->threadObj() == thread_oop ? NULL : Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
927 // We need to re-resolve the java_thread, since a GC might have happened during the
a61af66fc99e Initial load
duke
parents:
diff changeset
928 // acquire of the lock
a61af66fc99e Initial load
duke
parents:
diff changeset
929
a61af66fc99e Initial load
duke
parents:
diff changeset
930 JavaThread* java_thread = java_lang_Thread::thread(JNIHandles::resolve_external_guard(thread));
a61af66fc99e Initial load
duke
parents:
diff changeset
931 NULL_CHECK(java_thread, JVMTI_ERROR_THREAD_NOT_ALIVE);
a61af66fc99e Initial load
duke
parents:
diff changeset
932
a61af66fc99e Initial load
duke
parents:
diff changeset
933 Thread::interrupt(java_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
934
a61af66fc99e Initial load
duke
parents:
diff changeset
935 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
936 } /* end InterruptThread */
a61af66fc99e Initial load
duke
parents:
diff changeset
937
a61af66fc99e Initial load
duke
parents:
diff changeset
938
a61af66fc99e Initial load
duke
parents:
diff changeset
939 // Threads_lock NOT held
a61af66fc99e Initial load
duke
parents:
diff changeset
940 // thread - NOT pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
941 // info_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
942 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
943 JvmtiEnv::GetThreadInfo(jthread thread, jvmtiThreadInfo* info_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
944 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
945 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
946
a61af66fc99e Initial load
duke
parents:
diff changeset
947 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
948
a61af66fc99e Initial load
duke
parents:
diff changeset
949 // if thread is NULL the current thread is used
a61af66fc99e Initial load
duke
parents:
diff changeset
950 oop thread_oop;
a61af66fc99e Initial load
duke
parents:
diff changeset
951 if (thread == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
952 thread_oop = current_thread->threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
953 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
954 thread_oop = JNIHandles::resolve_external_guard(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
955 }
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 609
diff changeset
956 if (thread_oop == NULL || !thread_oop->is_a(SystemDictionary::Thread_klass()))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
957 return JVMTI_ERROR_INVALID_THREAD;
a61af66fc99e Initial load
duke
parents:
diff changeset
958
a61af66fc99e Initial load
duke
parents:
diff changeset
959 Handle thread_obj(current_thread, thread_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
960 typeArrayHandle name;
a61af66fc99e Initial load
duke
parents:
diff changeset
961 ThreadPriority priority;
a61af66fc99e Initial load
duke
parents:
diff changeset
962 Handle thread_group;
a61af66fc99e Initial load
duke
parents:
diff changeset
963 Handle context_class_loader;
a61af66fc99e Initial load
duke
parents:
diff changeset
964 bool is_daemon;
a61af66fc99e Initial load
duke
parents:
diff changeset
965
a61af66fc99e Initial load
duke
parents:
diff changeset
966 { MutexLocker mu(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
967
a61af66fc99e Initial load
duke
parents:
diff changeset
968 name = typeArrayHandle(current_thread, java_lang_Thread::name(thread_obj()));
a61af66fc99e Initial load
duke
parents:
diff changeset
969 priority = java_lang_Thread::priority(thread_obj());
a61af66fc99e Initial load
duke
parents:
diff changeset
970 thread_group = Handle(current_thread, java_lang_Thread::threadGroup(thread_obj()));
a61af66fc99e Initial load
duke
parents:
diff changeset
971 is_daemon = java_lang_Thread::is_daemon(thread_obj());
a61af66fc99e Initial load
duke
parents:
diff changeset
972
a61af66fc99e Initial load
duke
parents:
diff changeset
973 oop loader = java_lang_Thread::context_class_loader(thread_obj());
a61af66fc99e Initial load
duke
parents:
diff changeset
974 context_class_loader = Handle(current_thread, loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
975 }
a61af66fc99e Initial load
duke
parents:
diff changeset
976 { const char *n;
a61af66fc99e Initial load
duke
parents:
diff changeset
977
a61af66fc99e Initial load
duke
parents:
diff changeset
978 if (name() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
979 n = UNICODE::as_utf8((jchar*) name->base(T_CHAR), name->length());
a61af66fc99e Initial load
duke
parents:
diff changeset
980 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
981 n = UNICODE::as_utf8(NULL, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
982 }
a61af66fc99e Initial load
duke
parents:
diff changeset
983
a61af66fc99e Initial load
duke
parents:
diff changeset
984 info_ptr->name = (char *) jvmtiMalloc(strlen(n)+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
985 if (info_ptr->name == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
986 return JVMTI_ERROR_OUT_OF_MEMORY;
a61af66fc99e Initial load
duke
parents:
diff changeset
987
a61af66fc99e Initial load
duke
parents:
diff changeset
988 strcpy(info_ptr->name, n);
a61af66fc99e Initial load
duke
parents:
diff changeset
989 }
a61af66fc99e Initial load
duke
parents:
diff changeset
990 info_ptr->is_daemon = is_daemon;
a61af66fc99e Initial load
duke
parents:
diff changeset
991 info_ptr->priority = priority;
a61af66fc99e Initial load
duke
parents:
diff changeset
992
a61af66fc99e Initial load
duke
parents:
diff changeset
993 info_ptr->context_class_loader = (context_class_loader.is_null()) ? NULL :
a61af66fc99e Initial load
duke
parents:
diff changeset
994 jni_reference(context_class_loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
995 info_ptr->thread_group = jni_reference(thread_group);
a61af66fc99e Initial load
duke
parents:
diff changeset
996
a61af66fc99e Initial load
duke
parents:
diff changeset
997 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
998 } /* end GetThreadInfo */
a61af66fc99e Initial load
duke
parents:
diff changeset
999
a61af66fc99e Initial load
duke
parents:
diff changeset
1000
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 // owned_monitor_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 // owned_monitors_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 JvmtiEnv::GetOwnedMonitorInfo(JavaThread* java_thread, jint* owned_monitor_count_ptr, jobject** owned_monitors_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 jvmtiError err = JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 JavaThread* calling_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1009
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 // growable array of jvmti monitors info on the C-heap
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 GrowableArray<jvmtiMonitorStackDepthInfo*> *owned_monitors_list =
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 new (ResourceObj::C_HEAP) GrowableArray<jvmtiMonitorStackDepthInfo*>(1, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1013
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 uint32_t debug_bits = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 if (is_thread_fully_suspended(java_thread, true, &debug_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 err = get_owned_monitors(calling_thread, java_thread, owned_monitors_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 // JVMTI get monitors info at safepoint. Do not require target thread to
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 // be suspended.
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 VM_GetOwnedMonitorInfo op(this, calling_thread, java_thread, owned_monitors_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 err = op.result();
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 jint owned_monitor_count = owned_monitors_list->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 if (err == JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 if ((err = allocate(owned_monitor_count * sizeof(jobject *),
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 (unsigned char**)owned_monitors_ptr)) == JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 // copy into the returned array
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 for (int i = 0; i < owned_monitor_count; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 (*owned_monitors_ptr)[i] =
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 ((jvmtiMonitorStackDepthInfo*)owned_monitors_list->at(i))->monitor;
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 *owned_monitor_count_ptr = owned_monitor_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 // clean up.
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 for (int i = 0; i < owned_monitor_count; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 deallocate((unsigned char*)owned_monitors_list->at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 delete owned_monitors_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
1041
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 } /* end GetOwnedMonitorInfo */
a61af66fc99e Initial load
duke
parents:
diff changeset
1044
a61af66fc99e Initial load
duke
parents:
diff changeset
1045
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 // monitor_info_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 // monitor_info_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 JvmtiEnv::GetOwnedMonitorStackDepthInfo(JavaThread* java_thread, jint* monitor_info_count_ptr, jvmtiMonitorStackDepthInfo** monitor_info_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 jvmtiError err = JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 JavaThread* calling_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1054
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 // growable array of jvmti monitors info on the C-heap
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 GrowableArray<jvmtiMonitorStackDepthInfo*> *owned_monitors_list =
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 new (ResourceObj::C_HEAP) GrowableArray<jvmtiMonitorStackDepthInfo*>(1, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1058
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 uint32_t debug_bits = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 if (is_thread_fully_suspended(java_thread, true, &debug_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 err = get_owned_monitors(calling_thread, java_thread, owned_monitors_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 // JVMTI get owned monitors info at safepoint. Do not require target thread to
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 // be suspended.
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 VM_GetOwnedMonitorInfo op(this, calling_thread, java_thread, owned_monitors_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 err = op.result();
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1069
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 jint owned_monitor_count = owned_monitors_list->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 if (err == JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 if ((err = allocate(owned_monitor_count * sizeof(jvmtiMonitorStackDepthInfo),
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 (unsigned char**)monitor_info_ptr)) == JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 // copy to output array.
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 for (int i = 0; i < owned_monitor_count; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 (*monitor_info_ptr)[i].monitor =
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 ((jvmtiMonitorStackDepthInfo*)owned_monitors_list->at(i))->monitor;
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 (*monitor_info_ptr)[i].stack_depth =
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 ((jvmtiMonitorStackDepthInfo*)owned_monitors_list->at(i))->stack_depth;
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 *monitor_info_count_ptr = owned_monitor_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1084
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 // clean up.
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 for (int i = 0; i < owned_monitor_count; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 deallocate((unsigned char*)owned_monitors_list->at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 delete owned_monitors_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
1090
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 } /* end GetOwnedMonitorStackDepthInfo */
a61af66fc99e Initial load
duke
parents:
diff changeset
1093
a61af66fc99e Initial load
duke
parents:
diff changeset
1094
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 // monitor_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 JvmtiEnv::GetCurrentContendedMonitor(JavaThread* java_thread, jobject* monitor_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 jvmtiError err = JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 uint32_t debug_bits = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 JavaThread* calling_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 if (is_thread_fully_suspended(java_thread, true, &debug_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 err = get_current_contended_monitor(calling_thread, java_thread, monitor_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 // get contended monitor information at safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 VM_GetCurrentContendedMonitor op(this, calling_thread, java_thread, monitor_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 err = op.result();
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 } /* end GetCurrentContendedMonitor */
a61af66fc99e Initial load
duke
parents:
diff changeset
1113
a61af66fc99e Initial load
duke
parents:
diff changeset
1114
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 // Threads_lock NOT held
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 // thread - NOT pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 // proc - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 // arg - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 JvmtiEnv::RunAgentThread(jthread thread, jvmtiStartFunction proc, const void* arg, jint priority) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 oop thread_oop = JNIHandles::resolve_external_guard(thread);
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 609
diff changeset
1122 if (thread_oop == NULL || !thread_oop->is_a(SystemDictionary::Thread_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 return JVMTI_ERROR_INVALID_THREAD;
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 if (priority < JVMTI_THREAD_MIN_PRIORITY || priority > JVMTI_THREAD_MAX_PRIORITY) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 return JVMTI_ERROR_INVALID_PRIORITY;
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1128
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 //Thread-self
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1131
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 Handle thread_hndl(current_thread, thread_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 MutexLocker mu(Threads_lock); // grab Threads_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1135
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 JvmtiAgentThread *new_thread = new JvmtiAgentThread(this, proc, arg);
a61af66fc99e Initial load
duke
parents:
diff changeset
1137
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 // At this point it may be possible that no osthread was created for the
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 // JavaThread due to lack of memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 if (new_thread == NULL || new_thread->osthread() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 if (new_thread) delete new_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 return JVMTI_ERROR_OUT_OF_MEMORY;
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1144
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 java_lang_Thread::set_thread(thread_hndl(), new_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 java_lang_Thread::set_priority(thread_hndl(), (ThreadPriority)priority);
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 java_lang_Thread::set_daemon(thread_hndl());
a61af66fc99e Initial load
duke
parents:
diff changeset
1148
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 new_thread->set_threadObj(thread_hndl());
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 Threads::add(new_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 Thread::start(new_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 } // unlock Threads_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1153
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 } /* end RunAgentThread */
a61af66fc99e Initial load
duke
parents:
diff changeset
1156
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 // Thread Group functions
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1160
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 // group_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 // groups_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 JvmtiEnv::GetTopThreadGroups(jint* group_count_ptr, jthreadGroup** groups_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1166
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 // Only one top level thread group now.
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 *group_count_ptr = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1169
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 // Allocate memory to store global-refs to the thread groups.
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 // Assume this area is freed by caller.
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 *groups_ptr = (jthreadGroup *) jvmtiMalloc((sizeof(jthreadGroup)) * (*group_count_ptr));
a61af66fc99e Initial load
duke
parents:
diff changeset
1173
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 NULL_CHECK(*groups_ptr, JVMTI_ERROR_OUT_OF_MEMORY);
a61af66fc99e Initial load
duke
parents:
diff changeset
1175
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 // Convert oop to Handle, then convert Handle to global-ref.
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 HandleMark hm(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 Handle system_thread_group(current_thread, Universe::system_thread_group());
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 *groups_ptr[0] = jni_reference(system_thread_group);
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1182
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 } /* end GetTopThreadGroups */
a61af66fc99e Initial load
duke
parents:
diff changeset
1185
a61af66fc99e Initial load
duke
parents:
diff changeset
1186
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 // info_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 JvmtiEnv::GetThreadGroupInfo(jthreadGroup group, jvmtiThreadGroupInfo* info_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1192
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1194
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 Handle group_obj (current_thread, JNIHandles::resolve_external_guard(group));
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 NULL_CHECK(group_obj(), JVMTI_ERROR_INVALID_THREAD_GROUP);
a61af66fc99e Initial load
duke
parents:
diff changeset
1197
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 typeArrayHandle name;
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 Handle parent_group;
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 bool is_daemon;
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 ThreadPriority max_priority;
a61af66fc99e Initial load
duke
parents:
diff changeset
1202
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 { MutexLocker mu(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1204
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 name = typeArrayHandle(current_thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 java_lang_ThreadGroup::name(group_obj()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 parent_group = Handle(current_thread, java_lang_ThreadGroup::parent(group_obj()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 is_daemon = java_lang_ThreadGroup::is_daemon(group_obj());
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 max_priority = java_lang_ThreadGroup::maxPriority(group_obj());
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1211
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 info_ptr->is_daemon = is_daemon;
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 info_ptr->max_priority = max_priority;
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 info_ptr->parent = jni_reference(parent_group);
a61af66fc99e Initial load
duke
parents:
diff changeset
1215
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 if (name() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 const char* n = UNICODE::as_utf8((jchar*) name->base(T_CHAR), name->length());
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 info_ptr->name = (char *)jvmtiMalloc(strlen(n)+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 NULL_CHECK(info_ptr->name, JVMTI_ERROR_OUT_OF_MEMORY);
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 strcpy(info_ptr->name, n);
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 info_ptr->name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1224
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 } /* end GetThreadGroupInfo */
a61af66fc99e Initial load
duke
parents:
diff changeset
1227
a61af66fc99e Initial load
duke
parents:
diff changeset
1228
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 // thread_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 // threads_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 // group_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 // groups_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 JvmtiEnv::GetThreadGroupChildren(jthreadGroup group, jint* thread_count_ptr, jthread** threads_ptr, jint* group_count_ptr, jthreadGroup** groups_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 oop group_obj = (oop) JNIHandles::resolve_external_guard(group);
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 NULL_CHECK(group_obj, JVMTI_ERROR_INVALID_THREAD_GROUP);
a61af66fc99e Initial load
duke
parents:
diff changeset
1238
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 Handle *thread_objs = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 Handle *group_objs = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 int nthreads = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 int ngroups = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 int hidden_threads = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1244
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1247
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 Handle group_hdl(current_thread, group_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1249
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 { MutexLocker mu(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1251
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 nthreads = java_lang_ThreadGroup::nthreads(group_hdl());
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 ngroups = java_lang_ThreadGroup::ngroups(group_hdl());
a61af66fc99e Initial load
duke
parents:
diff changeset
1254
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 if (nthreads > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 objArrayOop threads = java_lang_ThreadGroup::threads(group_hdl());
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 assert(nthreads <= threads->length(), "too many threads");
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 thread_objs = NEW_RESOURCE_ARRAY(Handle,nthreads);
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 for (int i=0, j=0; i<nthreads; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 oop thread_obj = threads->obj_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 assert(thread_obj != NULL, "thread_obj is NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 JavaThread *javathread = java_lang_Thread::thread(thread_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 // Filter out hidden java threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 if (javathread != NULL && javathread->is_hidden_from_external_view()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 hidden_threads++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 thread_objs[j++] = Handle(current_thread, thread_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 nthreads -= hidden_threads;
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 if (ngroups > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 objArrayOop groups = java_lang_ThreadGroup::groups(group_hdl());
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 assert(ngroups <= groups->length(), "too many threads");
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 group_objs = NEW_RESOURCE_ARRAY(Handle,ngroups);
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 for (int i=0; i<ngroups; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 oop group_obj = groups->obj_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 assert(group_obj != NULL, "group_obj != NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 group_objs[i] = Handle(current_thread, group_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1283
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 // have to make global handles outside of Threads_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 *group_count_ptr = ngroups;
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 *thread_count_ptr = nthreads;
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 *threads_ptr = new_jthreadArray(nthreads, thread_objs);
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 *groups_ptr = new_jthreadGroupArray(ngroups, group_objs);
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 if ((nthreads > 0) && (*threads_ptr == NULL)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 return JVMTI_ERROR_OUT_OF_MEMORY;
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 if ((ngroups > 0) && (*groups_ptr == NULL)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 return JVMTI_ERROR_OUT_OF_MEMORY;
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1295
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 } /* end GetThreadGroupChildren */
a61af66fc99e Initial load
duke
parents:
diff changeset
1298
a61af66fc99e Initial load
duke
parents:
diff changeset
1299
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 // Stack Frame functions
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1303
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 // max_frame_count - pre-checked to be greater than or equal to 0
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 // frame_buffer - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 // count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 JvmtiEnv::GetStackTrace(JavaThread* java_thread, jint start_depth, jint max_frame_count, jvmtiFrameInfo* frame_buffer, jint* count_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 jvmtiError err = JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 uint32_t debug_bits = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 if (is_thread_fully_suspended(java_thread, true, &debug_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 err = get_stack_trace(java_thread, start_depth, max_frame_count, frame_buffer, count_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 // JVMTI get stack trace at safepoint. Do not require target thread to
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 // be suspended.
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 VM_GetStackTrace op(this, java_thread, start_depth, max_frame_count, frame_buffer, count_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 err = op.result();
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1322
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 } /* end GetStackTrace */
a61af66fc99e Initial load
duke
parents:
diff changeset
1325
a61af66fc99e Initial load
duke
parents:
diff changeset
1326
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 // max_frame_count - pre-checked to be greater than or equal to 0
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 // stack_info_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 // thread_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 JvmtiEnv::GetAllStackTraces(jint max_frame_count, jvmtiStackInfo** stack_info_ptr, jint* thread_count_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 jvmtiError err = JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 JavaThread* calling_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1334
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 // JVMTI get stack traces at safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 VM_GetAllStackTraces op(this, calling_thread, max_frame_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 *thread_count_ptr = op.final_thread_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 *stack_info_ptr = op.stack_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 err = op.result();
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 } /* end GetAllStackTraces */
a61af66fc99e Initial load
duke
parents:
diff changeset
1343
a61af66fc99e Initial load
duke
parents:
diff changeset
1344
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 // thread_count - pre-checked to be greater than or equal to 0
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 // thread_list - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 // max_frame_count - pre-checked to be greater than or equal to 0
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 // stack_info_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 JvmtiEnv::GetThreadListStackTraces(jint thread_count, const jthread* thread_list, jint max_frame_count, jvmtiStackInfo** stack_info_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 jvmtiError err = JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 // JVMTI get stack traces at safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 VM_GetThreadListStackTraces op(this, thread_count, thread_list, max_frame_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 err = op.result();
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 if (err == JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 *stack_info_ptr = op.stack_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 } /* end GetThreadListStackTraces */
a61af66fc99e Initial load
duke
parents:
diff changeset
1361
a61af66fc99e Initial load
duke
parents:
diff changeset
1362
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 // count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 JvmtiEnv::GetFrameCount(JavaThread* java_thread, jint* count_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 jvmtiError err = JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1369
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 // retrieve or create JvmtiThreadState.
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 JvmtiThreadState* state = JvmtiThreadState::state_for(java_thread);
609
ea20d7ce26b0 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 0
diff changeset
1372 if (state == NULL) {
ea20d7ce26b0 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 0
diff changeset
1373 return JVMTI_ERROR_THREAD_NOT_ALIVE;
ea20d7ce26b0 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 0
diff changeset
1374 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 uint32_t debug_bits = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 if (is_thread_fully_suspended(java_thread, true, &debug_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 err = get_frame_count(state, count_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 // get java stack frame count at safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 VM_GetFrameCount op(this, state, count_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 err = op.result();
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 } /* end GetFrameCount */
a61af66fc99e Initial load
duke
parents:
diff changeset
1386
a61af66fc99e Initial load
duke
parents:
diff changeset
1387
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 JvmtiEnv::PopFrame(JavaThread* java_thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 HandleMark hm(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 uint32_t debug_bits = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1395
609
ea20d7ce26b0 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 0
diff changeset
1396 // retrieve or create the state
ea20d7ce26b0 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 0
diff changeset
1397 JvmtiThreadState* state = JvmtiThreadState::state_for(java_thread);
ea20d7ce26b0 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 0
diff changeset
1398 if (state == NULL) {
ea20d7ce26b0 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 0
diff changeset
1399 return JVMTI_ERROR_THREAD_NOT_ALIVE;
ea20d7ce26b0 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 0
diff changeset
1400 }
ea20d7ce26b0 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 0
diff changeset
1401
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 // Check if java_thread is fully suspended
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 if (!is_thread_fully_suspended(java_thread, true /* wait for suspend completion */, &debug_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 return JVMTI_ERROR_THREAD_NOT_SUSPENDED;
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 // Check to see if a PopFrame was already in progress
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 if (java_thread->popframe_condition() != JavaThread::popframe_inactive) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 // Probably possible for JVMTI clients to trigger this, but the
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 // JPDA backend shouldn't allow this to happen
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 return JVMTI_ERROR_INTERNAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1412
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 // Was workaround bug
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 // 4812902: popFrame hangs if the method is waiting at a synchronize
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 // Catch this condition and return an error to avoid hanging.
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 // Now JVMTI spec allows an implementation to bail out with an opaque frame error.
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 OSThread* osThread = java_thread->osthread();
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 if (osThread->get_state() == MONITOR_WAIT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 return JVMTI_ERROR_OPAQUE_FRAME;
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1423
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 ResourceMark rm(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 // Check if there are more than one Java frame in this thread, that the top two frames
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 // are Java (not native) frames, and that there is no intervening VM frame
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 int frame_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 bool is_interpreted[2];
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 intptr_t *frame_sp[2];
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 // The 2-nd arg of constructor is needed to stop iterating at java entry frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 for (vframeStream vfs(java_thread, true); !vfs.at_end(); vfs.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 methodHandle mh(current_thread, vfs.method());
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 if (mh->is_native()) return(JVMTI_ERROR_OPAQUE_FRAME);
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 is_interpreted[frame_count] = vfs.is_interpreted_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 frame_sp[frame_count] = vfs.frame_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 if (++frame_count > 1) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 if (frame_count < 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 // We haven't found two adjacent non-native Java frames on the top.
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 // There can be two situations here:
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 // 1. There are no more java frames
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 // 2. Two top java frames are separated by non-java native frames
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 if(vframeFor(java_thread, 1) == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 return JVMTI_ERROR_NO_MORE_FRAMES;
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 // Intervening non-java native or VM frames separate java frames.
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 // Current implementation does not support this. See bug #5031735.
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 // In theory it is possible to pop frames in such cases.
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 return JVMTI_ERROR_OPAQUE_FRAME;
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1453
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 // If any of the top 2 frames is a compiled one, need to deoptimize it
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 for (int i = 0; i < 2; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 if (!is_interpreted[i]) {
1905
ce6848d0666d 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 1552
diff changeset
1457 Deoptimization::deoptimize_frame(java_thread, frame_sp[i]);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1460
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 // Update the thread state to reflect that the top frame is popped
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 // so that cur_stack_depth is maintained properly and all frameIDs
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 // are invalidated.
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 // The current frame will be popped later when the suspended thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 // is resumed and right before returning from VM to Java.
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 // (see call_VM_base() in assembler_<cpu>.cpp).
a61af66fc99e Initial load
duke
parents:
diff changeset
1467
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 // It's fine to update the thread state here because no JVMTI events
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 // shall be posted for this PopFrame.
a61af66fc99e Initial load
duke
parents:
diff changeset
1470
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 state->update_for_pop_top_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 java_thread->set_popframe_condition(JavaThread::popframe_pending_bit);
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 // Set pending step flag for this popframe and it is cleared when next
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 // step event is posted.
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 state->set_pending_step_for_popframe();
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1477
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 } /* end PopFrame */
a61af66fc99e Initial load
duke
parents:
diff changeset
1480
a61af66fc99e Initial load
duke
parents:
diff changeset
1481
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 // java_thread - unchecked
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 // depth - pre-checked as non-negative
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 // method_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 // location_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 JvmtiEnv::GetFrameLocation(JavaThread* java_thread, jint depth, jmethodID* method_ptr, jlocation* location_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 jvmtiError err = JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 uint32_t debug_bits = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1492
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 if (is_thread_fully_suspended(java_thread, true, &debug_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 err = get_frame_location(java_thread, depth, method_ptr, location_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 // JVMTI get java stack frame location at safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 VM_GetFrameLocation op(this, java_thread, depth, method_ptr, location_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 err = op.result();
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 } /* end GetFrameLocation */
a61af66fc99e Initial load
duke
parents:
diff changeset
1503
a61af66fc99e Initial load
duke
parents:
diff changeset
1504
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 // java_thread - unchecked
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 // depth - pre-checked as non-negative
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 JvmtiEnv::NotifyFramePop(JavaThread* java_thread, jint depth) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 uint32_t debug_bits = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1513
609
ea20d7ce26b0 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 0
diff changeset
1514 JvmtiThreadState *state = JvmtiThreadState::state_for(java_thread);
ea20d7ce26b0 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 0
diff changeset
1515 if (state == NULL) {
ea20d7ce26b0 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 0
diff changeset
1516 return JVMTI_ERROR_THREAD_NOT_ALIVE;
ea20d7ce26b0 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 0
diff changeset
1517 }
ea20d7ce26b0 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 0
diff changeset
1518
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 if (!JvmtiEnv::is_thread_fully_suspended(java_thread, true, &debug_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 return JVMTI_ERROR_THREAD_NOT_SUSPENDED;
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1522
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 if (TraceJVMTICalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 JvmtiSuspendControl::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1526
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 vframe *vf = vframeFor(java_thread, depth);
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 if (vf == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 return JVMTI_ERROR_NO_MORE_FRAMES;
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1531
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 if (!vf->is_java_frame() || ((javaVFrame*) vf)->method()->is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 return JVMTI_ERROR_OPAQUE_FRAME;
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1535
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 assert(vf->frame_pointer() != NULL, "frame pointer mustn't be NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
1537
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 int frame_number = state->count_frames() - depth;
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 state->env_thread_state(this)->set_frame_pop(frame_number);
a61af66fc99e Initial load
duke
parents:
diff changeset
1540
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 } /* end NotifyFramePop */
a61af66fc99e Initial load
duke
parents:
diff changeset
1543
a61af66fc99e Initial load
duke
parents:
diff changeset
1544
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 // Force Early Return functions
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1548
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1551 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 JvmtiEnv::ForceEarlyReturnObject(JavaThread* java_thread, jobject value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 jvalue val;
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 val.l = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 return force_early_return(java_thread, val, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 } /* end ForceEarlyReturnObject */
a61af66fc99e Initial load
duke
parents:
diff changeset
1557
a61af66fc99e Initial load
duke
parents:
diff changeset
1558
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 JvmtiEnv::ForceEarlyReturnInt(JavaThread* java_thread, jint value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 jvalue val;
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 val.i = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 return force_early_return(java_thread, val, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 } /* end ForceEarlyReturnInt */
a61af66fc99e Initial load
duke
parents:
diff changeset
1567
a61af66fc99e Initial load
duke
parents:
diff changeset
1568
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 JvmtiEnv::ForceEarlyReturnLong(JavaThread* java_thread, jlong value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 jvalue val;
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 val.j = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 return force_early_return(java_thread, val, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 } /* end ForceEarlyReturnLong */
a61af66fc99e Initial load
duke
parents:
diff changeset
1577
a61af66fc99e Initial load
duke
parents:
diff changeset
1578
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 JvmtiEnv::ForceEarlyReturnFloat(JavaThread* java_thread, jfloat value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 jvalue val;
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 val.f = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 return force_early_return(java_thread, val, ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 } /* end ForceEarlyReturnFloat */
a61af66fc99e Initial load
duke
parents:
diff changeset
1587
a61af66fc99e Initial load
duke
parents:
diff changeset
1588
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 JvmtiEnv::ForceEarlyReturnDouble(JavaThread* java_thread, jdouble value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 jvalue val;
a61af66fc99e Initial load
duke
parents:
diff changeset
1594 val.d = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 return force_early_return(java_thread, val, dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 } /* end ForceEarlyReturnDouble */
a61af66fc99e Initial load
duke
parents:
diff changeset
1597
a61af66fc99e Initial load
duke
parents:
diff changeset
1598
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1601 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 JvmtiEnv::ForceEarlyReturnVoid(JavaThread* java_thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 jvalue val;
a61af66fc99e Initial load
duke
parents:
diff changeset
1604 val.j = 0L;
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 return force_early_return(java_thread, val, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 } /* end ForceEarlyReturnVoid */
a61af66fc99e Initial load
duke
parents:
diff changeset
1607
a61af66fc99e Initial load
duke
parents:
diff changeset
1608
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 // Heap functions
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1612
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 // klass - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 // initial_object - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 // callbacks - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 // user_data - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1618 JvmtiEnv::FollowReferences(jint heap_filter, jclass klass, jobject initial_object, const jvmtiHeapCallbacks* callbacks, const void* user_data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 // check klass if provided
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 klassOop k_oop = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1621 if (klass != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1622 oop k_mirror = JNIHandles::resolve_external_guard(klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
1623 if (k_mirror == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1624 return JVMTI_ERROR_INVALID_CLASS;
a61af66fc99e Initial load
duke
parents:
diff changeset
1625 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 if (java_lang_Class::is_primitive(k_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1627 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1628 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1629 k_oop = java_lang_Class::as_klassOop(k_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
1630 if (k_oop == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1631 return JVMTI_ERROR_INVALID_CLASS;
a61af66fc99e Initial load
duke
parents:
diff changeset
1632 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1634
a61af66fc99e Initial load
duke
parents:
diff changeset
1635 Thread *thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1636 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1637 KlassHandle kh (thread, k_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
1638
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 TraceTime t("FollowReferences", TraceJVMTIObjectTagging);
a61af66fc99e Initial load
duke
parents:
diff changeset
1640 JvmtiTagMap::tag_map_for(this)->follow_references(heap_filter, kh, initial_object, callbacks, user_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
1641 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1642 } /* end FollowReferences */
a61af66fc99e Initial load
duke
parents:
diff changeset
1643
a61af66fc99e Initial load
duke
parents:
diff changeset
1644
a61af66fc99e Initial load
duke
parents:
diff changeset
1645 // klass - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 // callbacks - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1647 // user_data - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1648 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 JvmtiEnv::IterateThroughHeap(jint heap_filter, jclass klass, const jvmtiHeapCallbacks* callbacks, const void* user_data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 // check klass if provided
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 klassOop k_oop = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 if (klass != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1653 oop k_mirror = JNIHandles::resolve_external_guard(klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 if (k_mirror == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1655 return JVMTI_ERROR_INVALID_CLASS;
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1657 if (java_lang_Class::is_primitive(k_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1658 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 k_oop = java_lang_Class::as_klassOop(k_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
1661 if (k_oop == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1662 return JVMTI_ERROR_INVALID_CLASS;
a61af66fc99e Initial load
duke
parents:
diff changeset
1663 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1664 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1665
a61af66fc99e Initial load
duke
parents:
diff changeset
1666 Thread *thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1668 KlassHandle kh (thread, k_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
1669
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 TraceTime t("IterateThroughHeap", TraceJVMTIObjectTagging);
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 JvmtiTagMap::tag_map_for(this)->iterate_through_heap(heap_filter, kh, callbacks, user_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1673 } /* end IterateThroughHeap */
a61af66fc99e Initial load
duke
parents:
diff changeset
1674
a61af66fc99e Initial load
duke
parents:
diff changeset
1675
a61af66fc99e Initial load
duke
parents:
diff changeset
1676 // tag_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1677 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 JvmtiEnv::GetTag(jobject object, jlong* tag_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 oop o = JNIHandles::resolve_external_guard(object);
a61af66fc99e Initial load
duke
parents:
diff changeset
1680 NULL_CHECK(o, JVMTI_ERROR_INVALID_OBJECT);
a61af66fc99e Initial load
duke
parents:
diff changeset
1681 *tag_ptr = JvmtiTagMap::tag_map_for(this)->get_tag(object);
a61af66fc99e Initial load
duke
parents:
diff changeset
1682 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1683 } /* end GetTag */
a61af66fc99e Initial load
duke
parents:
diff changeset
1684
a61af66fc99e Initial load
duke
parents:
diff changeset
1685
a61af66fc99e Initial load
duke
parents:
diff changeset
1686 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 JvmtiEnv::SetTag(jobject object, jlong tag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1688 oop o = JNIHandles::resolve_external_guard(object);
a61af66fc99e Initial load
duke
parents:
diff changeset
1689 NULL_CHECK(o, JVMTI_ERROR_INVALID_OBJECT);
a61af66fc99e Initial load
duke
parents:
diff changeset
1690 JvmtiTagMap::tag_map_for(this)->set_tag(object, tag);
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 } /* end SetTag */
a61af66fc99e Initial load
duke
parents:
diff changeset
1693
a61af66fc99e Initial load
duke
parents:
diff changeset
1694
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 // tag_count - pre-checked to be greater than or equal to 0
a61af66fc99e Initial load
duke
parents:
diff changeset
1696 // tags - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 // count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 // object_result_ptr - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 // tag_result_ptr - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1700 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 JvmtiEnv::GetObjectsWithTags(jint tag_count, const jlong* tags, jint* count_ptr, jobject** object_result_ptr, jlong** tag_result_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1702 TraceTime t("GetObjectsWithTags", TraceJVMTIObjectTagging);
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 return JvmtiTagMap::tag_map_for(this)->get_objects_with_tags((jlong*)tags, tag_count, count_ptr, object_result_ptr, tag_result_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 } /* end GetObjectsWithTags */
a61af66fc99e Initial load
duke
parents:
diff changeset
1705
a61af66fc99e Initial load
duke
parents:
diff changeset
1706
a61af66fc99e Initial load
duke
parents:
diff changeset
1707 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 JvmtiEnv::ForceGarbageCollection() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 Universe::heap()->collect(GCCause::_jvmti_force_gc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1710 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 } /* end ForceGarbageCollection */
a61af66fc99e Initial load
duke
parents:
diff changeset
1712
a61af66fc99e Initial load
duke
parents:
diff changeset
1713
a61af66fc99e Initial load
duke
parents:
diff changeset
1714 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 // Heap (1.0) functions
a61af66fc99e Initial load
duke
parents:
diff changeset
1716 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1717
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 // object_reference_callback - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 // user_data - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1720 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 JvmtiEnv::IterateOverObjectsReachableFromObject(jobject object, jvmtiObjectReferenceCallback object_reference_callback, const void* user_data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 oop o = JNIHandles::resolve_external_guard(object);
a61af66fc99e Initial load
duke
parents:
diff changeset
1723 NULL_CHECK(o, JVMTI_ERROR_INVALID_OBJECT);
a61af66fc99e Initial load
duke
parents:
diff changeset
1724 JvmtiTagMap::tag_map_for(this)->iterate_over_objects_reachable_from_object(object, object_reference_callback, user_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
1725 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1726 } /* end IterateOverObjectsReachableFromObject */
a61af66fc99e Initial load
duke
parents:
diff changeset
1727
a61af66fc99e Initial load
duke
parents:
diff changeset
1728
a61af66fc99e Initial load
duke
parents:
diff changeset
1729 // heap_root_callback - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1730 // stack_ref_callback - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1731 // object_ref_callback - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1732 // user_data - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1733 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1734 JvmtiEnv::IterateOverReachableObjects(jvmtiHeapRootCallback heap_root_callback, jvmtiStackReferenceCallback stack_ref_callback, jvmtiObjectReferenceCallback object_ref_callback, const void* user_data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1735 TraceTime t("IterateOverReachableObjects", TraceJVMTIObjectTagging);
a61af66fc99e Initial load
duke
parents:
diff changeset
1736 JvmtiTagMap::tag_map_for(this)->iterate_over_reachable_objects(heap_root_callback, stack_ref_callback, object_ref_callback, user_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
1737 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1738 } /* end IterateOverReachableObjects */
a61af66fc99e Initial load
duke
parents:
diff changeset
1739
a61af66fc99e Initial load
duke
parents:
diff changeset
1740
a61af66fc99e Initial load
duke
parents:
diff changeset
1741 // heap_object_callback - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1742 // user_data - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1743 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1744 JvmtiEnv::IterateOverHeap(jvmtiHeapObjectFilter object_filter, jvmtiHeapObjectCallback heap_object_callback, const void* user_data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1745 TraceTime t("IterateOverHeap", TraceJVMTIObjectTagging);
a61af66fc99e Initial load
duke
parents:
diff changeset
1746 Thread *thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1747 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1748 JvmtiTagMap::tag_map_for(this)->iterate_over_heap(object_filter, KlassHandle(), heap_object_callback, user_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
1749 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1750 } /* end IterateOverHeap */
a61af66fc99e Initial load
duke
parents:
diff changeset
1751
a61af66fc99e Initial load
duke
parents:
diff changeset
1752
a61af66fc99e Initial load
duke
parents:
diff changeset
1753 // k_mirror - may be primitive, this must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1754 // heap_object_callback - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1755 // user_data - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1756 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1757 JvmtiEnv::IterateOverInstancesOfClass(oop k_mirror, jvmtiHeapObjectFilter object_filter, jvmtiHeapObjectCallback heap_object_callback, const void* user_data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1758 if (java_lang_Class::is_primitive(k_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1759 // DO PRIMITIVE CLASS PROCESSING
a61af66fc99e Initial load
duke
parents:
diff changeset
1760 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1761 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1762 klassOop k_oop = java_lang_Class::as_klassOop(k_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 if (k_oop == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 return JVMTI_ERROR_INVALID_CLASS;
a61af66fc99e Initial load
duke
parents:
diff changeset
1765 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 Thread *thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1767 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 KlassHandle klass (thread, k_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
1769 TraceTime t("IterateOverInstancesOfClass", TraceJVMTIObjectTagging);
a61af66fc99e Initial load
duke
parents:
diff changeset
1770 JvmtiTagMap::tag_map_for(this)->iterate_over_heap(object_filter, klass, heap_object_callback, user_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
1771 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 } /* end IterateOverInstancesOfClass */
a61af66fc99e Initial load
duke
parents:
diff changeset
1773
a61af66fc99e Initial load
duke
parents:
diff changeset
1774
a61af66fc99e Initial load
duke
parents:
diff changeset
1775 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1776 // Local Variable functions
a61af66fc99e Initial load
duke
parents:
diff changeset
1777 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1778
a61af66fc99e Initial load
duke
parents:
diff changeset
1779 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1780 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1781 // java_thread - unchecked
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 // depth - pre-checked as non-negative
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 // value_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1784 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1785 JvmtiEnv::GetLocalObject(JavaThread* java_thread, jint depth, jint slot, jobject* value_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1787 // rm object is created to clean up the javaVFrame created in
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 // doit_prologue(), but after doit() is finished with it.
a61af66fc99e Initial load
duke
parents:
diff changeset
1789 ResourceMark rm(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1790
a61af66fc99e Initial load
duke
parents:
diff changeset
1791 VM_GetOrSetLocal op(java_thread, current_thread, depth, slot);
a61af66fc99e Initial load
duke
parents:
diff changeset
1792 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 jvmtiError err = op.result();
a61af66fc99e Initial load
duke
parents:
diff changeset
1794 if (err != JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
1796 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 *value_ptr = op.value().l;
a61af66fc99e Initial load
duke
parents:
diff changeset
1798 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1800 } /* end GetLocalObject */
a61af66fc99e Initial load
duke
parents:
diff changeset
1801
2019
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1802 // Threads_lock NOT held, java_thread not protected by lock
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1803 // java_thread - pre-checked
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1804 // java_thread - unchecked
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1805 // depth - pre-checked as non-negative
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1806 // value - pre-checked for NULL
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1807 jvmtiError
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2019
diff changeset
1808 JvmtiEnv::GetLocalInstance(JavaThread* java_thread, jint depth, jobject* value_ptr){
2019
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1809 JavaThread* current_thread = JavaThread::current();
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1810 // rm object is created to clean up the javaVFrame created in
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1811 // doit_prologue(), but after doit() is finished with it.
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1812 ResourceMark rm(current_thread);
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1813
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1814 VM_GetReceiver op(java_thread, current_thread, depth);
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1815 VMThread::execute(&op);
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1816 jvmtiError err = op.result();
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1817 if (err != JVMTI_ERROR_NONE) {
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1818 return err;
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1819 } else {
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2019
diff changeset
1820 *value_ptr = op.value().l;
2019
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1821 return JVMTI_ERROR_NONE;
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1822 }
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1823 } /* end GetLocalInstance */
09b4dd4f152b 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 1972
diff changeset
1824
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1825
a61af66fc99e Initial load
duke
parents:
diff changeset
1826 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1827 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 // java_thread - unchecked
a61af66fc99e Initial load
duke
parents:
diff changeset
1829 // depth - pre-checked as non-negative
a61af66fc99e Initial load
duke
parents:
diff changeset
1830 // value_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1831 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1832 JvmtiEnv::GetLocalInt(JavaThread* java_thread, jint depth, jint slot, jint* value_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1833 // rm object is created to clean up the javaVFrame created in
a61af66fc99e Initial load
duke
parents:
diff changeset
1834 // doit_prologue(), but after doit() is finished with it.
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1836
a61af66fc99e Initial load
duke
parents:
diff changeset
1837 VM_GetOrSetLocal op(java_thread, depth, slot, T_INT);
a61af66fc99e Initial load
duke
parents:
diff changeset
1838 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
1839 *value_ptr = op.value().i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1840 return op.result();
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 } /* end GetLocalInt */
a61af66fc99e Initial load
duke
parents:
diff changeset
1842
a61af66fc99e Initial load
duke
parents:
diff changeset
1843
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1846 // java_thread - unchecked
a61af66fc99e Initial load
duke
parents:
diff changeset
1847 // depth - pre-checked as non-negative
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 // value_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 JvmtiEnv::GetLocalLong(JavaThread* java_thread, jint depth, jint slot, jlong* value_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1851 // rm object is created to clean up the javaVFrame created in
a61af66fc99e Initial load
duke
parents:
diff changeset
1852 // doit_prologue(), but after doit() is finished with it.
a61af66fc99e Initial load
duke
parents:
diff changeset
1853 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1854
a61af66fc99e Initial load
duke
parents:
diff changeset
1855 VM_GetOrSetLocal op(java_thread, depth, slot, T_LONG);
a61af66fc99e Initial load
duke
parents:
diff changeset
1856 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
1857 *value_ptr = op.value().j;
a61af66fc99e Initial load
duke
parents:
diff changeset
1858 return op.result();
a61af66fc99e Initial load
duke
parents:
diff changeset
1859 } /* end GetLocalLong */
a61af66fc99e Initial load
duke
parents:
diff changeset
1860
a61af66fc99e Initial load
duke
parents:
diff changeset
1861
a61af66fc99e Initial load
duke
parents:
diff changeset
1862 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1863 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1864 // java_thread - unchecked
a61af66fc99e Initial load
duke
parents:
diff changeset
1865 // depth - pre-checked as non-negative
a61af66fc99e Initial load
duke
parents:
diff changeset
1866 // value_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1867 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1868 JvmtiEnv::GetLocalFloat(JavaThread* java_thread, jint depth, jint slot, jfloat* value_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1869 // rm object is created to clean up the javaVFrame created in
a61af66fc99e Initial load
duke
parents:
diff changeset
1870 // doit_prologue(), but after doit() is finished with it.
a61af66fc99e Initial load
duke
parents:
diff changeset
1871 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1872
a61af66fc99e Initial load
duke
parents:
diff changeset
1873 VM_GetOrSetLocal op(java_thread, depth, slot, T_FLOAT);
a61af66fc99e Initial load
duke
parents:
diff changeset
1874 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 *value_ptr = op.value().f;
a61af66fc99e Initial load
duke
parents:
diff changeset
1876 return op.result();
a61af66fc99e Initial load
duke
parents:
diff changeset
1877 } /* end GetLocalFloat */
a61af66fc99e Initial load
duke
parents:
diff changeset
1878
a61af66fc99e Initial load
duke
parents:
diff changeset
1879
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1881 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1882 // java_thread - unchecked
a61af66fc99e Initial load
duke
parents:
diff changeset
1883 // depth - pre-checked as non-negative
a61af66fc99e Initial load
duke
parents:
diff changeset
1884 // value_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1885 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1886 JvmtiEnv::GetLocalDouble(JavaThread* java_thread, jint depth, jint slot, jdouble* value_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1887 // rm object is created to clean up the javaVFrame created in
a61af66fc99e Initial load
duke
parents:
diff changeset
1888 // doit_prologue(), but after doit() is finished with it.
a61af66fc99e Initial load
duke
parents:
diff changeset
1889 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1890
a61af66fc99e Initial load
duke
parents:
diff changeset
1891 VM_GetOrSetLocal op(java_thread, depth, slot, T_DOUBLE);
a61af66fc99e Initial load
duke
parents:
diff changeset
1892 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 *value_ptr = op.value().d;
a61af66fc99e Initial load
duke
parents:
diff changeset
1894 return op.result();
a61af66fc99e Initial load
duke
parents:
diff changeset
1895 } /* end GetLocalDouble */
a61af66fc99e Initial load
duke
parents:
diff changeset
1896
a61af66fc99e Initial load
duke
parents:
diff changeset
1897
a61af66fc99e Initial load
duke
parents:
diff changeset
1898 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1899 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1900 // java_thread - unchecked
a61af66fc99e Initial load
duke
parents:
diff changeset
1901 // depth - pre-checked as non-negative
a61af66fc99e Initial load
duke
parents:
diff changeset
1902 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1903 JvmtiEnv::SetLocalObject(JavaThread* java_thread, jint depth, jint slot, jobject value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1904 // rm object is created to clean up the javaVFrame created in
a61af66fc99e Initial load
duke
parents:
diff changeset
1905 // doit_prologue(), but after doit() is finished with it.
a61af66fc99e Initial load
duke
parents:
diff changeset
1906 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1907 jvalue val;
a61af66fc99e Initial load
duke
parents:
diff changeset
1908 val.l = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1909 VM_GetOrSetLocal op(java_thread, depth, slot, T_OBJECT, val);
a61af66fc99e Initial load
duke
parents:
diff changeset
1910 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
1911 return op.result();
a61af66fc99e Initial load
duke
parents:
diff changeset
1912 } /* end SetLocalObject */
a61af66fc99e Initial load
duke
parents:
diff changeset
1913
a61af66fc99e Initial load
duke
parents:
diff changeset
1914
a61af66fc99e Initial load
duke
parents:
diff changeset
1915 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1916 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1917 // java_thread - unchecked
a61af66fc99e Initial load
duke
parents:
diff changeset
1918 // depth - pre-checked as non-negative
a61af66fc99e Initial load
duke
parents:
diff changeset
1919 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1920 JvmtiEnv::SetLocalInt(JavaThread* java_thread, jint depth, jint slot, jint value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1921 // rm object is created to clean up the javaVFrame created in
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 // doit_prologue(), but after doit() is finished with it.
a61af66fc99e Initial load
duke
parents:
diff changeset
1923 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1924 jvalue val;
a61af66fc99e Initial load
duke
parents:
diff changeset
1925 val.i = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1926 VM_GetOrSetLocal op(java_thread, depth, slot, T_INT, val);
a61af66fc99e Initial load
duke
parents:
diff changeset
1927 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
1928 return op.result();
a61af66fc99e Initial load
duke
parents:
diff changeset
1929 } /* end SetLocalInt */
a61af66fc99e Initial load
duke
parents:
diff changeset
1930
a61af66fc99e Initial load
duke
parents:
diff changeset
1931
a61af66fc99e Initial load
duke
parents:
diff changeset
1932 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1933 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1934 // java_thread - unchecked
a61af66fc99e Initial load
duke
parents:
diff changeset
1935 // depth - pre-checked as non-negative
a61af66fc99e Initial load
duke
parents:
diff changeset
1936 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1937 JvmtiEnv::SetLocalLong(JavaThread* java_thread, jint depth, jint slot, jlong value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 // rm object is created to clean up the javaVFrame created in
a61af66fc99e Initial load
duke
parents:
diff changeset
1939 // doit_prologue(), but after doit() is finished with it.
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1941 jvalue val;
a61af66fc99e Initial load
duke
parents:
diff changeset
1942 val.j = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1943 VM_GetOrSetLocal op(java_thread, depth, slot, T_LONG, val);
a61af66fc99e Initial load
duke
parents:
diff changeset
1944 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 return op.result();
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 } /* end SetLocalLong */
a61af66fc99e Initial load
duke
parents:
diff changeset
1947
a61af66fc99e Initial load
duke
parents:
diff changeset
1948
a61af66fc99e Initial load
duke
parents:
diff changeset
1949 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 // java_thread - unchecked
a61af66fc99e Initial load
duke
parents:
diff changeset
1952 // depth - pre-checked as non-negative
a61af66fc99e Initial load
duke
parents:
diff changeset
1953 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 JvmtiEnv::SetLocalFloat(JavaThread* java_thread, jint depth, jint slot, jfloat value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 // rm object is created to clean up the javaVFrame created in
a61af66fc99e Initial load
duke
parents:
diff changeset
1956 // doit_prologue(), but after doit() is finished with it.
a61af66fc99e Initial load
duke
parents:
diff changeset
1957 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 jvalue val;
a61af66fc99e Initial load
duke
parents:
diff changeset
1959 val.f = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1960 VM_GetOrSetLocal op(java_thread, depth, slot, T_FLOAT, val);
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 return op.result();
a61af66fc99e Initial load
duke
parents:
diff changeset
1963 } /* end SetLocalFloat */
a61af66fc99e Initial load
duke
parents:
diff changeset
1964
a61af66fc99e Initial load
duke
parents:
diff changeset
1965
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 // java_thread - unchecked
a61af66fc99e Initial load
duke
parents:
diff changeset
1969 // depth - pre-checked as non-negative
a61af66fc99e Initial load
duke
parents:
diff changeset
1970 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1971 JvmtiEnv::SetLocalDouble(JavaThread* java_thread, jint depth, jint slot, jdouble value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1972 // rm object is created to clean up the javaVFrame created in
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 // doit_prologue(), but after doit() is finished with it.
a61af66fc99e Initial load
duke
parents:
diff changeset
1974 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 jvalue val;
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 val.d = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 VM_GetOrSetLocal op(java_thread, depth, slot, T_DOUBLE, val);
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 return op.result();
a61af66fc99e Initial load
duke
parents:
diff changeset
1980 } /* end SetLocalDouble */
a61af66fc99e Initial load
duke
parents:
diff changeset
1981
a61af66fc99e Initial load
duke
parents:
diff changeset
1982
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 // Breakpoint functions
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1986
a61af66fc99e Initial load
duke
parents:
diff changeset
1987 // method_oop - pre-checked for validity, but may be NULL meaning obsolete method
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 JvmtiEnv::SetBreakpoint(methodOop method_oop, jlocation location) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 NULL_CHECK(method_oop, JVMTI_ERROR_INVALID_METHODID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 if (location < 0) { // simple invalid location check first
a61af66fc99e Initial load
duke
parents:
diff changeset
1992 return JVMTI_ERROR_INVALID_LOCATION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 // verify that the breakpoint is not past the end of the method
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 if (location >= (jlocation) method_oop->code_size()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 return JVMTI_ERROR_INVALID_LOCATION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1998
a61af66fc99e Initial load
duke
parents:
diff changeset
1999 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 JvmtiBreakpoint bp(method_oop, location);
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 JvmtiBreakpoints& jvmti_breakpoints = JvmtiCurrentBreakpoints::get_jvmti_breakpoints();
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 if (jvmti_breakpoints.set(bp) == JVMTI_ERROR_DUPLICATE)
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 return JVMTI_ERROR_DUPLICATE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2004
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 if (TraceJVMTICalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 jvmti_breakpoints.print();
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2008
a61af66fc99e Initial load
duke
parents:
diff changeset
2009 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 } /* end SetBreakpoint */
a61af66fc99e Initial load
duke
parents:
diff changeset
2011
a61af66fc99e Initial load
duke
parents:
diff changeset
2012
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 // method_oop - pre-checked for validity, but may be NULL meaning obsolete method
a61af66fc99e Initial load
duke
parents:
diff changeset
2014 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 JvmtiEnv::ClearBreakpoint(methodOop method_oop, jlocation location) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 NULL_CHECK(method_oop, JVMTI_ERROR_INVALID_METHODID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2017
a61af66fc99e Initial load
duke
parents:
diff changeset
2018 if (location < 0) { // simple invalid location check first
a61af66fc99e Initial load
duke
parents:
diff changeset
2019 return JVMTI_ERROR_INVALID_LOCATION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2020 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2021
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 // verify that the breakpoint is not past the end of the method
a61af66fc99e Initial load
duke
parents:
diff changeset
2023 if (location >= (jlocation) method_oop->code_size()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 return JVMTI_ERROR_INVALID_LOCATION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2026
a61af66fc99e Initial load
duke
parents:
diff changeset
2027 JvmtiBreakpoint bp(method_oop, location);
a61af66fc99e Initial load
duke
parents:
diff changeset
2028
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 JvmtiBreakpoints& jvmti_breakpoints = JvmtiCurrentBreakpoints::get_jvmti_breakpoints();
a61af66fc99e Initial load
duke
parents:
diff changeset
2030 if (jvmti_breakpoints.clear(bp) == JVMTI_ERROR_NOT_FOUND)
a61af66fc99e Initial load
duke
parents:
diff changeset
2031 return JVMTI_ERROR_NOT_FOUND;
a61af66fc99e Initial load
duke
parents:
diff changeset
2032
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 if (TraceJVMTICalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2034 jvmti_breakpoints.print();
a61af66fc99e Initial load
duke
parents:
diff changeset
2035 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2036
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 } /* end ClearBreakpoint */
a61af66fc99e Initial load
duke
parents:
diff changeset
2039
a61af66fc99e Initial load
duke
parents:
diff changeset
2040
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 // Watched Field functions
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2044
a61af66fc99e Initial load
duke
parents:
diff changeset
2045 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 JvmtiEnv::SetFieldAccessWatch(fieldDescriptor* fdesc_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 // make sure we haven't set this watch before
a61af66fc99e Initial load
duke
parents:
diff changeset
2048 if (fdesc_ptr->is_field_access_watched()) return JVMTI_ERROR_DUPLICATE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2049 fdesc_ptr->set_is_field_access_watched(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2050
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 JvmtiEventController::change_field_watch(JVMTI_EVENT_FIELD_ACCESS, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2052
a61af66fc99e Initial load
duke
parents:
diff changeset
2053 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 } /* end SetFieldAccessWatch */
a61af66fc99e Initial load
duke
parents:
diff changeset
2055
a61af66fc99e Initial load
duke
parents:
diff changeset
2056
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 JvmtiEnv::ClearFieldAccessWatch(fieldDescriptor* fdesc_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 // make sure we have a watch to clear
a61af66fc99e Initial load
duke
parents:
diff changeset
2060 if (!fdesc_ptr->is_field_access_watched()) return JVMTI_ERROR_NOT_FOUND;
a61af66fc99e Initial load
duke
parents:
diff changeset
2061 fdesc_ptr->set_is_field_access_watched(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2062
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 JvmtiEventController::change_field_watch(JVMTI_EVENT_FIELD_ACCESS, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2064
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 } /* end ClearFieldAccessWatch */
a61af66fc99e Initial load
duke
parents:
diff changeset
2067
a61af66fc99e Initial load
duke
parents:
diff changeset
2068
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2070 JvmtiEnv::SetFieldModificationWatch(fieldDescriptor* fdesc_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2071 // make sure we haven't set this watch before
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 if (fdesc_ptr->is_field_modification_watched()) return JVMTI_ERROR_DUPLICATE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 fdesc_ptr->set_is_field_modification_watched(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2074
a61af66fc99e Initial load
duke
parents:
diff changeset
2075 JvmtiEventController::change_field_watch(JVMTI_EVENT_FIELD_MODIFICATION, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2076
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2078 } /* end SetFieldModificationWatch */
a61af66fc99e Initial load
duke
parents:
diff changeset
2079
a61af66fc99e Initial load
duke
parents:
diff changeset
2080
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 JvmtiEnv::ClearFieldModificationWatch(fieldDescriptor* fdesc_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 // make sure we have a watch to clear
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 if (!fdesc_ptr->is_field_modification_watched()) return JVMTI_ERROR_NOT_FOUND;
a61af66fc99e Initial load
duke
parents:
diff changeset
2085 fdesc_ptr->set_is_field_modification_watched(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2086
a61af66fc99e Initial load
duke
parents:
diff changeset
2087 JvmtiEventController::change_field_watch(JVMTI_EVENT_FIELD_MODIFICATION, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2088
a61af66fc99e Initial load
duke
parents:
diff changeset
2089 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2090 } /* end ClearFieldModificationWatch */
a61af66fc99e Initial load
duke
parents:
diff changeset
2091
a61af66fc99e Initial load
duke
parents:
diff changeset
2092 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2093 // Class functions
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2095
a61af66fc99e Initial load
duke
parents:
diff changeset
2096
a61af66fc99e Initial load
duke
parents:
diff changeset
2097 // k_mirror - may be primitive, this must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2098 // signature_ptr - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 // generic_ptr - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2100 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2101 JvmtiEnv::GetClassSignature(oop k_mirror, char** signature_ptr, char** generic_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2102 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2103 bool isPrimitive = java_lang_Class::is_primitive(k_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 klassOop k = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 if (!isPrimitive) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 k = java_lang_Class::as_klassOop(k_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
2107 NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
a61af66fc99e Initial load
duke
parents:
diff changeset
2108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2109 if (signature_ptr != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2110 char* result = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2111 if (isPrimitive) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2112 char tchar = type2char(java_lang_Class::primitive_type(k_mirror));
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 result = (char*) jvmtiMalloc(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2114 result[0] = tchar;
a61af66fc99e Initial load
duke
parents:
diff changeset
2115 result[1] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2117 const char* class_sig = Klass::cast(k)->signature_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 result = (char *) jvmtiMalloc(strlen(class_sig)+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2119 strcpy(result, class_sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 *signature_ptr = result;
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2123 if (generic_ptr != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2124 *generic_ptr = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2125 if (!isPrimitive && Klass::cast(k)->oop_is_instance()) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2100
diff changeset
2126 Symbol* soo = instanceKlass::cast(k)->generic_signature();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2127 if (soo != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2128 const char *gen_sig = soo->as_C_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
2129 if (gen_sig != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2130 char* gen_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
2131 jvmtiError err = allocate(strlen(gen_sig) + 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
2132 (unsigned char **)&gen_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 if (err != JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
2135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2136 strcpy(gen_result, gen_sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
2137 *generic_ptr = gen_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
2138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2139 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2142 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2143 } /* end GetClassSignature */
a61af66fc99e Initial load
duke
parents:
diff changeset
2144
a61af66fc99e Initial load
duke
parents:
diff changeset
2145
a61af66fc99e Initial load
duke
parents:
diff changeset
2146 // k_mirror - may be primitive, this must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 // status_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2149 JvmtiEnv::GetClassStatus(oop k_mirror, jint* status_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2150 jint result = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 if (java_lang_Class::is_primitive(k_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2152 result |= JVMTI_CLASS_STATUS_PRIMITIVE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2153 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 klassOop k = java_lang_Class::as_klassOop(k_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
a61af66fc99e Initial load
duke
parents:
diff changeset
2156 result = Klass::cast(k)->jvmti_class_status();
a61af66fc99e Initial load
duke
parents:
diff changeset
2157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2158 *status_ptr = result;
a61af66fc99e Initial load
duke
parents:
diff changeset
2159
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 } /* end GetClassStatus */
a61af66fc99e Initial load
duke
parents:
diff changeset
2162
a61af66fc99e Initial load
duke
parents:
diff changeset
2163
a61af66fc99e Initial load
duke
parents:
diff changeset
2164 // k_mirror - may be primitive, this must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 // source_name_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 JvmtiEnv::GetSourceFileName(oop k_mirror, char** source_name_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 if (java_lang_Class::is_primitive(k_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 return JVMTI_ERROR_ABSENT_INFORMATION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2170 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 klassOop k_klass = java_lang_Class::as_klassOop(k_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 NULL_CHECK(k_klass, JVMTI_ERROR_INVALID_CLASS);
a61af66fc99e Initial load
duke
parents:
diff changeset
2173
a61af66fc99e Initial load
duke
parents:
diff changeset
2174 if (!Klass::cast(k_klass)->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 return JVMTI_ERROR_ABSENT_INFORMATION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2177
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2100
diff changeset
2178 Symbol* sfnOop = instanceKlass::cast(k_klass)->source_file_name();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2179 NULL_CHECK(sfnOop, JVMTI_ERROR_ABSENT_INFORMATION);
a61af66fc99e Initial load
duke
parents:
diff changeset
2180 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2182 ResourceMark rm(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 const char* sfncp = (const char*) sfnOop->as_C_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
2184 *source_name_ptr = (char *) jvmtiMalloc(strlen(sfncp)+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 strcpy(*source_name_ptr, sfncp);
a61af66fc99e Initial load
duke
parents:
diff changeset
2186 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2187
a61af66fc99e Initial load
duke
parents:
diff changeset
2188 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2189 } /* end GetSourceFileName */
a61af66fc99e Initial load
duke
parents:
diff changeset
2190
a61af66fc99e Initial load
duke
parents:
diff changeset
2191
a61af66fc99e Initial load
duke
parents:
diff changeset
2192 // k_mirror - may be primitive, this must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2193 // modifiers_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2195 JvmtiEnv::GetClassModifiers(oop k_mirror, jint* modifiers_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2196 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2197 jint result = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2198 if (!java_lang_Class::is_primitive(k_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2199 klassOop k = java_lang_Class::as_klassOop(k_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
2200 NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 assert((Klass::cast(k)->oop_is_instance() || Klass::cast(k)->oop_is_array()), "should be an instance or an array klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
2202 result = Klass::cast(k)->compute_modifier_flags(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 JavaThread* THREAD = current_thread; // pass to macros
a61af66fc99e Initial load
duke
parents:
diff changeset
2204 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2206 return JVMTI_ERROR_INTERNAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2207 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2208
a61af66fc99e Initial load
duke
parents:
diff changeset
2209 // Reset the deleted ACC_SUPER bit ( deleted in compute_modifier_flags()).
a61af66fc99e Initial load
duke
parents:
diff changeset
2210 if(Klass::cast(k)->is_super()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2211 result |= JVM_ACC_SUPER;
a61af66fc99e Initial load
duke
parents:
diff changeset
2212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2213 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2214 result = (JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC);
a61af66fc99e Initial load
duke
parents:
diff changeset
2215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2216 *modifiers_ptr = result;
a61af66fc99e Initial load
duke
parents:
diff changeset
2217
a61af66fc99e Initial load
duke
parents:
diff changeset
2218 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2219 } /* end GetClassModifiers */
a61af66fc99e Initial load
duke
parents:
diff changeset
2220
a61af66fc99e Initial load
duke
parents:
diff changeset
2221
a61af66fc99e Initial load
duke
parents:
diff changeset
2222 // k_mirror - may be primitive, this must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2223 // method_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2224 // methods_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2225 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2226 JvmtiEnv::GetClassMethods(oop k_mirror, jint* method_count_ptr, jmethodID** methods_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2227 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2228 HandleMark hm(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2229
a61af66fc99e Initial load
duke
parents:
diff changeset
2230 if (java_lang_Class::is_primitive(k_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2231 *method_count_ptr = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 *methods_ptr = (jmethodID*) jvmtiMalloc(0 * sizeof(jmethodID));
a61af66fc99e Initial load
duke
parents:
diff changeset
2233 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2234 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2235 klassOop k = java_lang_Class::as_klassOop(k_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
2236 NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
a61af66fc99e Initial load
duke
parents:
diff changeset
2237
a61af66fc99e Initial load
duke
parents:
diff changeset
2238 // Return CLASS_NOT_PREPARED error as per JVMTI spec.
a61af66fc99e Initial load
duke
parents:
diff changeset
2239 if (!(Klass::cast(k)->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) )) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2240 return JVMTI_ERROR_CLASS_NOT_PREPARED;
a61af66fc99e Initial load
duke
parents:
diff changeset
2241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2242
a61af66fc99e Initial load
duke
parents:
diff changeset
2243 if (!Klass::cast(k)->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2244 *method_count_ptr = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2245 *methods_ptr = (jmethodID*) jvmtiMalloc(0 * sizeof(jmethodID));
a61af66fc99e Initial load
duke
parents:
diff changeset
2246 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2248 instanceKlassHandle instanceK_h(current_thread, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
2249 // Allocate the result and fill it in
a61af66fc99e Initial load
duke
parents:
diff changeset
2250 int result_length = instanceK_h->methods()->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
2251 jmethodID* result_list = (jmethodID*)jvmtiMalloc(result_length * sizeof(jmethodID));
a61af66fc99e Initial load
duke
parents:
diff changeset
2252 int index;
a61af66fc99e Initial load
duke
parents:
diff changeset
2253 if (JvmtiExport::can_maintain_original_method_order()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2254 // Use the original method ordering indices stored in the class, so we can emit
a61af66fc99e Initial load
duke
parents:
diff changeset
2255 // jmethodIDs in the order they appeared in the class file
a61af66fc99e Initial load
duke
parents:
diff changeset
2256 for (index = 0; index < result_length; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2257 methodOop m = methodOop(instanceK_h->methods()->obj_at(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
2258 int original_index = instanceK_h->method_ordering()->int_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2259 assert(original_index >= 0 && original_index < result_length, "invalid original method index");
a61af66fc99e Initial load
duke
parents:
diff changeset
2260 jmethodID id = m->jmethod_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
2261 result_list[original_index] = id;
a61af66fc99e Initial load
duke
parents:
diff changeset
2262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2263 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2264 // otherwise just copy in any order
a61af66fc99e Initial load
duke
parents:
diff changeset
2265 for (index = 0; index < result_length; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2266 methodOop m = methodOop(instanceK_h->methods()->obj_at(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
2267 jmethodID id = m->jmethod_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
2268 result_list[index] = id;
a61af66fc99e Initial load
duke
parents:
diff changeset
2269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2271 // Fill in return value.
a61af66fc99e Initial load
duke
parents:
diff changeset
2272 *method_count_ptr = result_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
2273 *methods_ptr = result_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
2274
a61af66fc99e Initial load
duke
parents:
diff changeset
2275 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2276 } /* end GetClassMethods */
a61af66fc99e Initial load
duke
parents:
diff changeset
2277
a61af66fc99e Initial load
duke
parents:
diff changeset
2278
a61af66fc99e Initial load
duke
parents:
diff changeset
2279 // k_mirror - may be primitive, this must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2280 // field_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2281 // fields_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2282 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2283 JvmtiEnv::GetClassFields(oop k_mirror, jint* field_count_ptr, jfieldID** fields_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2284 if (java_lang_Class::is_primitive(k_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2285 *field_count_ptr = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2286 *fields_ptr = (jfieldID*) jvmtiMalloc(0 * sizeof(jfieldID));
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2289 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2290 HandleMark hm(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2291 klassOop k = java_lang_Class::as_klassOop(k_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
2292 NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
a61af66fc99e Initial load
duke
parents:
diff changeset
2293
a61af66fc99e Initial load
duke
parents:
diff changeset
2294 // Return CLASS_NOT_PREPARED error as per JVMTI spec.
a61af66fc99e Initial load
duke
parents:
diff changeset
2295 if (!(Klass::cast(k)->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) )) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2296 return JVMTI_ERROR_CLASS_NOT_PREPARED;
a61af66fc99e Initial load
duke
parents:
diff changeset
2297 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2298
a61af66fc99e Initial load
duke
parents:
diff changeset
2299 if (!Klass::cast(k)->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2300 *field_count_ptr = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 *fields_ptr = (jfieldID*) jvmtiMalloc(0 * sizeof(jfieldID));
a61af66fc99e Initial load
duke
parents:
diff changeset
2302 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2303 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2304
a61af66fc99e Initial load
duke
parents:
diff changeset
2305
a61af66fc99e Initial load
duke
parents:
diff changeset
2306 instanceKlassHandle instanceK_h(current_thread, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
2307
a61af66fc99e Initial load
duke
parents:
diff changeset
2308 int result_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2309 // First, count the fields.
a61af66fc99e Initial load
duke
parents:
diff changeset
2310 FilteredFieldStream flds(instanceK_h, true, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2311 result_count = flds.field_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
2312
a61af66fc99e Initial load
duke
parents:
diff changeset
2313 // Allocate the result and fill it in
a61af66fc99e Initial load
duke
parents:
diff changeset
2314 jfieldID* result_list = (jfieldID*) jvmtiMalloc(result_count * sizeof(jfieldID));
a61af66fc99e Initial load
duke
parents:
diff changeset
2315 // The JVMTI spec requires fields in the order they occur in the class file,
a61af66fc99e Initial load
duke
parents:
diff changeset
2316 // this is the reverse order of what FieldStream hands out.
a61af66fc99e Initial load
duke
parents:
diff changeset
2317 int id_index = (result_count - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2318
a61af66fc99e Initial load
duke
parents:
diff changeset
2319 for (FilteredFieldStream src_st(instanceK_h, true, true); !src_st.eos(); src_st.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2320 result_list[id_index--] = jfieldIDWorkaround::to_jfieldID(
a61af66fc99e Initial load
duke
parents:
diff changeset
2321 instanceK_h, src_st.offset(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2322 src_st.access_flags().is_static());
a61af66fc99e Initial load
duke
parents:
diff changeset
2323 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2324 assert(id_index == -1, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
2325 // Fill in the results
a61af66fc99e Initial load
duke
parents:
diff changeset
2326 *field_count_ptr = result_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
2327 *fields_ptr = result_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
2328
a61af66fc99e Initial load
duke
parents:
diff changeset
2329 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2330 } /* end GetClassFields */
a61af66fc99e Initial load
duke
parents:
diff changeset
2331
a61af66fc99e Initial load
duke
parents:
diff changeset
2332
a61af66fc99e Initial load
duke
parents:
diff changeset
2333 // k_mirror - may be primitive, this must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2334 // interface_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2335 // interfaces_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2336 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2337 JvmtiEnv::GetImplementedInterfaces(oop k_mirror, jint* interface_count_ptr, jclass** interfaces_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2338 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2339 if (java_lang_Class::is_primitive(k_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2340 *interface_count_ptr = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2341 *interfaces_ptr = (jclass*) jvmtiMalloc(0 * sizeof(jclass));
a61af66fc99e Initial load
duke
parents:
diff changeset
2342 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2343 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2344 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2345 HandleMark hm(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2346 klassOop k = java_lang_Class::as_klassOop(k_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
2347 NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
a61af66fc99e Initial load
duke
parents:
diff changeset
2348
a61af66fc99e Initial load
duke
parents:
diff changeset
2349 // Return CLASS_NOT_PREPARED error as per JVMTI spec.
a61af66fc99e Initial load
duke
parents:
diff changeset
2350 if (!(Klass::cast(k)->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) ))
a61af66fc99e Initial load
duke
parents:
diff changeset
2351 return JVMTI_ERROR_CLASS_NOT_PREPARED;
a61af66fc99e Initial load
duke
parents:
diff changeset
2352
a61af66fc99e Initial load
duke
parents:
diff changeset
2353 if (!Klass::cast(k)->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2354 *interface_count_ptr = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2355 *interfaces_ptr = (jclass*) jvmtiMalloc(0 * sizeof(jclass));
a61af66fc99e Initial load
duke
parents:
diff changeset
2356 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2357 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2358
a61af66fc99e Initial load
duke
parents:
diff changeset
2359 objArrayHandle interface_list(current_thread, instanceKlass::cast(k)->local_interfaces());
a61af66fc99e Initial load
duke
parents:
diff changeset
2360 const int result_length = (interface_list.is_null() ? 0 : interface_list->length());
a61af66fc99e Initial load
duke
parents:
diff changeset
2361 jclass* result_list = (jclass*) jvmtiMalloc(result_length * sizeof(jclass));
a61af66fc99e Initial load
duke
parents:
diff changeset
2362 for (int i_index = 0; i_index < result_length; i_index += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2363 oop oop_at = interface_list->obj_at(i_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2364 assert(oop_at->is_klass(), "interfaces must be klassOops");
a61af66fc99e Initial load
duke
parents:
diff changeset
2365 klassOop klassOop_at = klassOop(oop_at); // ???: is there a better way?
a61af66fc99e Initial load
duke
parents:
diff changeset
2366 assert(Klass::cast(klassOop_at)->is_interface(), "interfaces must be interfaces");
a61af66fc99e Initial load
duke
parents:
diff changeset
2367 oop mirror_at = Klass::cast(klassOop_at)->java_mirror();
a61af66fc99e Initial load
duke
parents:
diff changeset
2368 Handle handle_at = Handle(current_thread, mirror_at);
a61af66fc99e Initial load
duke
parents:
diff changeset
2369 result_list[i_index] = (jclass) jni_reference(handle_at);
a61af66fc99e Initial load
duke
parents:
diff changeset
2370 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2371 *interface_count_ptr = result_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
2372 *interfaces_ptr = result_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
2373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2374
a61af66fc99e Initial load
duke
parents:
diff changeset
2375 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2376 } /* end GetImplementedInterfaces */
a61af66fc99e Initial load
duke
parents:
diff changeset
2377
a61af66fc99e Initial load
duke
parents:
diff changeset
2378
a61af66fc99e Initial load
duke
parents:
diff changeset
2379 // k_mirror - may be primitive, this must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2380 // minor_version_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2381 // major_version_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2382 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2383 JvmtiEnv::GetClassVersionNumbers(oop k_mirror, jint* minor_version_ptr, jint* major_version_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2384 if (java_lang_Class::is_primitive(k_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2385 return JVMTI_ERROR_ABSENT_INFORMATION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2386 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2387 klassOop k_oop = java_lang_Class::as_klassOop(k_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
2388 Thread *thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2389 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2390 KlassHandle klass(thread, k_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
2391
a61af66fc99e Initial load
duke
parents:
diff changeset
2392 jint status = klass->jvmti_class_status();
a61af66fc99e Initial load
duke
parents:
diff changeset
2393 if (status & (JVMTI_CLASS_STATUS_ERROR)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2394 return JVMTI_ERROR_INVALID_CLASS;
a61af66fc99e Initial load
duke
parents:
diff changeset
2395 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2396 if (status & (JVMTI_CLASS_STATUS_ARRAY)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2397 return JVMTI_ERROR_ABSENT_INFORMATION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2399
a61af66fc99e Initial load
duke
parents:
diff changeset
2400 instanceKlassHandle ik(thread, k_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
2401 *minor_version_ptr = ik->minor_version();
a61af66fc99e Initial load
duke
parents:
diff changeset
2402 *major_version_ptr = ik->major_version();
a61af66fc99e Initial load
duke
parents:
diff changeset
2403
a61af66fc99e Initial load
duke
parents:
diff changeset
2404 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2405 } /* end GetClassVersionNumbers */
a61af66fc99e Initial load
duke
parents:
diff changeset
2406
a61af66fc99e Initial load
duke
parents:
diff changeset
2407
a61af66fc99e Initial load
duke
parents:
diff changeset
2408 // k_mirror - may be primitive, this must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2409 // constant_pool_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2410 // constant_pool_byte_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2411 // constant_pool_bytes_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2412 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2413 JvmtiEnv::GetConstantPool(oop k_mirror, jint* constant_pool_count_ptr, jint* constant_pool_byte_count_ptr, unsigned char** constant_pool_bytes_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2414 if (java_lang_Class::is_primitive(k_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2415 return JVMTI_ERROR_ABSENT_INFORMATION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2416 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2417
a61af66fc99e Initial load
duke
parents:
diff changeset
2418 klassOop k_oop = java_lang_Class::as_klassOop(k_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
2419 Thread *thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2420 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2421 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2422 KlassHandle klass(thread, k_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
2423
a61af66fc99e Initial load
duke
parents:
diff changeset
2424 jint status = klass->jvmti_class_status();
a61af66fc99e Initial load
duke
parents:
diff changeset
2425 if (status & (JVMTI_CLASS_STATUS_ERROR)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2426 return JVMTI_ERROR_INVALID_CLASS;
a61af66fc99e Initial load
duke
parents:
diff changeset
2427 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2428 if (status & (JVMTI_CLASS_STATUS_ARRAY)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2429 return JVMTI_ERROR_ABSENT_INFORMATION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2430 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2431
a61af66fc99e Initial load
duke
parents:
diff changeset
2432 instanceKlassHandle ikh(thread, k_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
2433 constantPoolHandle constants(thread, ikh->constants());
a61af66fc99e Initial load
duke
parents:
diff changeset
2434 ObjectLocker ol(constants, thread); // lock constant pool while we query it
a61af66fc99e Initial load
duke
parents:
diff changeset
2435
a61af66fc99e Initial load
duke
parents:
diff changeset
2436 JvmtiConstantPoolReconstituter reconstituter(ikh);
a61af66fc99e Initial load
duke
parents:
diff changeset
2437 if (reconstituter.get_error() != JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2438 return reconstituter.get_error();
a61af66fc99e Initial load
duke
parents:
diff changeset
2439 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2440
a61af66fc99e Initial load
duke
parents:
diff changeset
2441 unsigned char *cpool_bytes;
a61af66fc99e Initial load
duke
parents:
diff changeset
2442 int cpool_size = reconstituter.cpool_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2443 if (reconstituter.get_error() != JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2444 return reconstituter.get_error();
a61af66fc99e Initial load
duke
parents:
diff changeset
2445 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2446 jvmtiError res = allocate(cpool_size, &cpool_bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
2447 if (res != JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2448 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
2449 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2450 reconstituter.copy_cpool_bytes(cpool_bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
2451 if (reconstituter.get_error() != JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2452 return reconstituter.get_error();
a61af66fc99e Initial load
duke
parents:
diff changeset
2453 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2454
a61af66fc99e Initial load
duke
parents:
diff changeset
2455 *constant_pool_count_ptr = constants->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
2456 *constant_pool_byte_count_ptr = cpool_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
2457 *constant_pool_bytes_ptr = cpool_bytes;
a61af66fc99e Initial load
duke
parents:
diff changeset
2458
a61af66fc99e Initial load
duke
parents:
diff changeset
2459 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2460 } /* end GetConstantPool */
a61af66fc99e Initial load
duke
parents:
diff changeset
2461
a61af66fc99e Initial load
duke
parents:
diff changeset
2462
a61af66fc99e Initial load
duke
parents:
diff changeset
2463 // k_mirror - may be primitive, this must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2464 // is_interface_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2465 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2466 JvmtiEnv::IsInterface(oop k_mirror, jboolean* is_interface_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2467 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2468 bool result = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2469 if (!java_lang_Class::is_primitive(k_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2470 klassOop k = java_lang_Class::as_klassOop(k_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
2471 if (k != NULL && Klass::cast(k)->is_interface()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2472 result = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2473 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2474 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2475 *is_interface_ptr = result;
a61af66fc99e Initial load
duke
parents:
diff changeset
2476 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2477
a61af66fc99e Initial load
duke
parents:
diff changeset
2478 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2479 } /* end IsInterface */
a61af66fc99e Initial load
duke
parents:
diff changeset
2480
a61af66fc99e Initial load
duke
parents:
diff changeset
2481
a61af66fc99e Initial load
duke
parents:
diff changeset
2482 // k_mirror - may be primitive, this must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2483 // is_array_class_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2484 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2485 JvmtiEnv::IsArrayClass(oop k_mirror, jboolean* is_array_class_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2486 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2487 bool result = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2488 if (!java_lang_Class::is_primitive(k_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2489 klassOop k = java_lang_Class::as_klassOop(k_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
2490 if (k != NULL && Klass::cast(k)->oop_is_array()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2491 result = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2493 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2494 *is_array_class_ptr = result;
a61af66fc99e Initial load
duke
parents:
diff changeset
2495 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2496
a61af66fc99e Initial load
duke
parents:
diff changeset
2497 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2498 } /* end IsArrayClass */
a61af66fc99e Initial load
duke
parents:
diff changeset
2499
a61af66fc99e Initial load
duke
parents:
diff changeset
2500
a61af66fc99e Initial load
duke
parents:
diff changeset
2501 // k_mirror - may be primitive, this must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2502 // classloader_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2503 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2504 JvmtiEnv::GetClassLoader(oop k_mirror, jobject* classloader_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2505 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2506 if (java_lang_Class::is_primitive(k_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2507 *classloader_ptr = (jclass) jni_reference(Handle());
a61af66fc99e Initial load
duke
parents:
diff changeset
2508 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2509 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2510 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2511 HandleMark hm(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2512 klassOop k = java_lang_Class::as_klassOop(k_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
2513 NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
a61af66fc99e Initial load
duke
parents:
diff changeset
2514
a61af66fc99e Initial load
duke
parents:
diff changeset
2515 oop result_oop = Klass::cast(k)->class_loader();
a61af66fc99e Initial load
duke
parents:
diff changeset
2516 if (result_oop == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2517 *classloader_ptr = (jclass) jni_reference(Handle());
a61af66fc99e Initial load
duke
parents:
diff changeset
2518 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2519 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2520 Handle result_handle = Handle(current_thread, result_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
2521 jclass result_jnihandle = (jclass) jni_reference(result_handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
2522 *classloader_ptr = result_jnihandle;
a61af66fc99e Initial load
duke
parents:
diff changeset
2523 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2524 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2525 } /* end GetClassLoader */
a61af66fc99e Initial load
duke
parents:
diff changeset
2526
a61af66fc99e Initial load
duke
parents:
diff changeset
2527
a61af66fc99e Initial load
duke
parents:
diff changeset
2528 // k_mirror - may be primitive, this must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2529 // source_debug_extension_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2530 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2531 JvmtiEnv::GetSourceDebugExtension(oop k_mirror, char** source_debug_extension_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2532 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2533 if (java_lang_Class::is_primitive(k_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2534 return JVMTI_ERROR_ABSENT_INFORMATION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2536 klassOop k = java_lang_Class::as_klassOop(k_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
2537 NULL_CHECK(k, JVMTI_ERROR_INVALID_CLASS);
a61af66fc99e Initial load
duke
parents:
diff changeset
2538 if (!Klass::cast(k)->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2539 return JVMTI_ERROR_ABSENT_INFORMATION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2540 }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2100
diff changeset
2541 Symbol* sdeOop = instanceKlass::cast(k)->source_debug_extension();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2542 NULL_CHECK(sdeOop, JVMTI_ERROR_ABSENT_INFORMATION);
a61af66fc99e Initial load
duke
parents:
diff changeset
2543
a61af66fc99e Initial load
duke
parents:
diff changeset
2544 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2545 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2546 ResourceMark rm(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2547 const char* sdecp = (const char*) sdeOop->as_C_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
2548 *source_debug_extension_ptr = (char *) jvmtiMalloc(strlen(sdecp)+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2549 strcpy(*source_debug_extension_ptr, sdecp);
a61af66fc99e Initial load
duke
parents:
diff changeset
2550 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2551 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2552
a61af66fc99e Initial load
duke
parents:
diff changeset
2553 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2554 } /* end GetSourceDebugExtension */
a61af66fc99e Initial load
duke
parents:
diff changeset
2555
a61af66fc99e Initial load
duke
parents:
diff changeset
2556 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2557 // Object functions
a61af66fc99e Initial load
duke
parents:
diff changeset
2558 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2559
a61af66fc99e Initial load
duke
parents:
diff changeset
2560 // hash_code_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2561 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2562 JvmtiEnv::GetObjectHashCode(jobject object, jint* hash_code_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2563 oop mirror = JNIHandles::resolve_external_guard(object);
a61af66fc99e Initial load
duke
parents:
diff changeset
2564 NULL_CHECK(mirror, JVMTI_ERROR_INVALID_OBJECT);
a61af66fc99e Initial load
duke
parents:
diff changeset
2565 NULL_CHECK(hash_code_ptr, JVMTI_ERROR_NULL_POINTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
2566
a61af66fc99e Initial load
duke
parents:
diff changeset
2567 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2568 jint result = (jint) mirror->identity_hash();
a61af66fc99e Initial load
duke
parents:
diff changeset
2569 *hash_code_ptr = result;
a61af66fc99e Initial load
duke
parents:
diff changeset
2570 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2571 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2572 } /* end GetObjectHashCode */
a61af66fc99e Initial load
duke
parents:
diff changeset
2573
a61af66fc99e Initial load
duke
parents:
diff changeset
2574
a61af66fc99e Initial load
duke
parents:
diff changeset
2575 // info_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2576 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2577 JvmtiEnv::GetObjectMonitorUsage(jobject object, jvmtiMonitorUsage* info_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2578 JavaThread* calling_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2579 jvmtiError err = get_object_monitor_usage(calling_thread, object, info_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2580 if (err == JVMTI_ERROR_THREAD_NOT_SUSPENDED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2581 // Some of the critical threads were not suspended. go to a safepoint and try again
a61af66fc99e Initial load
duke
parents:
diff changeset
2582 VM_GetObjectMonitorUsage op(this, calling_thread, object, info_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2583 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
2584 err = op.result();
a61af66fc99e Initial load
duke
parents:
diff changeset
2585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2586 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
2587 } /* end GetObjectMonitorUsage */
a61af66fc99e Initial load
duke
parents:
diff changeset
2588
a61af66fc99e Initial load
duke
parents:
diff changeset
2589
a61af66fc99e Initial load
duke
parents:
diff changeset
2590 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2591 // Field functions
a61af66fc99e Initial load
duke
parents:
diff changeset
2592 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2593
a61af66fc99e Initial load
duke
parents:
diff changeset
2594 // name_ptr - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2595 // signature_ptr - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2596 // generic_ptr - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2597 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2598 JvmtiEnv::GetFieldName(fieldDescriptor* fdesc_ptr, char** name_ptr, char** signature_ptr, char** generic_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2599 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2600 ResourceMark rm(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2601 if (name_ptr == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2602 // just don't return the name
a61af66fc99e Initial load
duke
parents:
diff changeset
2603 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2604 const char* fieldName = fdesc_ptr->name()->as_C_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
2605 *name_ptr = (char*) jvmtiMalloc(strlen(fieldName) + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2606 if (*name_ptr == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
2607 return JVMTI_ERROR_OUT_OF_MEMORY;
a61af66fc99e Initial load
duke
parents:
diff changeset
2608 strcpy(*name_ptr, fieldName);
a61af66fc99e Initial load
duke
parents:
diff changeset
2609 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2610 if (signature_ptr== NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2611 // just don't return the signature
a61af66fc99e Initial load
duke
parents:
diff changeset
2612 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2613 const char* fieldSignature = fdesc_ptr->signature()->as_C_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
2614 *signature_ptr = (char*) jvmtiMalloc(strlen(fieldSignature) + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2615 if (*signature_ptr == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
2616 return JVMTI_ERROR_OUT_OF_MEMORY;
a61af66fc99e Initial load
duke
parents:
diff changeset
2617 strcpy(*signature_ptr, fieldSignature);
a61af66fc99e Initial load
duke
parents:
diff changeset
2618 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2619 if (generic_ptr != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2620 *generic_ptr = NULL;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2100
diff changeset
2621 Symbol* soop = fdesc_ptr->generic_signature();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2622 if (soop != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2623 const char* gen_sig = soop->as_C_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
2624 if (gen_sig != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2625 jvmtiError err = allocate(strlen(gen_sig) + 1, (unsigned char **)generic_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2626 if (err != JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2627 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
2628 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2629 strcpy(*generic_ptr, gen_sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
2630 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2631 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2632 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2633 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2634 } /* end GetFieldName */
a61af66fc99e Initial load
duke
parents:
diff changeset
2635
a61af66fc99e Initial load
duke
parents:
diff changeset
2636
a61af66fc99e Initial load
duke
parents:
diff changeset
2637 // declaring_class_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2638 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2639 JvmtiEnv::GetFieldDeclaringClass(fieldDescriptor* fdesc_ptr, jclass* declaring_class_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2640
a61af66fc99e Initial load
duke
parents:
diff changeset
2641 *declaring_class_ptr = get_jni_class_non_null(fdesc_ptr->field_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
2642 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2643 } /* end GetFieldDeclaringClass */
a61af66fc99e Initial load
duke
parents:
diff changeset
2644
a61af66fc99e Initial load
duke
parents:
diff changeset
2645
a61af66fc99e Initial load
duke
parents:
diff changeset
2646 // modifiers_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2647 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2648 JvmtiEnv::GetFieldModifiers(fieldDescriptor* fdesc_ptr, jint* modifiers_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2649
a61af66fc99e Initial load
duke
parents:
diff changeset
2650 AccessFlags resultFlags = fdesc_ptr->access_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
2651 jint result = resultFlags.as_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
2652 *modifiers_ptr = result;
a61af66fc99e Initial load
duke
parents:
diff changeset
2653
a61af66fc99e Initial load
duke
parents:
diff changeset
2654 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2655 } /* end GetFieldModifiers */
a61af66fc99e Initial load
duke
parents:
diff changeset
2656
a61af66fc99e Initial load
duke
parents:
diff changeset
2657
a61af66fc99e Initial load
duke
parents:
diff changeset
2658 // is_synthetic_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2659 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2660 JvmtiEnv::IsFieldSynthetic(fieldDescriptor* fdesc_ptr, jboolean* is_synthetic_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2661 *is_synthetic_ptr = fdesc_ptr->is_synthetic();
a61af66fc99e Initial load
duke
parents:
diff changeset
2662 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2663 } /* end IsFieldSynthetic */
a61af66fc99e Initial load
duke
parents:
diff changeset
2664
a61af66fc99e Initial load
duke
parents:
diff changeset
2665
a61af66fc99e Initial load
duke
parents:
diff changeset
2666 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2667 // Method functions
a61af66fc99e Initial load
duke
parents:
diff changeset
2668 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2669
a61af66fc99e Initial load
duke
parents:
diff changeset
2670 // method_oop - pre-checked for validity, but may be NULL meaning obsolete method
a61af66fc99e Initial load
duke
parents:
diff changeset
2671 // name_ptr - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2672 // signature_ptr - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2673 // generic_ptr - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
2674 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2675 JvmtiEnv::GetMethodName(methodOop method_oop, char** name_ptr, char** signature_ptr, char** generic_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2676 NULL_CHECK(method_oop, JVMTI_ERROR_INVALID_METHODID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2677 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2678
a61af66fc99e Initial load
duke
parents:
diff changeset
2679 ResourceMark rm(current_thread); // get the utf8 name and signature
a61af66fc99e Initial load
duke
parents:
diff changeset
2680 if (name_ptr == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2681 // just don't return the name
a61af66fc99e Initial load
duke
parents:
diff changeset
2682 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2683 const char* utf8_name = (const char *) method_oop->name()->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2684 *name_ptr = (char *) jvmtiMalloc(strlen(utf8_name)+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2685 strcpy(*name_ptr, utf8_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2686 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2687 if (signature_ptr == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2688 // just don't return the signature
a61af66fc99e Initial load
duke
parents:
diff changeset
2689 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2690 const char* utf8_signature = (const char *) method_oop->signature()->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2691 *signature_ptr = (char *) jvmtiMalloc(strlen(utf8_signature) + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2692 strcpy(*signature_ptr, utf8_signature);
a61af66fc99e Initial load
duke
parents:
diff changeset
2693 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2694
a61af66fc99e Initial load
duke
parents:
diff changeset
2695 if (generic_ptr != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2696 *generic_ptr = NULL;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2100
diff changeset
2697 Symbol* soop = method_oop->generic_signature();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2698 if (soop != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2699 const char* gen_sig = soop->as_C_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
2700 if (gen_sig != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2701 jvmtiError err = allocate(strlen(gen_sig) + 1, (unsigned char **)generic_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2702 if (err != JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2703 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
2704 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2705 strcpy(*generic_ptr, gen_sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
2706 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2707 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2708 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2709 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2710 } /* end GetMethodName */
a61af66fc99e Initial load
duke
parents:
diff changeset
2711
a61af66fc99e Initial load
duke
parents:
diff changeset
2712
a61af66fc99e Initial load
duke
parents:
diff changeset
2713 // method_oop - pre-checked for validity, but may be NULL meaning obsolete method
a61af66fc99e Initial load
duke
parents:
diff changeset
2714 // declaring_class_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2715 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2716 JvmtiEnv::GetMethodDeclaringClass(methodOop method_oop, jclass* declaring_class_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2717 NULL_CHECK(method_oop, JVMTI_ERROR_INVALID_METHODID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2718 (*declaring_class_ptr) = get_jni_class_non_null(method_oop->method_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
2719 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2720 } /* end GetMethodDeclaringClass */
a61af66fc99e Initial load
duke
parents:
diff changeset
2721
a61af66fc99e Initial load
duke
parents:
diff changeset
2722
a61af66fc99e Initial load
duke
parents:
diff changeset
2723 // method_oop - pre-checked for validity, but may be NULL meaning obsolete method
a61af66fc99e Initial load
duke
parents:
diff changeset
2724 // modifiers_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2725 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2726 JvmtiEnv::GetMethodModifiers(methodOop method_oop, jint* modifiers_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2727 NULL_CHECK(method_oop, JVMTI_ERROR_INVALID_METHODID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2728 (*modifiers_ptr) = method_oop->access_flags().as_int() & JVM_RECOGNIZED_METHOD_MODIFIERS;
a61af66fc99e Initial load
duke
parents:
diff changeset
2729 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2730 } /* end GetMethodModifiers */
a61af66fc99e Initial load
duke
parents:
diff changeset
2731
a61af66fc99e Initial load
duke
parents:
diff changeset
2732
a61af66fc99e Initial load
duke
parents:
diff changeset
2733 // method_oop - pre-checked for validity, but may be NULL meaning obsolete method
a61af66fc99e Initial load
duke
parents:
diff changeset
2734 // max_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2735 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2736 JvmtiEnv::GetMaxLocals(methodOop method_oop, jint* max_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2737 NULL_CHECK(method_oop, JVMTI_ERROR_INVALID_METHODID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2738 // get max stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2739 (*max_ptr) = method_oop->max_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
2740 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2741 } /* end GetMaxLocals */
a61af66fc99e Initial load
duke
parents:
diff changeset
2742
a61af66fc99e Initial load
duke
parents:
diff changeset
2743
a61af66fc99e Initial load
duke
parents:
diff changeset
2744 // method_oop - pre-checked for validity, but may be NULL meaning obsolete method
a61af66fc99e Initial load
duke
parents:
diff changeset
2745 // size_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2746 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2747 JvmtiEnv::GetArgumentsSize(methodOop method_oop, jint* size_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2748 NULL_CHECK(method_oop, JVMTI_ERROR_INVALID_METHODID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2749 // get size of arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
2750
a61af66fc99e Initial load
duke
parents:
diff changeset
2751 (*size_ptr) = method_oop->size_of_parameters();
a61af66fc99e Initial load
duke
parents:
diff changeset
2752 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2753 } /* end GetArgumentsSize */
a61af66fc99e Initial load
duke
parents:
diff changeset
2754
a61af66fc99e Initial load
duke
parents:
diff changeset
2755
a61af66fc99e Initial load
duke
parents:
diff changeset
2756 // method_oop - pre-checked for validity, but may be NULL meaning obsolete method
a61af66fc99e Initial load
duke
parents:
diff changeset
2757 // entry_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2758 // table_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2759 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2760 JvmtiEnv::GetLineNumberTable(methodOop method_oop, jint* entry_count_ptr, jvmtiLineNumberEntry** table_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2761 NULL_CHECK(method_oop, JVMTI_ERROR_INVALID_METHODID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2762 if (!method_oop->has_linenumber_table()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2763 return (JVMTI_ERROR_ABSENT_INFORMATION);
a61af66fc99e Initial load
duke
parents:
diff changeset
2764 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2765
a61af66fc99e Initial load
duke
parents:
diff changeset
2766 // The line number table is compressed so we don't know how big it is until decompressed.
a61af66fc99e Initial load
duke
parents:
diff changeset
2767 // Decompression is really fast so we just do it twice.
a61af66fc99e Initial load
duke
parents:
diff changeset
2768
a61af66fc99e Initial load
duke
parents:
diff changeset
2769 // Compute size of table
a61af66fc99e Initial load
duke
parents:
diff changeset
2770 jint num_entries = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2771 CompressedLineNumberReadStream stream(method_oop->compressed_linenumber_table());
a61af66fc99e Initial load
duke
parents:
diff changeset
2772 while (stream.read_pair()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2773 num_entries++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2774 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2775 jvmtiLineNumberEntry *jvmti_table =
a61af66fc99e Initial load
duke
parents:
diff changeset
2776 (jvmtiLineNumberEntry *)jvmtiMalloc(num_entries * (sizeof(jvmtiLineNumberEntry)));
a61af66fc99e Initial load
duke
parents:
diff changeset
2777
a61af66fc99e Initial load
duke
parents:
diff changeset
2778 // Fill jvmti table
a61af66fc99e Initial load
duke
parents:
diff changeset
2779 if (num_entries > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2780 int index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2781 CompressedLineNumberReadStream stream(method_oop->compressed_linenumber_table());
a61af66fc99e Initial load
duke
parents:
diff changeset
2782 while (stream.read_pair()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2783 jvmti_table[index].start_location = (jlocation) stream.bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
2784 jvmti_table[index].line_number = (jint) stream.line();
a61af66fc99e Initial load
duke
parents:
diff changeset
2785 index++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2786 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2787 assert(index == num_entries, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
2788 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2789
a61af66fc99e Initial load
duke
parents:
diff changeset
2790 // Set up results
a61af66fc99e Initial load
duke
parents:
diff changeset
2791 (*entry_count_ptr) = num_entries;
a61af66fc99e Initial load
duke
parents:
diff changeset
2792 (*table_ptr) = jvmti_table;
a61af66fc99e Initial load
duke
parents:
diff changeset
2793
a61af66fc99e Initial load
duke
parents:
diff changeset
2794 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2795 } /* end GetLineNumberTable */
a61af66fc99e Initial load
duke
parents:
diff changeset
2796
a61af66fc99e Initial load
duke
parents:
diff changeset
2797
a61af66fc99e Initial load
duke
parents:
diff changeset
2798 // method_oop - pre-checked for validity, but may be NULL meaning obsolete method
a61af66fc99e Initial load
duke
parents:
diff changeset
2799 // start_location_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2800 // end_location_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2801 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2802 JvmtiEnv::GetMethodLocation(methodOop method_oop, jlocation* start_location_ptr, jlocation* end_location_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2803
a61af66fc99e Initial load
duke
parents:
diff changeset
2804 NULL_CHECK(method_oop, JVMTI_ERROR_INVALID_METHODID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2805 // get start and end location
a61af66fc99e Initial load
duke
parents:
diff changeset
2806 (*end_location_ptr) = (jlocation) (method_oop->code_size() - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2807 if (method_oop->code_size() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2808 // there is no code so there is no start location
a61af66fc99e Initial load
duke
parents:
diff changeset
2809 (*start_location_ptr) = (jlocation)(-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2810 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2811 (*start_location_ptr) = (jlocation)(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2812 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2813
a61af66fc99e Initial load
duke
parents:
diff changeset
2814 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2815 } /* end GetMethodLocation */
a61af66fc99e Initial load
duke
parents:
diff changeset
2816
a61af66fc99e Initial load
duke
parents:
diff changeset
2817
a61af66fc99e Initial load
duke
parents:
diff changeset
2818 // method_oop - pre-checked for validity, but may be NULL meaning obsolete method
a61af66fc99e Initial load
duke
parents:
diff changeset
2819 // entry_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2820 // table_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2821 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2822 JvmtiEnv::GetLocalVariableTable(methodOop method_oop, jint* entry_count_ptr, jvmtiLocalVariableEntry** table_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2823
a61af66fc99e Initial load
duke
parents:
diff changeset
2824 NULL_CHECK(method_oop, JVMTI_ERROR_INVALID_METHODID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2825 JavaThread* current_thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2826
a61af66fc99e Initial load
duke
parents:
diff changeset
2827 // does the klass have any local variable information?
a61af66fc99e Initial load
duke
parents:
diff changeset
2828 instanceKlass* ik = instanceKlass::cast(method_oop->method_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
2829 if (!ik->access_flags().has_localvariable_table()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2830 return (JVMTI_ERROR_ABSENT_INFORMATION);
a61af66fc99e Initial load
duke
parents:
diff changeset
2831 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2832
a61af66fc99e Initial load
duke
parents:
diff changeset
2833 constantPoolOop constants = method_oop->constants();
a61af66fc99e Initial load
duke
parents:
diff changeset
2834 NULL_CHECK(constants, JVMTI_ERROR_ABSENT_INFORMATION);
a61af66fc99e Initial load
duke
parents:
diff changeset
2835
a61af66fc99e Initial load
duke
parents:
diff changeset
2836 // in the vm localvariable table representation, 6 consecutive elements in the table
a61af66fc99e Initial load
duke
parents:
diff changeset
2837 // represent a 6-tuple of shorts
a61af66fc99e Initial load
duke
parents:
diff changeset
2838 // [start_pc, length, name_index, descriptor_index, signature_index, index]
a61af66fc99e Initial load
duke
parents:
diff changeset
2839 jint num_entries = method_oop->localvariable_table_length();
a61af66fc99e Initial load
duke
parents:
diff changeset
2840 jvmtiLocalVariableEntry *jvmti_table = (jvmtiLocalVariableEntry *)
a61af66fc99e Initial load
duke
parents:
diff changeset
2841 jvmtiMalloc(num_entries * (sizeof(jvmtiLocalVariableEntry)));
a61af66fc99e Initial load
duke
parents:
diff changeset
2842
a61af66fc99e Initial load
duke
parents:
diff changeset
2843 if (num_entries > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2844 LocalVariableTableElement* table = method_oop->localvariable_table_start();
a61af66fc99e Initial load
duke
parents:
diff changeset
2845 for (int i = 0; i < num_entries; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2846 // get the 5 tuple information from the vm table
a61af66fc99e Initial load
duke
parents:
diff changeset
2847 jlocation start_location = (jlocation) table[i].start_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
2848 jint length = (jint) table[i].length;
a61af66fc99e Initial load
duke
parents:
diff changeset
2849 int name_index = (int) table[i].name_cp_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
2850 int signature_index = (int) table[i].descriptor_cp_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
2851 int generic_signature_index = (int) table[i].signature_cp_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
2852 jint slot = (jint) table[i].slot;
a61af66fc99e Initial load
duke
parents:
diff changeset
2853
a61af66fc99e Initial load
duke
parents:
diff changeset
2854 // get utf8 name and signature
a61af66fc99e Initial load
duke
parents:
diff changeset
2855 char *name_buf = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2856 char *sig_buf = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2857 char *gen_sig_buf = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2858 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2859 ResourceMark rm(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2860
a61af66fc99e Initial load
duke
parents:
diff changeset
2861 const char *utf8_name = (const char *) constants->symbol_at(name_index)->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2862 name_buf = (char *) jvmtiMalloc(strlen(utf8_name)+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2863 strcpy(name_buf, utf8_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2864
a61af66fc99e Initial load
duke
parents:
diff changeset
2865 const char *utf8_signature = (const char *) constants->symbol_at(signature_index)->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2866 sig_buf = (char *) jvmtiMalloc(strlen(utf8_signature)+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2867 strcpy(sig_buf, utf8_signature);
a61af66fc99e Initial load
duke
parents:
diff changeset
2868
a61af66fc99e Initial load
duke
parents:
diff changeset
2869 if (generic_signature_index > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2870 const char *utf8_gen_sign = (const char *)
a61af66fc99e Initial load
duke
parents:
diff changeset
2871 constants->symbol_at(generic_signature_index)->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2872 gen_sig_buf = (char *) jvmtiMalloc(strlen(utf8_gen_sign)+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2873 strcpy(gen_sig_buf, utf8_gen_sign);
a61af66fc99e Initial load
duke
parents:
diff changeset
2874 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2875 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2876
a61af66fc99e Initial load
duke
parents:
diff changeset
2877 // fill in the jvmti local variable table
a61af66fc99e Initial load
duke
parents:
diff changeset
2878 jvmti_table[i].start_location = start_location;
a61af66fc99e Initial load
duke
parents:
diff changeset
2879 jvmti_table[i].length = length;
a61af66fc99e Initial load
duke
parents:
diff changeset
2880 jvmti_table[i].name = name_buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
2881 jvmti_table[i].signature = sig_buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
2882 jvmti_table[i].generic_signature = gen_sig_buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
2883 jvmti_table[i].slot = slot;
a61af66fc99e Initial load
duke
parents:
diff changeset
2884 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2885 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2886
a61af66fc99e Initial load
duke
parents:
diff changeset
2887 // set results
a61af66fc99e Initial load
duke
parents:
diff changeset
2888 (*entry_count_ptr) = num_entries;
a61af66fc99e Initial load
duke
parents:
diff changeset
2889 (*table_ptr) = jvmti_table;
a61af66fc99e Initial load
duke
parents:
diff changeset
2890
a61af66fc99e Initial load
duke
parents:
diff changeset
2891 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2892 } /* end GetLocalVariableTable */
a61af66fc99e Initial load
duke
parents:
diff changeset
2893
a61af66fc99e Initial load
duke
parents:
diff changeset
2894
a61af66fc99e Initial load
duke
parents:
diff changeset
2895 // method_oop - pre-checked for validity, but may be NULL meaning obsolete method
a61af66fc99e Initial load
duke
parents:
diff changeset
2896 // bytecode_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2897 // bytecodes_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2898 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2899 JvmtiEnv::GetBytecodes(methodOop method_oop, jint* bytecode_count_ptr, unsigned char** bytecodes_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2900 NULL_CHECK(method_oop, JVMTI_ERROR_INVALID_METHODID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2901
a61af66fc99e Initial load
duke
parents:
diff changeset
2902 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2903 methodHandle method(method_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
2904 jint size = (jint)method->code_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2905 jvmtiError err = allocate(size, bytecodes_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2906 if (err != JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2907 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
2908 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2909
a61af66fc99e Initial load
duke
parents:
diff changeset
2910 (*bytecode_count_ptr) = size;
a61af66fc99e Initial load
duke
parents:
diff changeset
2911 // get byte codes
a61af66fc99e Initial load
duke
parents:
diff changeset
2912 JvmtiClassFileReconstituter::copy_bytecodes(method, *bytecodes_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2913
a61af66fc99e Initial load
duke
parents:
diff changeset
2914 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2915 } /* end GetBytecodes */
a61af66fc99e Initial load
duke
parents:
diff changeset
2916
a61af66fc99e Initial load
duke
parents:
diff changeset
2917
a61af66fc99e Initial load
duke
parents:
diff changeset
2918 // method_oop - pre-checked for validity, but may be NULL meaning obsolete method
a61af66fc99e Initial load
duke
parents:
diff changeset
2919 // is_native_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2920 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2921 JvmtiEnv::IsMethodNative(methodOop method_oop, jboolean* is_native_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2922 NULL_CHECK(method_oop, JVMTI_ERROR_INVALID_METHODID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2923 (*is_native_ptr) = method_oop->is_native();
a61af66fc99e Initial load
duke
parents:
diff changeset
2924 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2925 } /* end IsMethodNative */
a61af66fc99e Initial load
duke
parents:
diff changeset
2926
a61af66fc99e Initial load
duke
parents:
diff changeset
2927
a61af66fc99e Initial load
duke
parents:
diff changeset
2928 // method_oop - pre-checked for validity, but may be NULL meaning obsolete method
a61af66fc99e Initial load
duke
parents:
diff changeset
2929 // is_synthetic_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2930 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2931 JvmtiEnv::IsMethodSynthetic(methodOop method_oop, jboolean* is_synthetic_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2932 NULL_CHECK(method_oop, JVMTI_ERROR_INVALID_METHODID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2933 (*is_synthetic_ptr) = method_oop->is_synthetic();
a61af66fc99e Initial load
duke
parents:
diff changeset
2934 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2935 } /* end IsMethodSynthetic */
a61af66fc99e Initial load
duke
parents:
diff changeset
2936
a61af66fc99e Initial load
duke
parents:
diff changeset
2937
a61af66fc99e Initial load
duke
parents:
diff changeset
2938 // method_oop - pre-checked for validity, but may be NULL meaning obsolete method
a61af66fc99e Initial load
duke
parents:
diff changeset
2939 // is_obsolete_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2940 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2941 JvmtiEnv::IsMethodObsolete(methodOop method_oop, jboolean* is_obsolete_ptr) {
1121
98cd9901c161 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1120
diff changeset
2942 if (use_version_1_0_semantics() &&
98cd9901c161 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1120
diff changeset
2943 get_capabilities()->can_redefine_classes == 0) {
98cd9901c161 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1120
diff changeset
2944 // This JvmtiEnv requested version 1.0 semantics and this function
98cd9901c161 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1120
diff changeset
2945 // requires the can_redefine_classes capability in version 1.0 so
98cd9901c161 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1120
diff changeset
2946 // we need to return an error here.
98cd9901c161 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1120
diff changeset
2947 return JVMTI_ERROR_MUST_POSSESS_CAPABILITY;
98cd9901c161 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1120
diff changeset
2948 }
98cd9901c161 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1120
diff changeset
2949
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2950 if (method_oop == NULL || method_oop->is_obsolete()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2951 *is_obsolete_ptr = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2952 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2953 *is_obsolete_ptr = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2954 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2955 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2956 } /* end IsMethodObsolete */
a61af66fc99e Initial load
duke
parents:
diff changeset
2957
a61af66fc99e Initial load
duke
parents:
diff changeset
2958 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2959 // Raw Monitor functions
a61af66fc99e Initial load
duke
parents:
diff changeset
2960 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2961
a61af66fc99e Initial load
duke
parents:
diff changeset
2962 // name - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2963 // monitor_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2964 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2965 JvmtiEnv::CreateRawMonitor(const char* name, jrawMonitorID* monitor_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2966 JvmtiRawMonitor* rmonitor = new JvmtiRawMonitor(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2967 NULL_CHECK(rmonitor, JVMTI_ERROR_OUT_OF_MEMORY);
a61af66fc99e Initial load
duke
parents:
diff changeset
2968
a61af66fc99e Initial load
duke
parents:
diff changeset
2969 *monitor_ptr = (jrawMonitorID)rmonitor;
a61af66fc99e Initial load
duke
parents:
diff changeset
2970
a61af66fc99e Initial load
duke
parents:
diff changeset
2971 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2972 } /* end CreateRawMonitor */
a61af66fc99e Initial load
duke
parents:
diff changeset
2973
a61af66fc99e Initial load
duke
parents:
diff changeset
2974
a61af66fc99e Initial load
duke
parents:
diff changeset
2975 // rmonitor - pre-checked for validity
a61af66fc99e Initial load
duke
parents:
diff changeset
2976 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
2977 JvmtiEnv::DestroyRawMonitor(JvmtiRawMonitor * rmonitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2978 if (Threads::number_of_threads() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2979 // Remove this monitor from pending raw monitors list
a61af66fc99e Initial load
duke
parents:
diff changeset
2980 // if it has entered in onload or start phase.
a61af66fc99e Initial load
duke
parents:
diff changeset
2981 JvmtiPendingMonitors::destroy(rmonitor);
a61af66fc99e Initial load
duke
parents:
diff changeset
2982 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2983 Thread* thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2984 if (rmonitor->is_entered(thread)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2985 // The caller owns this monitor which we are about to destroy.
a61af66fc99e Initial load
duke
parents:
diff changeset
2986 // We exit the underlying synchronization object so that the
a61af66fc99e Initial load
duke
parents:
diff changeset
2987 // "delete monitor" call below can work without an assertion
a61af66fc99e Initial load
duke
parents:
diff changeset
2988 // failure on systems that don't like destroying synchronization
a61af66fc99e Initial load
duke
parents:
diff changeset
2989 // objects that are locked.
a61af66fc99e Initial load
duke
parents:
diff changeset
2990 int r;
a61af66fc99e Initial load
duke
parents:
diff changeset
2991 intptr_t recursion = rmonitor->recursions();
a61af66fc99e Initial load
duke
parents:
diff changeset
2992 for (intptr_t i=0; i <= recursion; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2993 r = rmonitor->raw_exit(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2994 assert(r == ObjectMonitor::OM_OK, "raw_exit should have worked");
a61af66fc99e Initial load
duke
parents:
diff changeset
2995 if (r != ObjectMonitor::OM_OK) { // robustness
a61af66fc99e Initial load
duke
parents:
diff changeset
2996 return JVMTI_ERROR_INTERNAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2997 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2998 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2999 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3000 if (rmonitor->owner() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3001 // The caller is trying to destroy a monitor that is locked by
a61af66fc99e Initial load
duke
parents:
diff changeset
3002 // someone else. While this is not forbidden by the JVMTI
a61af66fc99e Initial load
duke
parents:
diff changeset
3003 // spec, it will cause an assertion failure on systems that don't
a61af66fc99e Initial load
duke
parents:
diff changeset
3004 // like destroying synchronization objects that are locked.
a61af66fc99e Initial load
duke
parents:
diff changeset
3005 // We indicate a problem with the error return (and leak the
a61af66fc99e Initial load
duke
parents:
diff changeset
3006 // monitor's memory).
a61af66fc99e Initial load
duke
parents:
diff changeset
3007 return JVMTI_ERROR_NOT_MONITOR_OWNER;
a61af66fc99e Initial load
duke
parents:
diff changeset
3008 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3009 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3010
a61af66fc99e Initial load
duke
parents:
diff changeset
3011 delete rmonitor;
a61af66fc99e Initial load
duke
parents:
diff changeset
3012
a61af66fc99e Initial load
duke
parents:
diff changeset
3013 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3014 } /* end DestroyRawMonitor */
a61af66fc99e Initial load
duke
parents:
diff changeset
3015
a61af66fc99e Initial load
duke
parents:
diff changeset
3016
a61af66fc99e Initial load
duke
parents:
diff changeset
3017 // rmonitor - pre-checked for validity
a61af66fc99e Initial load
duke
parents:
diff changeset
3018 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3019 JvmtiEnv::RawMonitorEnter(JvmtiRawMonitor * rmonitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3020 if (Threads::number_of_threads() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3021 // No JavaThreads exist so ObjectMonitor enter cannot be
a61af66fc99e Initial load
duke
parents:
diff changeset
3022 // used, add this raw monitor to the pending list.
a61af66fc99e Initial load
duke
parents:
diff changeset
3023 // The pending monitors will be actually entered when
a61af66fc99e Initial load
duke
parents:
diff changeset
3024 // the VM is setup.
a61af66fc99e Initial load
duke
parents:
diff changeset
3025 // See transition_pending_raw_monitors in create_vm()
a61af66fc99e Initial load
duke
parents:
diff changeset
3026 // in thread.cpp.
a61af66fc99e Initial load
duke
parents:
diff changeset
3027 JvmtiPendingMonitors::enter(rmonitor);
a61af66fc99e Initial load
duke
parents:
diff changeset
3028 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3029 int r;
a61af66fc99e Initial load
duke
parents:
diff changeset
3030 Thread* thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
3031
a61af66fc99e Initial load
duke
parents:
diff changeset
3032 if (thread->is_Java_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3033 JavaThread* current_thread = (JavaThread*)thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
3034
a61af66fc99e Initial load
duke
parents:
diff changeset
3035 #ifdef PROPER_TRANSITIONS
a61af66fc99e Initial load
duke
parents:
diff changeset
3036 // Not really unknown but ThreadInVMfromNative does more than we want
a61af66fc99e Initial load
duke
parents:
diff changeset
3037 ThreadInVMfromUnknown __tiv;
a61af66fc99e Initial load
duke
parents:
diff changeset
3038 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3039 ThreadBlockInVM __tbivm(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3040 r = rmonitor->raw_enter(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3041 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3042 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
3043 /* Transition to thread_blocked without entering vm state */
a61af66fc99e Initial load
duke
parents:
diff changeset
3044 /* This is really evil. Normally you can't undo _thread_blocked */
a61af66fc99e Initial load
duke
parents:
diff changeset
3045 /* transitions like this because it would cause us to miss a */
a61af66fc99e Initial load
duke
parents:
diff changeset
3046 /* safepoint but since the thread was already in _thread_in_native */
a61af66fc99e Initial load
duke
parents:
diff changeset
3047 /* the thread is not leaving a safepoint safe state and it will */
a61af66fc99e Initial load
duke
parents:
diff changeset
3048 /* block when it tries to return from native. We can't safepoint */
a61af66fc99e Initial load
duke
parents:
diff changeset
3049 /* block in here because we could deadlock the vmthread. Blech. */
a61af66fc99e Initial load
duke
parents:
diff changeset
3050
a61af66fc99e Initial load
duke
parents:
diff changeset
3051 JavaThreadState state = current_thread->thread_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
3052 assert(state == _thread_in_native, "Must be _thread_in_native");
a61af66fc99e Initial load
duke
parents:
diff changeset
3053 // frame should already be walkable since we are in native
a61af66fc99e Initial load
duke
parents:
diff changeset
3054 assert(!current_thread->has_last_Java_frame() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3055 current_thread->frame_anchor()->walkable(), "Must be walkable");
a61af66fc99e Initial load
duke
parents:
diff changeset
3056 current_thread->set_thread_state(_thread_blocked);
a61af66fc99e Initial load
duke
parents:
diff changeset
3057
a61af66fc99e Initial load
duke
parents:
diff changeset
3058 r = rmonitor->raw_enter(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3059 // restore state, still at a safepoint safe state
a61af66fc99e Initial load
duke
parents:
diff changeset
3060 current_thread->set_thread_state(state);
a61af66fc99e Initial load
duke
parents:
diff changeset
3061
a61af66fc99e Initial load
duke
parents:
diff changeset
3062 #endif /* PROPER_TRANSITIONS */
a61af66fc99e Initial load
duke
parents:
diff changeset
3063 assert(r == ObjectMonitor::OM_OK, "raw_enter should have worked");
a61af66fc99e Initial load
duke
parents:
diff changeset
3064 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3065 if (thread->is_VM_thread() || thread->is_ConcurrentGC_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3066 r = rmonitor->raw_enter(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3067 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3068 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
3069 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3070 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3071
a61af66fc99e Initial load
duke
parents:
diff changeset
3072 if (r != ObjectMonitor::OM_OK) { // robustness
a61af66fc99e Initial load
duke
parents:
diff changeset
3073 return JVMTI_ERROR_INTERNAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3074 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3075 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3076 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3077 } /* end RawMonitorEnter */
a61af66fc99e Initial load
duke
parents:
diff changeset
3078
a61af66fc99e Initial load
duke
parents:
diff changeset
3079
a61af66fc99e Initial load
duke
parents:
diff changeset
3080 // rmonitor - pre-checked for validity
a61af66fc99e Initial load
duke
parents:
diff changeset
3081 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3082 JvmtiEnv::RawMonitorExit(JvmtiRawMonitor * rmonitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3083 jvmtiError err = JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3084
a61af66fc99e Initial load
duke
parents:
diff changeset
3085 if (Threads::number_of_threads() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3086 // No JavaThreads exist so just remove this monitor from the pending list.
a61af66fc99e Initial load
duke
parents:
diff changeset
3087 // Bool value from exit is false if rmonitor is not in the list.
a61af66fc99e Initial load
duke
parents:
diff changeset
3088 if (!JvmtiPendingMonitors::exit(rmonitor)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3089 err = JVMTI_ERROR_NOT_MONITOR_OWNER;
a61af66fc99e Initial load
duke
parents:
diff changeset
3090 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3091 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3092 int r;
a61af66fc99e Initial load
duke
parents:
diff changeset
3093 Thread* thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
3094
a61af66fc99e Initial load
duke
parents:
diff changeset
3095 if (thread->is_Java_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3096 JavaThread* current_thread = (JavaThread*)thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
3097 #ifdef PROPER_TRANSITIONS
a61af66fc99e Initial load
duke
parents:
diff changeset
3098 // Not really unknown but ThreadInVMfromNative does more than we want
a61af66fc99e Initial load
duke
parents:
diff changeset
3099 ThreadInVMfromUnknown __tiv;
a61af66fc99e Initial load
duke
parents:
diff changeset
3100 #endif /* PROPER_TRANSITIONS */
a61af66fc99e Initial load
duke
parents:
diff changeset
3101 r = rmonitor->raw_exit(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3102 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3103 if (thread->is_VM_thread() || thread->is_ConcurrentGC_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3104 r = rmonitor->raw_exit(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3105 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3106 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
3107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3109
a61af66fc99e Initial load
duke
parents:
diff changeset
3110 if (r == ObjectMonitor::OM_ILLEGAL_MONITOR_STATE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3111 err = JVMTI_ERROR_NOT_MONITOR_OWNER;
a61af66fc99e Initial load
duke
parents:
diff changeset
3112 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3113 assert(r == ObjectMonitor::OM_OK, "raw_exit should have worked");
a61af66fc99e Initial load
duke
parents:
diff changeset
3114 if (r != ObjectMonitor::OM_OK) { // robustness
a61af66fc99e Initial load
duke
parents:
diff changeset
3115 err = JVMTI_ERROR_INTERNAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3119 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
3120 } /* end RawMonitorExit */
a61af66fc99e Initial load
duke
parents:
diff changeset
3121
a61af66fc99e Initial load
duke
parents:
diff changeset
3122
a61af66fc99e Initial load
duke
parents:
diff changeset
3123 // rmonitor - pre-checked for validity
a61af66fc99e Initial load
duke
parents:
diff changeset
3124 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3125 JvmtiEnv::RawMonitorWait(JvmtiRawMonitor * rmonitor, jlong millis) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3126 int r;
a61af66fc99e Initial load
duke
parents:
diff changeset
3127 Thread* thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
3128
a61af66fc99e Initial load
duke
parents:
diff changeset
3129 if (thread->is_Java_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3130 JavaThread* current_thread = (JavaThread*)thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
3131 #ifdef PROPER_TRANSITIONS
a61af66fc99e Initial load
duke
parents:
diff changeset
3132 // Not really unknown but ThreadInVMfromNative does more than we want
a61af66fc99e Initial load
duke
parents:
diff changeset
3133 ThreadInVMfromUnknown __tiv;
a61af66fc99e Initial load
duke
parents:
diff changeset
3134 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3135 ThreadBlockInVM __tbivm(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3136 r = rmonitor->raw_wait(millis, true, current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3138 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
3139 /* Transition to thread_blocked without entering vm state */
a61af66fc99e Initial load
duke
parents:
diff changeset
3140 /* This is really evil. Normally you can't undo _thread_blocked */
a61af66fc99e Initial load
duke
parents:
diff changeset
3141 /* transitions like this because it would cause us to miss a */
a61af66fc99e Initial load
duke
parents:
diff changeset
3142 /* safepoint but since the thread was already in _thread_in_native */
a61af66fc99e Initial load
duke
parents:
diff changeset
3143 /* the thread is not leaving a safepoint safe state and it will */
a61af66fc99e Initial load
duke
parents:
diff changeset
3144 /* block when it tries to return from native. We can't safepoint */
a61af66fc99e Initial load
duke
parents:
diff changeset
3145 /* block in here because we could deadlock the vmthread. Blech. */
a61af66fc99e Initial load
duke
parents:
diff changeset
3146
a61af66fc99e Initial load
duke
parents:
diff changeset
3147 JavaThreadState state = current_thread->thread_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
3148 assert(state == _thread_in_native, "Must be _thread_in_native");
a61af66fc99e Initial load
duke
parents:
diff changeset
3149 // frame should already be walkable since we are in native
a61af66fc99e Initial load
duke
parents:
diff changeset
3150 assert(!current_thread->has_last_Java_frame() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3151 current_thread->frame_anchor()->walkable(), "Must be walkable");
a61af66fc99e Initial load
duke
parents:
diff changeset
3152 current_thread->set_thread_state(_thread_blocked);
a61af66fc99e Initial load
duke
parents:
diff changeset
3153
a61af66fc99e Initial load
duke
parents:
diff changeset
3154 r = rmonitor->raw_wait(millis, true, current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3155 // restore state, still at a safepoint safe state
a61af66fc99e Initial load
duke
parents:
diff changeset
3156 current_thread->set_thread_state(state);
a61af66fc99e Initial load
duke
parents:
diff changeset
3157
a61af66fc99e Initial load
duke
parents:
diff changeset
3158 #endif /* PROPER_TRANSITIONS */
a61af66fc99e Initial load
duke
parents:
diff changeset
3159 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3160 if (thread->is_VM_thread() || thread->is_ConcurrentGC_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3161 r = rmonitor->raw_wait(millis, true, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3162 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3163 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
3164 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3166
a61af66fc99e Initial load
duke
parents:
diff changeset
3167 switch (r) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3168 case ObjectMonitor::OM_INTERRUPTED:
a61af66fc99e Initial load
duke
parents:
diff changeset
3169 return JVMTI_ERROR_INTERRUPT;
a61af66fc99e Initial load
duke
parents:
diff changeset
3170 case ObjectMonitor::OM_ILLEGAL_MONITOR_STATE:
a61af66fc99e Initial load
duke
parents:
diff changeset
3171 return JVMTI_ERROR_NOT_MONITOR_OWNER;
a61af66fc99e Initial load
duke
parents:
diff changeset
3172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3173 assert(r == ObjectMonitor::OM_OK, "raw_wait should have worked");
a61af66fc99e Initial load
duke
parents:
diff changeset
3174 if (r != ObjectMonitor::OM_OK) { // robustness
a61af66fc99e Initial load
duke
parents:
diff changeset
3175 return JVMTI_ERROR_INTERNAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3177
a61af66fc99e Initial load
duke
parents:
diff changeset
3178 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3179 } /* end RawMonitorWait */
a61af66fc99e Initial load
duke
parents:
diff changeset
3180
a61af66fc99e Initial load
duke
parents:
diff changeset
3181
a61af66fc99e Initial load
duke
parents:
diff changeset
3182 // rmonitor - pre-checked for validity
a61af66fc99e Initial load
duke
parents:
diff changeset
3183 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3184 JvmtiEnv::RawMonitorNotify(JvmtiRawMonitor * rmonitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3185 int r;
a61af66fc99e Initial load
duke
parents:
diff changeset
3186 Thread* thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
3187
a61af66fc99e Initial load
duke
parents:
diff changeset
3188 if (thread->is_Java_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3189 JavaThread* current_thread = (JavaThread*)thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
3190 // Not really unknown but ThreadInVMfromNative does more than we want
a61af66fc99e Initial load
duke
parents:
diff changeset
3191 ThreadInVMfromUnknown __tiv;
a61af66fc99e Initial load
duke
parents:
diff changeset
3192 r = rmonitor->raw_notify(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3193 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3194 if (thread->is_VM_thread() || thread->is_ConcurrentGC_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3195 r = rmonitor->raw_notify(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3196 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3197 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
3198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3200
a61af66fc99e Initial load
duke
parents:
diff changeset
3201 if (r == ObjectMonitor::OM_ILLEGAL_MONITOR_STATE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3202 return JVMTI_ERROR_NOT_MONITOR_OWNER;
a61af66fc99e Initial load
duke
parents:
diff changeset
3203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3204 assert(r == ObjectMonitor::OM_OK, "raw_notify should have worked");
a61af66fc99e Initial load
duke
parents:
diff changeset
3205 if (r != ObjectMonitor::OM_OK) { // robustness
a61af66fc99e Initial load
duke
parents:
diff changeset
3206 return JVMTI_ERROR_INTERNAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3208
a61af66fc99e Initial load
duke
parents:
diff changeset
3209 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3210 } /* end RawMonitorNotify */
a61af66fc99e Initial load
duke
parents:
diff changeset
3211
a61af66fc99e Initial load
duke
parents:
diff changeset
3212
a61af66fc99e Initial load
duke
parents:
diff changeset
3213 // rmonitor - pre-checked for validity
a61af66fc99e Initial load
duke
parents:
diff changeset
3214 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3215 JvmtiEnv::RawMonitorNotifyAll(JvmtiRawMonitor * rmonitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3216 int r;
a61af66fc99e Initial load
duke
parents:
diff changeset
3217 Thread* thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
3218
a61af66fc99e Initial load
duke
parents:
diff changeset
3219 if (thread->is_Java_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3220 JavaThread* current_thread = (JavaThread*)thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
3221 ThreadInVMfromUnknown __tiv;
a61af66fc99e Initial load
duke
parents:
diff changeset
3222 r = rmonitor->raw_notifyAll(current_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3223 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3224 if (thread->is_VM_thread() || thread->is_ConcurrentGC_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3225 r = rmonitor->raw_notifyAll(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3226 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3227 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
3228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3230
a61af66fc99e Initial load
duke
parents:
diff changeset
3231 if (r == ObjectMonitor::OM_ILLEGAL_MONITOR_STATE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3232 return JVMTI_ERROR_NOT_MONITOR_OWNER;
a61af66fc99e Initial load
duke
parents:
diff changeset
3233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3234 assert(r == ObjectMonitor::OM_OK, "raw_notifyAll should have worked");
a61af66fc99e Initial load
duke
parents:
diff changeset
3235 if (r != ObjectMonitor::OM_OK) { // robustness
a61af66fc99e Initial load
duke
parents:
diff changeset
3236 return JVMTI_ERROR_INTERNAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3238
a61af66fc99e Initial load
duke
parents:
diff changeset
3239 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3240 } /* end RawMonitorNotifyAll */
a61af66fc99e Initial load
duke
parents:
diff changeset
3241
a61af66fc99e Initial load
duke
parents:
diff changeset
3242
a61af66fc99e Initial load
duke
parents:
diff changeset
3243 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3244 // JNI Function Interception functions
a61af66fc99e Initial load
duke
parents:
diff changeset
3245 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3246
a61af66fc99e Initial load
duke
parents:
diff changeset
3247
a61af66fc99e Initial load
duke
parents:
diff changeset
3248 // function_table - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3249 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3250 JvmtiEnv::SetJNIFunctionTable(const jniNativeInterface* function_table) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3251 // Copy jni function table at safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
3252 VM_JNIFunctionTableCopier copier(function_table);
a61af66fc99e Initial load
duke
parents:
diff changeset
3253 VMThread::execute(&copier);
a61af66fc99e Initial load
duke
parents:
diff changeset
3254
a61af66fc99e Initial load
duke
parents:
diff changeset
3255 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3256 } /* end SetJNIFunctionTable */
a61af66fc99e Initial load
duke
parents:
diff changeset
3257
a61af66fc99e Initial load
duke
parents:
diff changeset
3258
a61af66fc99e Initial load
duke
parents:
diff changeset
3259 // function_table - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3260 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3261 JvmtiEnv::GetJNIFunctionTable(jniNativeInterface** function_table) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3262 *function_table=(jniNativeInterface*)jvmtiMalloc(sizeof(jniNativeInterface));
a61af66fc99e Initial load
duke
parents:
diff changeset
3263 if (*function_table == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
3264 return JVMTI_ERROR_OUT_OF_MEMORY;
a61af66fc99e Initial load
duke
parents:
diff changeset
3265 memcpy(*function_table,(JavaThread::current())->get_jni_functions(),sizeof(jniNativeInterface));
a61af66fc99e Initial load
duke
parents:
diff changeset
3266 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3267 } /* end GetJNIFunctionTable */
a61af66fc99e Initial load
duke
parents:
diff changeset
3268
a61af66fc99e Initial load
duke
parents:
diff changeset
3269
a61af66fc99e Initial load
duke
parents:
diff changeset
3270 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3271 // Event Management functions
a61af66fc99e Initial load
duke
parents:
diff changeset
3272 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3273
a61af66fc99e Initial load
duke
parents:
diff changeset
3274 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3275 JvmtiEnv::GenerateEvents(jvmtiEvent event_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3276 // can only generate two event types
a61af66fc99e Initial load
duke
parents:
diff changeset
3277 if (event_type != JVMTI_EVENT_COMPILED_METHOD_LOAD &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3278 event_type != JVMTI_EVENT_DYNAMIC_CODE_GENERATED) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3279 return JVMTI_ERROR_ILLEGAL_ARGUMENT;
a61af66fc99e Initial load
duke
parents:
diff changeset
3280 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3281
a61af66fc99e Initial load
duke
parents:
diff changeset
3282 // for compiled_method_load events we must check that the environment
a61af66fc99e Initial load
duke
parents:
diff changeset
3283 // has the can_generate_compiled_method_load_events capability.
a61af66fc99e Initial load
duke
parents:
diff changeset
3284 if (event_type == JVMTI_EVENT_COMPILED_METHOD_LOAD) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3285 if (get_capabilities()->can_generate_compiled_method_load_events == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3286 return JVMTI_ERROR_MUST_POSSESS_CAPABILITY;
a61af66fc99e Initial load
duke
parents:
diff changeset
3287 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3288 return JvmtiCodeBlobEvents::generate_compiled_method_load_events(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3289 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3290 return JvmtiCodeBlobEvents::generate_dynamic_code_events(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3292
a61af66fc99e Initial load
duke
parents:
diff changeset
3293 } /* end GenerateEvents */
a61af66fc99e Initial load
duke
parents:
diff changeset
3294
a61af66fc99e Initial load
duke
parents:
diff changeset
3295
a61af66fc99e Initial load
duke
parents:
diff changeset
3296 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3297 // Extension Mechanism functions
a61af66fc99e Initial load
duke
parents:
diff changeset
3298 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3299
a61af66fc99e Initial load
duke
parents:
diff changeset
3300 // extension_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3301 // extensions - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3302 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3303 JvmtiEnv::GetExtensionFunctions(jint* extension_count_ptr, jvmtiExtensionFunctionInfo** extensions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3304 return JvmtiExtensions::get_functions(this, extension_count_ptr, extensions);
a61af66fc99e Initial load
duke
parents:
diff changeset
3305 } /* end GetExtensionFunctions */
a61af66fc99e Initial load
duke
parents:
diff changeset
3306
a61af66fc99e Initial load
duke
parents:
diff changeset
3307
a61af66fc99e Initial load
duke
parents:
diff changeset
3308 // extension_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3309 // extensions - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3310 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3311 JvmtiEnv::GetExtensionEvents(jint* extension_count_ptr, jvmtiExtensionEventInfo** extensions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3312 return JvmtiExtensions::get_events(this, extension_count_ptr, extensions);
a61af66fc99e Initial load
duke
parents:
diff changeset
3313 } /* end GetExtensionEvents */
a61af66fc99e Initial load
duke
parents:
diff changeset
3314
a61af66fc99e Initial load
duke
parents:
diff changeset
3315
a61af66fc99e Initial load
duke
parents:
diff changeset
3316 // callback - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
3317 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3318 JvmtiEnv::SetExtensionEventCallback(jint extension_event_index, jvmtiExtensionEvent callback) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3319 return JvmtiExtensions::set_event_callback(this, extension_event_index, callback);
a61af66fc99e Initial load
duke
parents:
diff changeset
3320 } /* end SetExtensionEventCallback */
a61af66fc99e Initial load
duke
parents:
diff changeset
3321
a61af66fc99e Initial load
duke
parents:
diff changeset
3322 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3323 // Timers functions
a61af66fc99e Initial load
duke
parents:
diff changeset
3324 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3325
a61af66fc99e Initial load
duke
parents:
diff changeset
3326 // info_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3327 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3328 JvmtiEnv::GetCurrentThreadCpuTimerInfo(jvmtiTimerInfo* info_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3329 os::current_thread_cpu_time_info(info_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
3330 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3331 } /* end GetCurrentThreadCpuTimerInfo */
a61af66fc99e Initial load
duke
parents:
diff changeset
3332
a61af66fc99e Initial load
duke
parents:
diff changeset
3333
a61af66fc99e Initial load
duke
parents:
diff changeset
3334 // nanos_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3335 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3336 JvmtiEnv::GetCurrentThreadCpuTime(jlong* nanos_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3337 *nanos_ptr = os::current_thread_cpu_time();
a61af66fc99e Initial load
duke
parents:
diff changeset
3338 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3339 } /* end GetCurrentThreadCpuTime */
a61af66fc99e Initial load
duke
parents:
diff changeset
3340
a61af66fc99e Initial load
duke
parents:
diff changeset
3341
a61af66fc99e Initial load
duke
parents:
diff changeset
3342 // info_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3343 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3344 JvmtiEnv::GetThreadCpuTimerInfo(jvmtiTimerInfo* info_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3345 os::thread_cpu_time_info(info_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
3346 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3347 } /* end GetThreadCpuTimerInfo */
a61af66fc99e Initial load
duke
parents:
diff changeset
3348
a61af66fc99e Initial load
duke
parents:
diff changeset
3349
a61af66fc99e Initial load
duke
parents:
diff changeset
3350 // Threads_lock NOT held, java_thread not protected by lock
a61af66fc99e Initial load
duke
parents:
diff changeset
3351 // java_thread - pre-checked
a61af66fc99e Initial load
duke
parents:
diff changeset
3352 // nanos_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3353 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3354 JvmtiEnv::GetThreadCpuTime(JavaThread* java_thread, jlong* nanos_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3355 *nanos_ptr = os::thread_cpu_time(java_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3356 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3357 } /* end GetThreadCpuTime */
a61af66fc99e Initial load
duke
parents:
diff changeset
3358
a61af66fc99e Initial load
duke
parents:
diff changeset
3359
a61af66fc99e Initial load
duke
parents:
diff changeset
3360 // info_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3361 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3362 JvmtiEnv::GetTimerInfo(jvmtiTimerInfo* info_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3363 os::javaTimeNanos_info(info_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
3364 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3365 } /* end GetTimerInfo */
a61af66fc99e Initial load
duke
parents:
diff changeset
3366
a61af66fc99e Initial load
duke
parents:
diff changeset
3367
a61af66fc99e Initial load
duke
parents:
diff changeset
3368 // nanos_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3369 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3370 JvmtiEnv::GetTime(jlong* nanos_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3371 *nanos_ptr = os::javaTimeNanos();
a61af66fc99e Initial load
duke
parents:
diff changeset
3372 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3373 } /* end GetTime */
a61af66fc99e Initial load
duke
parents:
diff changeset
3374
a61af66fc99e Initial load
duke
parents:
diff changeset
3375
a61af66fc99e Initial load
duke
parents:
diff changeset
3376 // processor_count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3377 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3378 JvmtiEnv::GetAvailableProcessors(jint* processor_count_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3379 *processor_count_ptr = os::active_processor_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
3380 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3381 } /* end GetAvailableProcessors */
a61af66fc99e Initial load
duke
parents:
diff changeset
3382
a61af66fc99e Initial load
duke
parents:
diff changeset
3383 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3384 // System Properties functions
a61af66fc99e Initial load
duke
parents:
diff changeset
3385 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3386
a61af66fc99e Initial load
duke
parents:
diff changeset
3387 // count_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3388 // property_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3389 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3390 JvmtiEnv::GetSystemProperties(jint* count_ptr, char*** property_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3391 jvmtiError err = JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3392
a61af66fc99e Initial load
duke
parents:
diff changeset
3393 *count_ptr = Arguments::PropertyList_count(Arguments::system_properties());
a61af66fc99e Initial load
duke
parents:
diff changeset
3394
a61af66fc99e Initial load
duke
parents:
diff changeset
3395 err = allocate(*count_ptr * sizeof(char *), (unsigned char **)property_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
3396 if (err != JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3397 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
3398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3399 int i = 0 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3400 for (SystemProperty* p = Arguments::system_properties(); p != NULL && i < *count_ptr; p = p->next(), i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3401 const char *key = p->key();
a61af66fc99e Initial load
duke
parents:
diff changeset
3402 char **tmp_value = *property_ptr+i;
a61af66fc99e Initial load
duke
parents:
diff changeset
3403 err = allocate((strlen(key)+1) * sizeof(char), (unsigned char**)tmp_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
3404 if (err == JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3405 strcpy(*tmp_value, key);
a61af66fc99e Initial load
duke
parents:
diff changeset
3406 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3407 // clean up previously allocated memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
3408 for (int j=0; j<i; j++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3409 Deallocate((unsigned char*)*property_ptr+j);
a61af66fc99e Initial load
duke
parents:
diff changeset
3410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3411 Deallocate((unsigned char*)property_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
3412 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3413 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3414 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3415 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
3416 } /* end GetSystemProperties */
a61af66fc99e Initial load
duke
parents:
diff changeset
3417
a61af66fc99e Initial load
duke
parents:
diff changeset
3418
a61af66fc99e Initial load
duke
parents:
diff changeset
3419 // property - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3420 // value_ptr - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3421 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
3422 JvmtiEnv::GetSystemProperty(const char* property, char** value_ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3423 jvmtiError err = JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3424 const char *value;
a61af66fc99e Initial load
duke
parents:
diff changeset
3425
a61af66fc99e Initial load
duke
parents:
diff changeset
3426 value = Arguments::PropertyList_get_value(Arguments::system_properties(), property);
a61af66fc99e Initial load
duke
parents:
diff changeset
3427 if (value == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3428 err = JVMTI_ERROR_NOT_AVAILABLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3429 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3430 err = allocate((strlen(value)+1) * sizeof(char), (unsigned char **)value_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
3431 if (err == JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3432 strcpy(*value_ptr, value);
a61af66fc99e Initial load
duke
parents:
diff changeset
3433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3435 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
3436 } /* end GetSystemProperty */
a61af66fc99e Initial load
duke
parents:
diff changeset
3437
a61af66fc99e Initial load
duke
parents:
diff changeset
3438
a61af66fc99e Initial load
duke
parents:
diff changeset
3439 // property - pre-checked for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3440 // value - NULL is a valid value, must be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
3441 jvmtiError
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2019
diff changeset
3442 JvmtiEnv::SetSystemProperty(const char* property, const char* value_ptr) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3443 jvmtiError err =JVMTI_ERROR_NOT_AVAILABLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3444
a61af66fc99e Initial load
duke
parents:
diff changeset
3445 for (SystemProperty* p = Arguments::system_properties(); p != NULL; p = p->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3446 if (strcmp(property, p->key()) == 0) {
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2019
diff changeset
3447 if (p->set_value((char *)value_ptr)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3448 err = JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3449 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3450 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3451 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3452 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
3453 } /* end SetSystemProperty */
a61af66fc99e Initial load
duke
parents:
diff changeset
3454
a61af66fc99e Initial load
duke
parents:
diff changeset
3455 #endif // !JVMTI_KERNEL