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