hotspot/src/share/vm/prims/jvmtiEnvBase.hpp
author tschatzl
Wed, 11 Sep 2013 16:25:02 +0200
changeset 19986 33d188c66ed9
parent 15482 470d0b0c09f1
child 20055 7281a3cb27f2
permissions -rw-r--r--
8010722: assert: failed: heap size is too big for compressed oops Summary: Use conservative assumptions of required alignment for the various garbage collector components into account when determining the maximum heap size that supports compressed oops. Using this conservative value avoids several circular dependencies in the calculation. Reviewed-by: stefank, dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
     2
 * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4492
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4492
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4492
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    25
#ifndef SHARE_VM_PRIMS_JVMTIENVBASE_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#define SHARE_VM_PRIMS_JVMTIENVBASE_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    28
#include "classfile/classLoader.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    29
#include "prims/jvmtiEnvThreadState.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    30
#include "prims/jvmtiEventController.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    31
#include "prims/jvmtiThreadState.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    32
#include "runtime/fieldDescriptor.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    33
#include "runtime/frame.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    34
#include "runtime/handles.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    35
#include "runtime/thread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    36
#include "runtime/vm_operations.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    37
#include "utilities/growableArray.hpp"
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 14287
diff changeset
    38
#include "utilities/macros.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
// Forward Declarations
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
class JvmtiEnv;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
class JvmtiThreadState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
class JvmtiRawMonitor; // for jvmtiEnv.hpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
class JvmtiEventControllerPrivate;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
class JvmtiTagMap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
// One JvmtiEnv object is created per jvmti attachment;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
// done via JNI GetEnv() call. Multiple attachments are
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
// allowed in jvmti.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 10546
diff changeset
    56
class JvmtiEnvBase : public CHeapObj<mtInternal> {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13728
diff changeset
    60
#if INCLUDE_JVMTI
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  static JvmtiEnvBase*     _head_environment;  // head of environment list
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13728
diff changeset
    62
#endif // INCLUDE_JVMTI
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  static bool              _globally_initialized;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  static jvmtiPhase        _phase;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  static volatile int      _dying_thread_env_iteration_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  enum {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
    JDK15_JVMTI_VERSION = JVMTI_VERSION_1_0 +  33,  /* version: 1.0.33  */
7413
59b978f8fbdf 7003782: Update JVMTI version to 1.2 for jdk7
kamg
parents: 7397
diff changeset
    72
    JDK16_JVMTI_VERSION = JVMTI_VERSION_1_1 + 102,  /* version: 1.1.102 */
14287
4554a0b881ae 6533010: SPEC: A few broken links in jvmti.html
sspitsyn
parents: 13975
diff changeset
    73
    JDK17_JVMTI_VERSION = JVMTI_VERSION_1_2 +   2   /* version: 1.2.2   */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  static jvmtiPhase  get_phase()                    { return _phase; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  static void  set_phase(jvmtiPhase phase)          { _phase = phase; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  static bool is_vm_live()                          { return _phase == JVMTI_PHASE_LIVE; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  static void entering_dying_thread_env_iteration() { ++_dying_thread_env_iteration_count; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  static void leaving_dying_thread_env_iteration()  { --_dying_thread_env_iteration_count; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  static bool is_inside_dying_thread_env_iteration(){ return _dying_thread_env_iteration_count > 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  enum {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
      JVMTI_MAGIC    = 0x71EE,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
      DISPOSED_MAGIC = 0xDEFC,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
      BAD_MAGIC      = 0xDEAD
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  jvmtiEnv _jvmti_external;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  jint _magic;
4491
212bd48525d4 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1
diff changeset
    94
  jint _version;  // version value passed to JNI GetEnv()
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  JvmtiEnvBase* _next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  bool _is_retransformable;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  const void *_env_local_storage;     // per env agent allocated data.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  jvmtiEventCallbacks _event_callbacks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  jvmtiExtEventCallbacks _ext_event_callbacks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  JvmtiTagMap* _tag_map;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  JvmtiEnvEventEnable _env_event_enable;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  jvmtiCapabilities _current_capabilities;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  jvmtiCapabilities _prohibited_capabilities;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  volatile bool _class_file_load_hook_ever_enabled;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  static volatile bool _needs_clean_up;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  char** _native_method_prefixes;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  int    _native_method_prefix_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
 protected:
4491
212bd48525d4 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1
diff changeset
   110
  JvmtiEnvBase(jint version);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  ~JvmtiEnvBase();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  void dispose();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  void env_dispose();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  void set_env_local_storage(const void* data)     { _env_local_storage = data; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  const void* get_env_local_storage()              { return _env_local_storage; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  void record_class_file_load_hook_enabled();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  void record_first_time_class_file_load_hook_enabled();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  char** get_native_method_prefixes()              { return _native_method_prefixes; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  int    get_native_method_prefix_count()          { return _native_method_prefix_count; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  jvmtiError set_native_method_prefixes(jint prefix_count, char** prefixes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  friend class JvmtiEventControllerPrivate;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  void initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  void set_event_callbacks(const jvmtiEventCallbacks* callbacks, jint size_of_callbacks);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  static void globally_initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  static void periodic_clean_up();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  friend class JvmtiEnvIterator;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  JvmtiEnv* next_environment()                     { return (JvmtiEnv*)_next; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  void set_next_environment(JvmtiEnvBase* env)     { _next = env; }
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13728
diff changeset
   135
  static JvmtiEnv* head_environment()              {
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13728
diff changeset
   136
    JVMTI_ONLY(return (JvmtiEnv*)_head_environment);
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13728
diff changeset
   137
    NOT_JVMTI(return NULL);
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13728
diff changeset
   138
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
2137
b03f1da1a3d3 6567360: 3/4 SIGBUS in jvmti RawMonitor magic check for unaligned bad monitor pointer
dcubed
parents: 1
diff changeset
   142
  bool is_valid();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
4491
212bd48525d4 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1
diff changeset
   144
  bool use_version_1_0_semantics();  // agent asked for version 1.0
212bd48525d4 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1
diff changeset
   145
  bool use_version_1_1_semantics();  // agent asked for version 1.1
7413
59b978f8fbdf 7003782: Update JVMTI version to 1.2 for jdk7
kamg
parents: 7397
diff changeset
   146
  bool use_version_1_2_semantics();  // agent asked for version 1.2
4491
212bd48525d4 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 1
diff changeset
   147
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  bool is_retransformable()                        { return _is_retransformable; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  static ByteSize jvmti_external_offset() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
    return byte_offset_of(JvmtiEnvBase, _jvmti_external);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  static JvmtiEnv* JvmtiEnv_from_jvmti_env(jvmtiEnv *env) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
    return (JvmtiEnv*)((intptr_t)env - in_bytes(jvmti_external_offset()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  jvmtiCapabilities *get_capabilities()             { return &_current_capabilities; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  jvmtiCapabilities *get_prohibited_capabilities()  { return &_prohibited_capabilities; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  static char** get_all_native_method_prefixes(int* count_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  // This test will answer true when all environments have been disposed and some have
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  // not yet been deallocated.  As a result, this test should only be used as an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  // optimization for the no environment case.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  static bool environments_might_exist() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
    return head_environment() != NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  static void check_for_periodic_clean_up();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  JvmtiEnvEventEnable *env_event_enable() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
    return &_env_event_enable;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  jvmtiError allocate(jlong size, unsigned char** mem_ptr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
    if (size < 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
      return JVMTI_ERROR_ILLEGAL_ARGUMENT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
    if (size == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
      *mem_ptr = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
    } else {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 10546
diff changeset
   184
      *mem_ptr = (unsigned char *)os::malloc((size_t)size, mtInternal);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
      if (*mem_ptr == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
        return JVMTI_ERROR_OUT_OF_MEMORY;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
    return JVMTI_ERROR_NONE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  jvmtiError deallocate(unsigned char* mem) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
    if (mem != NULL) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 10546
diff changeset
   194
      os::free(mem, mtInternal);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
    return JVMTI_ERROR_NONE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  // Memory functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  unsigned char* jvmtiMalloc(jlong size);  // don't use this - call allocate
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  // method to create a local handle
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  jobject jni_reference(Handle hndl) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
    return JNIHandles::make_local(hndl());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  // method to create a local handle.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  // This function allows caller to specify which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  // threads local handle table to use.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  jobject jni_reference(JavaThread *thread, Handle hndl) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
    return JNIHandles::make_local(thread, hndl());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  // method to destroy a local handle
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  void destroy_jni_reference(jobject jobj) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
    JNIHandles::destroy_local(jobj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  // method to destroy a local handle.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  // This function allows caller to specify which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  // threads local handle table to use although currently it is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  // not used.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  void destroy_jni_reference(JavaThread *thread, jobject jobj) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
    destroy_jni_reference(jobj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  jvmtiEnv* jvmti_external() { return &_jvmti_external; };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
// Event Dispatch
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  bool has_callback(jvmtiEvent event_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
    assert(event_type >= JVMTI_MIN_EVENT_TYPE_VAL &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
           event_type <= JVMTI_MAX_EVENT_TYPE_VAL, "checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
    return ((void**)&_event_callbacks)[event_type-JVMTI_MIN_EVENT_TYPE_VAL] != NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  jvmtiEventCallbacks* callbacks() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
    return &_event_callbacks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  jvmtiExtEventCallbacks* ext_callbacks() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
    return &_ext_event_callbacks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  void set_tag_map(JvmtiTagMap* tag_map) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
    _tag_map = tag_map;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  JvmtiTagMap* tag_map() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
    return _tag_map;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  // return true if event is enabled globally or for any thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  // True only if there is a callback for it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  bool is_enabled(jvmtiEvent event_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
    return _env_event_enable.is_enabled(event_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
// Random Utilities
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  // helper methods for creating arrays of global JNI Handles from local Handles
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  // allocated into environment specific storage
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  jobject * new_jobjectArray(int length, Handle *handles);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  jthread * new_jthreadArray(int length, Handle *handles);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  jthreadGroup * new_jthreadGroupArray(int length, Handle *handles);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  // convert from JNIHandle to JavaThread *
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  JavaThread  * get_JavaThread(jthread jni_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   273
  // convert to a jni jclass from a non-null Klass*
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   274
  jclass get_jni_class_non_null(Klass* k);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  jint count_locked_objects(JavaThread *java_thread, Handle hobj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  jvmtiError get_locked_objects_in_frame(JavaThread *calling_thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
                                   JavaThread* java_thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
                                   javaVFrame *jvf,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
                                   GrowableArray<jvmtiMonitorStackDepthInfo*>* owned_monitors_list,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
                                   jint depth);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  vframe* vframeFor(JavaThread* java_thread, jint depth);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  // get a field descriptor for the specified class and field
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   286
  static bool get_field_descriptor(Klass* k, jfieldID field, fieldDescriptor* fd);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  // test for suspend - most (all?) of these should go away
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  static bool is_thread_fully_suspended(JavaThread *thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
                                        bool wait_for_suspend,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
                                        uint32_t *bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  // JVMTI API helper functions which are called at safepoint or thread is suspended.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  jvmtiError get_frame_count(JvmtiThreadState *state, jint *count_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  jvmtiError get_frame_location(JavaThread* java_thread, jint depth,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
                                              jmethodID* method_ptr, jlocation* location_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  jvmtiError get_object_monitor_usage(JavaThread *calling_thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
                                                    jobject object, jvmtiMonitorUsage* info_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  jvmtiError get_stack_trace(JavaThread *java_thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
                                           jint stack_depth, jint max_count,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
                                           jvmtiFrameInfo* frame_buffer, jint* count_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  jvmtiError get_current_contended_monitor(JavaThread *calling_thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
                                                         JavaThread *java_thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
                                                         jobject *monitor_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  jvmtiError get_owned_monitors(JavaThread *calling_thread, JavaThread* java_thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
                          GrowableArray<jvmtiMonitorStackDepthInfo*> *owned_monitors_list);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  jvmtiError check_top_frame(JavaThread* current_thread, JavaThread* java_thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
                             jvalue value, TosState tos, Handle* ret_ob_h);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  jvmtiError force_early_return(JavaThread* java_thread, jvalue value, TosState tos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
// This class is the only safe means of iterating through environments.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
// Note that this iteratation includes invalid environments pending
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
// deallocation -- in fact, some uses depend on this behavior.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
class JvmtiEnvIterator : public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  bool _entry_was_marked;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  JvmtiEnvIterator() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
    if (Threads::number_of_threads() == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
      _entry_was_marked = false; // we are single-threaded, no need
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
      Thread::current()->entering_jvmti_env_iteration();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
      _entry_was_marked = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  ~JvmtiEnvIterator() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
    if (_entry_was_marked) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
      Thread::current()->leaving_jvmti_env_iteration();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  JvmtiEnv* first()                 { return JvmtiEnvBase::head_environment(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  JvmtiEnv* next(JvmtiEnvBase* env) { return env->next_environment(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
// VM operation to get monitor information with stack depth.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
class VM_GetOwnedMonitorInfo : public VM_Operation {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  JvmtiEnv *_env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
  JavaThread* _calling_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  JavaThread *_java_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  jvmtiError _result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  GrowableArray<jvmtiMonitorStackDepthInfo*> *_owned_monitors_list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  VM_GetOwnedMonitorInfo(JvmtiEnv* env, JavaThread* calling_thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
                                   JavaThread* java_thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
                                   GrowableArray<jvmtiMonitorStackDepthInfo*>* owned_monitor_list) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
    _env = env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
    _calling_thread = calling_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
    _java_thread = java_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
    _owned_monitors_list = owned_monitor_list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
    _result = JVMTI_ERROR_NONE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  VMOp_Type type() const { return VMOp_GetOwnedMonitorInfo; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  void doit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
    ((JvmtiEnvBase *)_env)->get_owned_monitors(_calling_thread, _java_thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
                                                         _owned_monitors_list);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
  jvmtiError result() { return _result; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
// VM operation to get object monitor usage.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
class VM_GetObjectMonitorUsage : public VM_Operation {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  JvmtiEnv *_env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  jobject _object;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  JavaThread* _calling_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  jvmtiMonitorUsage* _info_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  jvmtiError _result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  VM_GetObjectMonitorUsage(JvmtiEnv *env, JavaThread* calling_thread, jobject object, jvmtiMonitorUsage* info_ptr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
    _env = env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
    _object = object;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
    _calling_thread = calling_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
    _info_ptr = info_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  VMOp_Type type() const { return VMOp_GetObjectMonitorUsage; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  jvmtiError result() { return _result; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  void doit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
    _result = ((JvmtiEnvBase*) _env)->get_object_monitor_usage(_calling_thread, _object, _info_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
// VM operation to get current contended monitor.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
class VM_GetCurrentContendedMonitor : public VM_Operation {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
  JvmtiEnv *_env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  JavaThread *_calling_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  JavaThread *_java_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  jobject *_owned_monitor_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  jvmtiError _result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  VM_GetCurrentContendedMonitor(JvmtiEnv *env, JavaThread *calling_thread, JavaThread *java_thread, jobject *mon_ptr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
    _env = env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
    _calling_thread = calling_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
    _java_thread = java_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
    _owned_monitor_ptr = mon_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  VMOp_Type type() const { return VMOp_GetCurrentContendedMonitor; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  jvmtiError result() { return _result; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  void doit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
    _result = ((JvmtiEnvBase *)_env)->get_current_contended_monitor(_calling_thread,_java_thread,_owned_monitor_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
// VM operation to get stack trace at safepoint.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
class VM_GetStackTrace : public VM_Operation {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  JvmtiEnv *_env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  JavaThread *_java_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  jint _start_depth;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
  jint _max_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  jvmtiFrameInfo *_frame_buffer;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  jint *_count_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  jvmtiError _result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  VM_GetStackTrace(JvmtiEnv *env, JavaThread *java_thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
                   jint start_depth, jint max_count,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
                   jvmtiFrameInfo* frame_buffer, jint* count_ptr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
    _env = env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
    _java_thread = java_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
    _start_depth = start_depth;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
    _max_count = max_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
    _frame_buffer = frame_buffer;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
    _count_ptr = count_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  jvmtiError result() { return _result; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  VMOp_Type type() const { return VMOp_GetStackTrace; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  void doit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
    _result = ((JvmtiEnvBase *)_env)->get_stack_trace(_java_thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
                                                      _start_depth, _max_count,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
                                                      _frame_buffer, _count_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
// forward declaration
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
struct StackInfoNode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
// VM operation to get stack trace at safepoint.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
class VM_GetMultipleStackTraces : public VM_Operation {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  JvmtiEnv *_env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
  jint _max_frame_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
  jvmtiStackInfo *_stack_info;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  jvmtiError _result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  int _frame_count_total;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  struct StackInfoNode *_head;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  JvmtiEnvBase *env()                 { return (JvmtiEnvBase *)_env; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  jint max_frame_count()              { return _max_frame_count; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
  struct StackInfoNode *head()        { return _head; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  void set_head(StackInfoNode *head)  { _head = head; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
  void set_result(jvmtiError result)  { _result = result; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  void fill_frames(jthread jt, JavaThread *thr, oop thread_oop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  void allocate_and_fill_stacks(jint thread_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  VM_GetMultipleStackTraces(JvmtiEnv *env, jint max_frame_count) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
    _env = env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
    _max_frame_count = max_frame_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
    _frame_count_total = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
    _head = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
    _result = JVMTI_ERROR_NONE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
  VMOp_Type type() const             { return VMOp_GetMultipleStackTraces; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
  jvmtiStackInfo *stack_info()       { return _stack_info; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
  jvmtiError result()                { return _result; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
// VM operation to get stack trace at safepoint.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
class VM_GetAllStackTraces : public VM_GetMultipleStackTraces {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  JavaThread *_calling_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
  jint _final_thread_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
  VM_GetAllStackTraces(JvmtiEnv *env, JavaThread *calling_thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
                       jint max_frame_count)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
      : VM_GetMultipleStackTraces(env, max_frame_count) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
    _calling_thread = calling_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
  VMOp_Type type() const          { return VMOp_GetAllStackTraces; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  void doit();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
  jint final_thread_count()       { return _final_thread_count; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
// VM operation to get stack trace at safepoint.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
class VM_GetThreadListStackTraces : public VM_GetMultipleStackTraces {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  jint _thread_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
  const jthread* _thread_list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  VM_GetThreadListStackTraces(JvmtiEnv *env, jint thread_count, const jthread* thread_list, jint max_frame_count)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
      : VM_GetMultipleStackTraces(env, max_frame_count) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
    _thread_count = thread_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
    _thread_list = thread_list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  VMOp_Type type() const { return VMOp_GetThreadListStackTraces; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
  void doit();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
// VM operation to count stack frames at safepoint.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
class VM_GetFrameCount : public VM_Operation {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
  JvmtiEnv *_env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  JvmtiThreadState *_state;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  jint *_count_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
  jvmtiError _result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  VM_GetFrameCount(JvmtiEnv *env, JvmtiThreadState *state, jint *count_ptr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
    _env = env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
    _state = state;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
    _count_ptr = count_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  VMOp_Type type() const { return VMOp_GetFrameCount; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  jvmtiError result()    { return _result; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  void doit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
    _result = ((JvmtiEnvBase*)_env)->get_frame_count(_state, _count_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
// VM operation to frame location at safepoint.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
class VM_GetFrameLocation : public VM_Operation {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  JvmtiEnv *_env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  JavaThread* _java_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  jint _depth;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  jmethodID* _method_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  jlocation* _location_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  jvmtiError _result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
  VM_GetFrameLocation(JvmtiEnv *env, JavaThread* java_thread, jint depth,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
                      jmethodID* method_ptr, jlocation* location_ptr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
    _env = env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
    _java_thread = java_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
    _depth = depth;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
    _method_ptr = method_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
    _location_ptr = location_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
  VMOp_Type type() const { return VMOp_GetFrameLocation; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
  jvmtiError result()    { return _result; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
  void doit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
    _result = ((JvmtiEnvBase*)_env)->get_frame_location(_java_thread, _depth,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
                                                        _method_ptr, _location_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
// ResourceTracker
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
// ResourceTracker works a little like a ResourceMark. All allocates
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
// using the resource tracker are recorded. If an allocate using the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
// resource tracker fails the destructor will free any resources
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
// that were allocated using the tracker.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
// The motive for this class is to avoid messy error recovery code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
// in situations where multiple allocations are done in sequence. If
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
// the second or subsequent allocation fails it avoids any code to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
// release memory allocated in the previous calls.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
// Usage :-
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
//   ResourceTracker rt(env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
//   :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
//   err = rt.allocate(1024, &ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
class ResourceTracker : public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  JvmtiEnv* _env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
  GrowableArray<unsigned char*> *_allocations;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
  bool _failed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  ResourceTracker(JvmtiEnv* env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
  ~ResourceTracker();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
  jvmtiError allocate(jlong size, unsigned char** mem_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
  unsigned char* allocate(jlong size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
  char* strdup(const char* str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
// Jvmti monitor closure to collect off stack monitors.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
class JvmtiMonitorClosure: public MonitorClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
  JavaThread *_java_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
  JavaThread *_calling_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
  GrowableArray<jvmtiMonitorStackDepthInfo*> *_owned_monitors_list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
  jvmtiError _error;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
  JvmtiEnvBase *_env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
  JvmtiMonitorClosure(JavaThread* thread, JavaThread *calling_thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
                      GrowableArray<jvmtiMonitorStackDepthInfo*> *owned_monitors,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
                      JvmtiEnvBase *env) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
    _java_thread = thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
    _calling_thread = calling_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
    _owned_monitors_list = owned_monitors;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
    _error = JVMTI_ERROR_NONE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
    _env = env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
  void do_monitor(ObjectMonitor* mon);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
  jvmtiError error() { return _error;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   617
#endif // SHARE_VM_PRIMS_JVMTIENVBASE_HPP