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