hotspot/src/share/vm/prims/jvmtiThreadState.hpp
author stefank
Mon, 01 Oct 2012 13:29:11 +0200
changeset 13922 ab7d352debe6
parent 13728 882756847a04
child 13975 2f7431485cfa
permissions -rw-r--r--
8000227: [obj|type]ArrayKlass::oop_print_on prints one line to tty instead of the provided output stream Reviewed-by: brutisso, sla, jmasa, coleenp
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: 4761
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4761
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: 4761
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_JVMTITHREADSTATE_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#define SHARE_VM_PRIMS_JVMTITHREADSTATE_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 "jvmtifiles/jvmti.h"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    29
#include "memory/allocation.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    30
#include "memory/allocation.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    31
#include "prims/jvmtiEventController.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    32
#include "runtime/thread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    33
#include "utilities/growableArray.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
// Forward Declarations
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
class JvmtiEnvBase;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
class JvmtiEnvThreadState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
class JvmtiDynamicCodeEventCollector;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
enum JvmtiClassLoadKind {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  jvmti_class_load_kind_load = 100,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
  jvmti_class_load_kind_retransform,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
  jvmti_class_load_kind_redefine
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
///////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
// class JvmtiEnvThreadStateIterator
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
// The only safe means of iterating through the JvmtiEnvThreadStates
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
// in a JvmtiThreadState.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
// Note that this iteratation includes invalid environments pending
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
// deallocation -- in fact, some uses depend on this behavior.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
class JvmtiEnvThreadStateIterator : public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  JvmtiThreadState* state;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  JvmtiEnvThreadStateIterator(JvmtiThreadState* thread_state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  ~JvmtiEnvThreadStateIterator();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  JvmtiEnvThreadState* first();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  JvmtiEnvThreadState* next(JvmtiEnvThreadState* ets);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
///////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
// class JvmtiThreadState
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
// The Jvmti state for each thread (across all JvmtiEnv):
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
// 1. Local table of enabled events.
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11588
diff changeset
    75
class JvmtiThreadState : public CHeapObj<mtInternal> {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  friend class JvmtiEnv;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  JavaThread        *_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  bool              _exception_detected;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  bool              _exception_caught;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  bool              _hide_single_stepping;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  bool              _pending_step_for_popframe;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  bool              _pending_step_for_earlyret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  int               _hide_level;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  // Used to send class being redefined/retransformed and kind of transform
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  // info to the class file load hook event handler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  KlassHandle           *_class_being_redefined;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  JvmtiClassLoadKind    _class_load_kind;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  // This is only valid when is_interp_only_mode() returns true
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  int               _cur_stack_depth;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  JvmtiThreadEventEnable _thread_event_enable;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  // for support of JvmtiEnvThreadState
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  JvmtiEnvThreadState*   _head_env_thread_state;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  // doubly-linked linear list of active thread state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  // needed in order to iterate the list without holding Threads_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  static JvmtiThreadState *_head;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  JvmtiThreadState *_next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  JvmtiThreadState *_prev;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  // holds the current dynamic code event collector, NULL if no event collector in use
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  JvmtiDynamicCodeEventCollector* _dynamic_code_event_collector;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  // holds the current vm object alloc event collector, NULL if no event collector in use
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  JvmtiVMObjectAllocEventCollector* _vm_object_alloc_event_collector;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  // Should only be created by factory methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  JvmtiThreadState(JavaThread *thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  friend class JvmtiEnvThreadStateIterator;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  inline JvmtiEnvThreadState* head_env_thread_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  inline void set_head_env_thread_state(JvmtiEnvThreadState* ets);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  ~JvmtiThreadState();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  // is event_type enabled and usable for this thread in any enviroments?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  bool is_enabled(jvmtiEvent event_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
    return _thread_event_enable.is_enabled(event_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  JvmtiThreadEventEnable *thread_event_enable() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
    return &_thread_event_enable;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  // Must only be called in situations where the state is for the current thread and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  // the environment can not go away.  To be safe, the returned JvmtiEnvThreadState
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  // must be used in such a way as there can be no intervening safepoints.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  inline JvmtiEnvThreadState* env_thread_state(JvmtiEnvBase *env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  static void periodic_clean_up();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  void add_env(JvmtiEnvBase *env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  // Used by the interpreter for fullspeed debugging support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  bool is_interp_only_mode()                { return _thread->is_interp_only_mode(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  void enter_interp_only_mode();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  void leave_interp_only_mode();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  // access to the linked list of all JVMTI thread states
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  static JvmtiThreadState *first() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
    assert(Threads::number_of_threads() == 0 || JvmtiThreadState_lock->is_locked(), "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
    return _head;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  JvmtiThreadState *next()                  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
    return _next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  // Current stack depth is only valid when is_interp_only_mode() returns true.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  // These functions should only be called at a safepoint - usually called from same thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  // Returns the number of Java activations on the stack.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  int cur_stack_depth();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  void invalidate_cur_stack_depth();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  void incr_cur_stack_depth();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  void decr_cur_stack_depth();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  int count_frames();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  inline JavaThread *get_thread()      { return _thread;              }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  inline bool is_exception_detected()  { return _exception_detected;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  inline bool is_exception_caught()    { return _exception_caught;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  inline void set_exception_detected() { _exception_detected = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
                                         _exception_caught = false; }
11588
e616efa1a931 6972759: Step over not working after thrown exception and Pop
bpittore
parents: 7397
diff changeset
   168
  inline void clear_exception_detected() {
e616efa1a931 6972759: Step over not working after thrown exception and Pop
bpittore
parents: 7397
diff changeset
   169
    _exception_detected = false;
e616efa1a931 6972759: Step over not working after thrown exception and Pop
bpittore
parents: 7397
diff changeset
   170
    assert(_exception_caught == false, "_exception_caught is out of phase");
e616efa1a931 6972759: Step over not working after thrown exception and Pop
bpittore
parents: 7397
diff changeset
   171
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  inline void set_exception_caught()   { _exception_caught = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
                                         _exception_detected = false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  inline void clear_hide_single_stepping() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
    if (_hide_level > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
      _hide_level--;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
      assert(_hide_single_stepping, "hide_single_stepping is out of phase");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
      _hide_single_stepping = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  inline bool hide_single_stepping() { return _hide_single_stepping; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  inline void set_hide_single_stepping() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
    if (_hide_single_stepping) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
      _hide_level++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
      assert(_hide_level == 0, "hide_level is out of phase");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
      _hide_single_stepping = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  // Step pending flag is set when PopFrame is called and it is cleared
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  // when step for the Pop Frame is completed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  // This logic is used to distinguish b/w step for pop frame and repeat step.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  void set_pending_step_for_popframe() { _pending_step_for_popframe = true;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  void clr_pending_step_for_popframe() { _pending_step_for_popframe = false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  bool is_pending_step_for_popframe()  { return _pending_step_for_popframe;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  void process_pending_step_for_popframe();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  // Step pending flag is set when ForceEarlyReturn is called and it is cleared
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  // when step for the ForceEarlyReturn is completed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  // This logic is used to distinguish b/w step for early return and repeat step.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  void set_pending_step_for_earlyret() { _pending_step_for_earlyret = true;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  void clr_pending_step_for_earlyret() { _pending_step_for_earlyret = false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  bool is_pending_step_for_earlyret()  { return _pending_step_for_earlyret;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  void process_pending_step_for_earlyret();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  // Setter and getter method is used to send redefined class info
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  // when class file load hook event is posted.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  // It is set while loading redefined class and cleared before the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  // class file load hook event is posted.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  inline void set_class_being_redefined(KlassHandle *h_class, JvmtiClassLoadKind kind) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
    _class_being_redefined = h_class;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
    _class_load_kind = kind;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  inline void clear_class_being_redefined() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
    _class_being_redefined = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
    _class_load_kind = jvmti_class_load_kind_load;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  inline KlassHandle *get_class_being_redefined() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
    return _class_being_redefined;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  inline JvmtiClassLoadKind get_class_load_kind() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
    return _class_load_kind;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  // RedefineClasses support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  // The bug 6214132 caused the verification to fail.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  // Below is the detailed description of the fix approach taken:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  // 1. What's done in RedefineClasses() before verification:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  //  a) A reference to the class being redefined (_the_class) and a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  //     reference to new version of the class (_scratch_class) are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  //     saved here for use during the bytecode verification phase of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  //     RedefineClasses. See RedefineVerifyMark for how these fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  //     are managed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  //   b) The _java_mirror field from _the_class is copied to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  //     _java_mirror field in _scratch_class. This means that a jclass
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  //     returned for _the_class or _scratch_class will refer to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  //     same Java mirror. The verifier will see the "one true mirror"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  //     for the class being verified.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  // 2. What is done at verification:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  //   When the verifier makes calls into the VM to ask questions about
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  //   the class being verified, it will pass the jclass to JVM_* functions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  //   The jclass is always pointing to the mirror of _the_class.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  //   ~28 JVM_* functions called by the verifier for the information
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  //   about CP entries and klass structure should check the jvmtiThreadState
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   252
  //   info about equivalent klass versions and use it to replace a Klass*
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   253
  //   of _the_class with a Klass* of _scratch_class. The function
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  //   class_to_verify_considering_redefinition() must be called for it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  //   Note again, that this redirection happens only for the verifier thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  //   Other threads have very small overhead by checking the existence
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  //   of the jvmtiThreadSate and the information about klasses equivalence.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  //   No JNI functions need to be changed, they don't reference the klass guts.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  //   The JavaThread pointer is already available in all JVM_* functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  //   used by the verifier, so there is no extra performance issue with it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  KlassHandle *_the_class_for_redefinition_verification;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  KlassHandle *_scratch_class_for_redefinition_verification;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  inline void set_class_versions_map(KlassHandle *the_class,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
                                     KlassHandle *scratch_class) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
    _the_class_for_redefinition_verification = the_class;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
    _scratch_class_for_redefinition_verification = scratch_class;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  inline void clear_class_versions_map() { set_class_versions_map(NULL, NULL); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  static inline
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   277
  Klass* class_to_verify_considering_redefinition(Klass* klass,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
                                                    JavaThread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
    JvmtiThreadState *state = thread->jvmti_thread_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
    if (state != NULL && state->_the_class_for_redefinition_verification != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
      if ((*(state->_the_class_for_redefinition_verification))() == klass) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
        klass = (*(state->_scratch_class_for_redefinition_verification))();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
    return klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  // Todo: get rid of this!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  bool _debuggable;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  // Should the thread be enumerated by jvmtiInternal::GetAllThreads?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  bool is_debuggable()                 { return _debuggable; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  // If a thread cannot be suspended (has no valid last_java_frame) then it gets marked !debuggable
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  void set_debuggable(bool debuggable) { _debuggable = debuggable; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  bool may_be_walked();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  // Thread local event collector setter and getter methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  JvmtiDynamicCodeEventCollector* get_dynamic_code_event_collector() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
    return _dynamic_code_event_collector;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  JvmtiVMObjectAllocEventCollector* get_vm_object_alloc_event_collector() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
    return _vm_object_alloc_event_collector;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  void set_dynamic_code_event_collector(JvmtiDynamicCodeEventCollector* collector) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
    _dynamic_code_event_collector = collector;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  void set_vm_object_alloc_event_collector(JvmtiVMObjectAllocEventCollector* collector) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
    _vm_object_alloc_event_collector = collector;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  // Frame routines
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  //  true when the thread was suspended with a pointer to the last Java frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  bool has_last_frame()                     { return _thread->has_last_Java_frame(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  void update_for_pop_top_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  // already holding JvmtiThreadState_lock - retrieve or create JvmtiThreadState
2135
f82c3012ec86 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 2134
diff changeset
   328
  // Can return NULL if JavaThread is exiting.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  inline static JvmtiThreadState *state_for_while_locked(JavaThread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
    assert(JvmtiThreadState_lock->is_locked(), "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
    JvmtiThreadState *state = thread->jvmti_thread_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
    if (state == NULL) {
2134
125f0fb7e9b1 6700114: 3/4 Assertion (_thread->get_interp_only_mode() == 1,"leaving interp only when mode not one")
dcubed
parents: 1
diff changeset
   334
      if (thread->is_exiting()) {
125f0fb7e9b1 6700114: 3/4 Assertion (_thread->get_interp_only_mode() == 1,"leaving interp only when mode not one")
dcubed
parents: 1
diff changeset
   335
        // don't add a JvmtiThreadState to a thread that is exiting
125f0fb7e9b1 6700114: 3/4 Assertion (_thread->get_interp_only_mode() == 1,"leaving interp only when mode not one")
dcubed
parents: 1
diff changeset
   336
        return NULL;
125f0fb7e9b1 6700114: 3/4 Assertion (_thread->get_interp_only_mode() == 1,"leaving interp only when mode not one")
dcubed
parents: 1
diff changeset
   337
      }
125f0fb7e9b1 6700114: 3/4 Assertion (_thread->get_interp_only_mode() == 1,"leaving interp only when mode not one")
dcubed
parents: 1
diff changeset
   338
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
      state = new JvmtiThreadState(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
    return state;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  // retrieve or create JvmtiThreadState
2135
f82c3012ec86 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 2134
diff changeset
   345
  // Can return NULL if JavaThread is exiting.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  inline static JvmtiThreadState *state_for(JavaThread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
    JvmtiThreadState *state = thread->jvmti_thread_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
    if (state == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
      MutexLocker mu(JvmtiThreadState_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
      // check again with the lock held
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
      state = state_for_while_locked(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
      CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
    return state;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  // JVMTI ForceEarlyReturn support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  // This is set to earlyret_pending to signal that top Java frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
  // should be returned immediately
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  int           _earlyret_state;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  TosState      _earlyret_tos;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  jvalue        _earlyret_value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  oop           _earlyret_oop;         // Used to return an oop result into Java code from
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
                                       // ForceEarlyReturnObject, GC-preserved
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  // Setting and clearing earlyret_state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  // earlyret_pending indicates that a ForceEarlyReturn() has been
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  // requested and not yet been completed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  enum EarlyretState {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
    earlyret_inactive = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
    earlyret_pending  = 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  void set_earlyret_pending(void) { _earlyret_state = earlyret_pending;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  void clr_earlyret_pending(void) { _earlyret_state = earlyret_inactive; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  bool is_earlyret_pending(void)  { return (_earlyret_state == earlyret_pending);  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  TosState earlyret_tos()                            { return _earlyret_tos; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  oop  earlyret_oop() const                          { return _earlyret_oop; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  void set_earlyret_oop (oop x)                      { _earlyret_oop = x;    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  jvalue earlyret_value()                            { return _earlyret_value; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  void set_earlyret_value(jvalue val, TosState tos)  { _earlyret_tos = tos;  _earlyret_value = val;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
  void clr_earlyret_value()                          { _earlyret_tos = ilgl; _earlyret_value.j = 0L; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  static ByteSize earlyret_state_offset() { return byte_offset_of(JvmtiThreadState, _earlyret_state); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  static ByteSize earlyret_tos_offset()   { return byte_offset_of(JvmtiThreadState, _earlyret_tos); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  static ByteSize earlyret_oop_offset()   { return byte_offset_of(JvmtiThreadState, _earlyret_oop); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  static ByteSize earlyret_value_offset() { return byte_offset_of(JvmtiThreadState, _earlyret_value); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  void oops_do(OopClosure* f); // GC support
4761
bdb7375a1fee 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 2135
diff changeset
   395
bdb7375a1fee 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 2135
diff changeset
   396
public:
bdb7375a1fee 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 2135
diff changeset
   397
  void set_should_post_on_exceptions(bool val) { _thread->set_should_post_on_exceptions_flag(val ? JNI_TRUE : JNI_FALSE); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
class RedefineVerifyMark : public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  JvmtiThreadState *_state;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   403
  KlassHandle       _scratch_class;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   404
  Handle            _scratch_mirror;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  RedefineVerifyMark(KlassHandle *the_class, KlassHandle *scratch_class,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   408
                     JvmtiThreadState *state) : _state(state), _scratch_class(*scratch_class)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
    _state->set_class_versions_map(the_class, scratch_class);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   411
    _scratch_mirror = Handle(_scratch_class->java_mirror());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
    (*scratch_class)->set_java_mirror((*the_class)->java_mirror());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  ~RedefineVerifyMark() {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   416
    // Restore the scratch class's mirror, so when scratch_class is removed
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   417
    // the correct mirror pointing to it can be cleared.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   418
    _scratch_class->set_java_mirror(_scratch_mirror());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
    _state->clear_class_versions_map();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   423
#endif // SHARE_VM_PRIMS_JVMTITHREADSTATE_HPP