jvmtiEnv.cpp revision 1142
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * This code is free software; you can redistribute it and/or modify it
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * under the terms of the GNU General Public License version 2 only, as
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * published by the Free Software Foundation.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * This code is distributed in the hope that it will be useful, but WITHOUT
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * version 2 for more details (a copy is included in the LICENSE file that
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * accompanied this code).
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * You should have received a copy of the GNU General Public License version
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * 2 along with this work; if not, write to the Free Software Foundation,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * CA 95054 USA or visit www.sun.com if you need additional information or
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * have any questions.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc# include "incls/_precompiled.incl"
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc# include "incls/_jvmtiEnv.cpp.incl"
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // FIXLATER: hook into JvmtiTrace
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc return new JvmtiEnv();
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// VM operation class to copy jni function table at safepoint.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// More than one java threads or jvmti agents may be reading/
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// modifying jni function tables. To reduce the risk of bad
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// interaction b/w these threads it is copied at safepoint.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc VM_JNIFunctionTableCopier(const struct JNINativeInterface_ *func_tbl) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc VMOp_Type type() const { return VMOp_JNIFunctionTableCopier; }
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang// Do not change the "prefix" marker below, everything above it is copied
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// unchanged into the filled stub, everything below is controlled by the
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// stub filler (only method bodies are carried forward, and then only for
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// functionality still in the spec).
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// end file prefix
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // Memory Management functions
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// mem_ptr - pre-checked for NULL
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc} /* end Allocate */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// mem - NULL is a valid value, must be checked
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc} /* end Deallocate */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// Threads_lock NOT held, java_thread not protected by lock
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// java_thread - pre-checked
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// data - NULL is a valid value, must be checked
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcJvmtiEnv::SetThreadLocalStorage(JavaThread* java_thread, const void* data) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc JvmtiThreadState* state = java_thread->jvmti_thread_state();
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // leaving state unset same as data set to NULL
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // otherwise, create the state
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc state->env_thread_state(this)->set_agent_thread_local_storage_data((void*)data);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc} /* end SetThreadLocalStorage */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// Threads_lock NOT held
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// thread - NOT pre-checked
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// data_ptr - pre-checked for NULL
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcJvmtiEnv::GetThreadLocalStorage(jthread thread, void** data_ptr) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc JvmtiThreadState* state = current_thread->jvmti_thread_state();
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc state->env_thread_state(this)->get_agent_thread_local_storage_data();
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // jvmti_GetThreadLocalStorage is "in native" and doesn't transition
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // the thread to _thread_in_vm. However, when the TLS for a thread
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // other than the current thread is required we need to transition
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // from native so as to resolve the jthread.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc __ENTRY(jvmtiError, JvmtiEnv::GetThreadLocalStorage , current_thread)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc oop thread_oop = JNIHandles::resolve_external_guard(thread);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc if (!thread_oop->is_a(SystemDictionary::Thread_klass())) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc JavaThread* java_thread = java_lang_Thread::thread(thread_oop);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc JvmtiThreadState* state = java_thread->jvmti_thread_state();
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc state->env_thread_state(this)->get_agent_thread_local_storage_data();
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc} /* end GetThreadLocalStorage */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // Class functions
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// class_count_ptr - pre-checked for NULL
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// classes_ptr - pre-checked for NULL
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcJvmtiEnv::GetLoadedClasses(jint* class_count_ptr, jclass** classes_ptr) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc return JvmtiGetLoadedClasses::getLoadedClasses(this, class_count_ptr, classes_ptr);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc} /* end GetLoadedClasses */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// initiating_loader - NULL is a valid value, must be checked
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// class_count_ptr - pre-checked for NULL
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// classes_ptr - pre-checked for NULL
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcJvmtiEnv::GetClassLoaderClasses(jobject initiating_loader, jint* class_count_ptr, jclass** classes_ptr) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc return JvmtiGetLoadedClasses::getClassLoaderClasses(this, initiating_loader,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc} /* end GetClassLoaderClasses */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// k_mirror - may be primitive, this must be checked
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// is_modifiable_class_ptr - pre-checked for NULL
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcJvmtiEnv::IsModifiableClass(oop k_mirror, jboolean* is_modifiable_class_ptr) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc *is_modifiable_class_ptr = VM_RedefineClasses::is_modifiable_class(k_mirror)?
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc} /* end IsModifiableClass */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// class_count - pre-checked to be greater than or equal to 0
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// classes - pre-checked for NULL
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcJvmtiEnv::RetransformClasses(jint class_count, const jclass* classes) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc//TODO: add locking
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc NULL_CHECK(class_definitions, JVMTI_ERROR_OUT_OF_MEMORY);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // not cached, we need to reconstitute the class file from VM representation
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc constantPoolHandle constants(current_thread, ikh->constants());
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc ObjectLocker ol(constants, current_thread); // lock constant pool while we query it
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang class_definitions[index].class_byte_count = (jint)reconstituter.class_file_size();
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang class_definitions[index].class_bytes = (unsigned char*)
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang // it is cached, get it from the cache
a399b7655a1d835aa8606c2b29e4e777baac8635zf class_definitions[index].class_byte_count = ikh->get_cached_class_file_len();
a399b7655a1d835aa8606c2b29e4e777baac8635zf class_definitions[index].class_bytes = ikh->get_cached_class_file_bytes();
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc VM_RedefineClasses op(class_count, class_definitions, jvmti_class_load_kind_retransform);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc} /* end RetransformClasses */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// class_count - pre-checked to be greater than or equal to 0
a399b7655a1d835aa8606c2b29e4e777baac8635zf// class_definitions - pre-checked for NULL
a399b7655a1d835aa8606c2b29e4e777baac8635zfJvmtiEnv::RedefineClasses(jint class_count, const jvmtiClassDefinition* class_definitions) {
a399b7655a1d835aa8606c2b29e4e777baac8635zf//TODO: add locking
a399b7655a1d835aa8606c2b29e4e777baac8635zf VM_RedefineClasses op(class_count, class_definitions, jvmti_class_load_kind_redefine);
a399b7655a1d835aa8606c2b29e4e777baac8635zf} /* end RedefineClasses */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // Object functions
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// size_ptr - pre-checked for NULL
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcJvmtiEnv::GetObjectSize(jobject object, jlong* size_ptr) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc if (mirror->klass() == SystemDictionary::Class_klass()) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc assert(mirror != NULL, "class for non-primitive mirror must exist");
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc} /* end GetObjectSize */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // Method functions
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// prefix - NULL is a valid value, must be checked
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc} /* end SetNativeMethodPrefix */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang// prefix_count - pre-checked to be greater than or equal to 0
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang// prefixes - pre-checked for NULL
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker FangJvmtiEnv::SetNativeMethodPrefixes(jint prefix_count, char** prefixes) {
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang // Have to grab JVMTI thread state lock to be sure that some thread
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang // isn't accessing the prefixes at the same time we are setting them.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // No locks during VM bring-up.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc return set_native_method_prefixes(prefix_count, prefixes);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc return set_native_method_prefixes(prefix_count, prefixes);
a399b7655a1d835aa8606c2b29e4e777baac8635zf} /* end SetNativeMethodPrefixes */
a399b7655a1d835aa8606c2b29e4e777baac8635zf // Event Management functions
22eb7cb54d8a6bcf6fe2674cb4b1f0cf2d85cfb6gd// callbacks - NULL is a valid value, must be checked
22eb7cb54d8a6bcf6fe2674cb4b1f0cf2d85cfb6gd// size_of_callbacks - pre-checked to be greater than or equal to 0
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcJvmtiEnv::SetEventCallbacks(const jvmtiEventCallbacks* callbacks, jint size_of_callbacks) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc JvmtiEventController::set_event_callbacks(this, callbacks, size_of_callbacks);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc} /* end SetEventCallbacks */
22eb7cb54d8a6bcf6fe2674cb4b1f0cf2d85cfb6gd// event_thread - NULL is a valid value, must be checked
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcJvmtiEnv::SetEventNotificationMode(jvmtiEventMode mode, jvmtiEvent event_type, jthread event_thread, ...) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc oop thread_oop = JNIHandles::resolve_external_guard(event_thread);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc if (!thread_oop->is_a(SystemDictionary::Thread_klass())) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // event_type must be valid
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc if (!JvmtiEventController::is_valid_event_type(event_type)) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // global events cannot be controlled at thread level.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc if (java_thread != NULL && JvmtiEventController::is_global_event(event_type)) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // assure that needed capabilities are present
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc if (enabled && !JvmtiUtil::has_event_capability(event_type, get_capabilities())) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc if (event_type == JVMTI_EVENT_CLASS_FILE_LOAD_HOOK && enabled) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc JvmtiEventController::set_user_enabled(this, java_thread, event_type, enabled);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc} /* end SetEventNotificationMode */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // Capability functions
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// capabilities_ptr - pre-checked for NULL
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcJvmtiEnv::GetPotentialCapabilities(jvmtiCapabilities* capabilities_ptr) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc JvmtiManageCapabilities::get_potential_capabilities(get_capabilities(),
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc} /* end GetPotentialCapabilities */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// capabilities_ptr - pre-checked for NULL
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcJvmtiEnv::AddCapabilities(const jvmtiCapabilities* capabilities_ptr) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc return JvmtiManageCapabilities::add_capabilities(get_capabilities(),
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc} /* end AddCapabilities */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// capabilities_ptr - pre-checked for NULL
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcJvmtiEnv::RelinquishCapabilities(const jvmtiCapabilities* capabilities_ptr) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc JvmtiManageCapabilities::relinquish_capabilities(get_capabilities(), capabilities_ptr, get_capabilities());
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc} /* end RelinquishCapabilities */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// capabilities_ptr - pre-checked for NULL
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcJvmtiEnv::GetCapabilities(jvmtiCapabilities* capabilities_ptr) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc JvmtiManageCapabilities::copy_capabilities(get_capabilities(), capabilities_ptr);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc} /* end GetCapabilities */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // Class Loader Search functions
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// segment - pre-checked for NULL
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcJvmtiEnv::AddToBootstrapClassLoaderSearch(const char* segment) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // create the zip entry
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc ClassPathZipEntry* zip_entry = ClassLoader::create_class_path_zip_entry(segment);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // lock the loader
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc Handle loader_lock = Handle(thread, SystemDictionary::system_loader_lock());
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc // add the jar file to the bootclasspath
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc} /* end AddToBootstrapClassLoaderSearch */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc// segment - pre-checked for NULL
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcJvmtiEnv::AddToSystemClassLoaderSearch(const char* segment) {
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_ILLEGAL_ARGUMENT;
if (HAS_PENDING_EXCEPTION) {
return JVMTI_ERROR_INTERNAL;
path,
THREAD);
if (HAS_PENDING_EXCEPTION) {
return JVMTI_ERROR_INTERNAL;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
dispose();
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_ILLEGAL_ARGUMENT;
return JVMTI_ERROR_ILLEGAL_ARGUMENT;
return err;
switch (flag) {
case JVMTI_VERBOSE_OTHER:
case JVMTI_VERBOSE_CLASS:
case JVMTI_VERBOSE_GC:
case JVMTI_VERBOSE_JNI:
return JVMTI_ERROR_ILLEGAL_ARGUMENT;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
#ifndef JVMTI_KERNEL
return JVMTI_ERROR_INVALID_THREAD;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
int nthreads = 0;
if (nthreads == 0) {
return JVMTI_ERROR_NONE;
for (int i=0; i < nthreads; i++) {
return JVMTI_ERROR_NONE;
return (JVMTI_ERROR_NONE);
return (JVMTI_ERROR_THREAD_SUSPENDED);
return (JVMTI_ERROR_THREAD_NOT_ALIVE);
return (JVMTI_ERROR_THREAD_NOT_ALIVE);
return JVMTI_ERROR_NONE;
for (int i = 0; i < request_count; i++) {
if (needSafepoint > 0) {
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_THREAD_NOT_SUSPENDED;
return JVMTI_ERROR_INTERNAL;
return JVMTI_ERROR_NONE;
for (int i = 0; i < request_count; i++) {
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_INVALID_THREAD;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_INVALID_THREAD;
bool is_daemon;
return JVMTI_ERROR_OUT_OF_MEMORY;
return JVMTI_ERROR_NONE;
JvmtiEnv::GetOwnedMonitorInfo(JavaThread* java_thread, jint* owned_monitor_count_ptr, jobject** owned_monitors_ptr) {
for (int i = 0; i < owned_monitor_count; i++) {
(*owned_monitors_ptr)[i] =
for (int i = 0; i < owned_monitor_count; i++) {
delete owned_monitors_list;
return err;
JvmtiEnv::GetOwnedMonitorStackDepthInfo(JavaThread* java_thread, jint* monitor_info_count_ptr, jvmtiMonitorStackDepthInfo** monitor_info_ptr) {
for (int i = 0; i < owned_monitor_count; i++) {
for (int i = 0; i < owned_monitor_count; i++) {
delete owned_monitors_list;
return err;
return err;
return JVMTI_ERROR_INVALID_THREAD;
return JVMTI_ERROR_INVALID_PRIORITY;
return JVMTI_ERROR_OUT_OF_MEMORY;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
bool is_daemon;
return JVMTI_ERROR_NONE;
JvmtiEnv::GetThreadGroupChildren(jthreadGroup group, jint* thread_count_ptr, jthread** threads_ptr, jint* group_count_ptr, jthreadGroup** groups_ptr) {
int nthreads = 0;
int ngroups = 0;
int hidden_threads = 0;
if (nthreads > 0) {
for (int i=0, j=0; i<nthreads; i++) {
if (ngroups > 0) {
for (int i=0; i<ngroups; i++) {
return JVMTI_ERROR_OUT_OF_MEMORY;
return JVMTI_ERROR_OUT_OF_MEMORY;
return JVMTI_ERROR_NONE;
JvmtiEnv::GetStackTrace(JavaThread* java_thread, jint start_depth, jint max_frame_count, jvmtiFrameInfo* frame_buffer, jint* count_ptr) {
return err;
JvmtiEnv::GetAllStackTraces(jint max_frame_count, jvmtiStackInfo** stack_info_ptr, jint* thread_count_ptr) {
return err;
JvmtiEnv::GetThreadListStackTraces(jint thread_count, const jthread* thread_list, jint max_frame_count, jvmtiStackInfo** stack_info_ptr) {
return err;
return JVMTI_ERROR_THREAD_NOT_ALIVE;
return err;
return JVMTI_ERROR_THREAD_NOT_ALIVE;
return JVMTI_ERROR_THREAD_NOT_SUSPENDED;
return JVMTI_ERROR_INTERNAL;
return JVMTI_ERROR_OPAQUE_FRAME;
int frame_count = 0;
return JVMTI_ERROR_NO_MORE_FRAMES;
return JVMTI_ERROR_OPAQUE_FRAME;
if (!is_interpreted[i]) {
return JVMTI_ERROR_NONE;
JvmtiEnv::GetFrameLocation(JavaThread* java_thread, jint depth, jmethodID* method_ptr, jlocation* location_ptr) {
return err;
return JVMTI_ERROR_THREAD_NOT_ALIVE;
return JVMTI_ERROR_THREAD_NOT_SUSPENDED;
if (TraceJVMTICalls) {
return JVMTI_ERROR_NO_MORE_FRAMES;
return JVMTI_ERROR_OPAQUE_FRAME;
return JVMTI_ERROR_NONE;
val.j = 0L;
JvmtiEnv::FollowReferences(jint heap_filter, jclass klass, jobject initial_object, const jvmtiHeapCallbacks* callbacks, const void* user_data) {
return JVMTI_ERROR_INVALID_CLASS;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_INVALID_CLASS;
JvmtiTagMap::tag_map_for(this)->follow_references(heap_filter, kh, initial_object, callbacks, user_data);
return JVMTI_ERROR_NONE;
JvmtiEnv::IterateThroughHeap(jint heap_filter, jclass klass, const jvmtiHeapCallbacks* callbacks, const void* user_data) {
return JVMTI_ERROR_INVALID_CLASS;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_INVALID_CLASS;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
JvmtiEnv::GetObjectsWithTags(jint tag_count, const jlong* tags, jint* count_ptr, jobject** object_result_ptr, jlong** tag_result_ptr) {
return JvmtiTagMap::tag_map_for(this)->get_objects_with_tags((jlong*)tags, tag_count, count_ptr, object_result_ptr, tag_result_ptr);
return JVMTI_ERROR_NONE;
JvmtiEnv::IterateOverObjectsReachableFromObject(jobject object, jvmtiObjectReferenceCallback object_reference_callback, const void* user_data) {
JvmtiTagMap::tag_map_for(this)->iterate_over_objects_reachable_from_object(object, object_reference_callback, user_data);
return JVMTI_ERROR_NONE;
JvmtiEnv::IterateOverReachableObjects(jvmtiHeapRootCallback heap_root_callback, jvmtiStackReferenceCallback stack_ref_callback, jvmtiObjectReferenceCallback object_ref_callback, const void* user_data) {
JvmtiTagMap::tag_map_for(this)->iterate_over_reachable_objects(heap_root_callback, stack_ref_callback, object_ref_callback, user_data);
return JVMTI_ERROR_NONE;
JvmtiEnv::IterateOverHeap(jvmtiHeapObjectFilter object_filter, jvmtiHeapObjectCallback heap_object_callback, const void* user_data) {
JvmtiTagMap::tag_map_for(this)->iterate_over_heap(object_filter, KlassHandle(), heap_object_callback, user_data);
return JVMTI_ERROR_NONE;
JvmtiEnv::IterateOverInstancesOfClass(oop k_mirror, jvmtiHeapObjectFilter object_filter, jvmtiHeapObjectCallback heap_object_callback, const void* user_data) {
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_INVALID_CLASS;
JvmtiTagMap::tag_map_for(this)->iterate_over_heap(object_filter, klass, heap_object_callback, user_data);
return JVMTI_ERROR_NONE;
return err;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_INVALID_LOCATION;
return JVMTI_ERROR_INVALID_LOCATION;
return JVMTI_ERROR_DUPLICATE;
if (TraceJVMTICalls) {
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_INVALID_LOCATION;
return JVMTI_ERROR_INVALID_LOCATION;
return JVMTI_ERROR_NOT_FOUND;
if (TraceJVMTICalls) {
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
if (!isPrimitive) {
if (isPrimitive) {
char* gen_result;
(unsigned char **)&gen_result);
return err;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_ABSENT_INFORMATION;
return JVMTI_ERROR_ABSENT_INFORMATION;
return JVMTI_ERROR_NONE;
assert((Klass::cast(k)->oop_is_instance() || Klass::cast(k)->oop_is_array()), "should be an instance or an array klass");
if (HAS_PENDING_EXCEPTION) {
return JVMTI_ERROR_INTERNAL;
return JVMTI_ERROR_NONE;
*method_count_ptr = 0;
return JVMTI_ERROR_NONE;
if (!(Klass::cast(k)->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) )) {
return JVMTI_ERROR_CLASS_NOT_PREPARED;
*method_count_ptr = 0;
return JVMTI_ERROR_NONE;
int index;
return JVMTI_ERROR_NONE;
*field_count_ptr = 0;
return JVMTI_ERROR_NONE;
if (!(Klass::cast(k)->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) )) {
return JVMTI_ERROR_CLASS_NOT_PREPARED;
*field_count_ptr = 0;
return JVMTI_ERROR_NONE;
int result_count = 0;
return JVMTI_ERROR_NONE;
JvmtiEnv::GetImplementedInterfaces(oop k_mirror, jint* interface_count_ptr, jclass** interfaces_ptr) {
*interface_count_ptr = 0;
return JVMTI_ERROR_NONE;
if (!(Klass::cast(k)->jvmti_class_status() & (JVMTI_CLASS_STATUS_PREPARED|JVMTI_CLASS_STATUS_ARRAY) ))
return JVMTI_ERROR_CLASS_NOT_PREPARED;
*interface_count_ptr = 0;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_ABSENT_INFORMATION;
return JVMTI_ERROR_INVALID_CLASS;
return JVMTI_ERROR_ABSENT_INFORMATION;
return JVMTI_ERROR_NONE;
JvmtiEnv::GetConstantPool(oop k_mirror, jint* constant_pool_count_ptr, jint* constant_pool_byte_count_ptr, unsigned char** constant_pool_bytes_ptr) {
return JVMTI_ERROR_ABSENT_INFORMATION;
return JVMTI_ERROR_INVALID_CLASS;
return JVMTI_ERROR_ABSENT_INFORMATION;
unsigned char *cpool_bytes;
return res;
return JVMTI_ERROR_NONE;
bool result = false;
result = true;
return JVMTI_ERROR_NONE;
bool result = false;
result = true;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_ABSENT_INFORMATION;
return JVMTI_ERROR_ABSENT_INFORMATION;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return err;
JvmtiEnv::GetFieldName(fieldDescriptor* fdesc_ptr, char** name_ptr, char** signature_ptr, char** generic_ptr) {
return JVMTI_ERROR_OUT_OF_MEMORY;
return JVMTI_ERROR_OUT_OF_MEMORY;
return err;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
JvmtiEnv::GetMethodName(methodOop method_oop, char** name_ptr, char** signature_ptr, char** generic_ptr) {
return err;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
JvmtiEnv::GetLineNumberTable(methodOop method_oop, jint* entry_count_ptr, jvmtiLineNumberEntry** table_ptr) {
return (JVMTI_ERROR_ABSENT_INFORMATION);
num_entries++;
if (num_entries > 0) {
int index = 0;
index++;
return JVMTI_ERROR_NONE;
JvmtiEnv::GetMethodLocation(methodOop method_oop, jlocation* start_location_ptr, jlocation* end_location_ptr) {
return JVMTI_ERROR_NONE;
JvmtiEnv::GetLocalVariableTable(methodOop method_oop, jint* entry_count_ptr, jvmtiLocalVariableEntry** table_ptr) {
return (JVMTI_ERROR_ABSENT_INFORMATION);
if (num_entries > 0) {
for (int i = 0; i < num_entries; i++) {
if (generic_signature_index > 0) {
const char *utf8_gen_sign = (const char *)
return JVMTI_ERROR_NONE;
JvmtiEnv::GetBytecodes(methodOop method_oop, jint* bytecode_count_ptr, unsigned char** bytecodes_ptr) {
return err;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
*is_obsolete_ptr = true;
*is_obsolete_ptr = false;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_INTERNAL;
return JVMTI_ERROR_NOT_MONITOR_OWNER;
delete rmonitor;
return JVMTI_ERROR_NONE;
// in thread.cpp.
#ifdef PROPER_TRANSITIONS
return JVMTI_ERROR_INTERNAL;
return JVMTI_ERROR_NONE;
#ifdef PROPER_TRANSITIONS
return err;
#ifdef PROPER_TRANSITIONS
return JVMTI_ERROR_INTERRUPT;
return JVMTI_ERROR_NOT_MONITOR_OWNER;
return JVMTI_ERROR_INTERNAL;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NOT_MONITOR_OWNER;
return JVMTI_ERROR_INTERNAL;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NOT_MONITOR_OWNER;
return JVMTI_ERROR_INTERNAL;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_OUT_OF_MEMORY;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_ILLEGAL_ARGUMENT;
JvmtiEnv::GetExtensionFunctions(jint* extension_count_ptr, jvmtiExtensionFunctionInfo** extensions) {
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return JVMTI_ERROR_NONE;
return err;
for (SystemProperty* p = Arguments::system_properties(); p != NULL && i < *count_ptr; p = p->next(), i++) {
return err;
const char *value;
return err;
return err;