hotspot/src/share/vm/prims/jvmtiExport.hpp
author ysr
Thu, 03 Dec 2009 15:01:57 -0800
changeset 4461 c17c526d36ef
parent 1 489c9b5090e2
child 4491 212bd48525d4
permissions -rw-r--r--
6906727: UseCompressedOops: some card-marking fixes related to object arrays Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17). Reviewed-by: kvn, coleenp, jmasa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
     2
 * Copyright 1998-2006 Sun Microsystems, Inc.  All Rights Reserved.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    19
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    20
 * CA 95054 USA or visit www.sun.com if you need additional information or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    21
 * have any questions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
489c9b5090e2 Initial load
duke
parents:
diff changeset
    25
#ifndef _JAVA_JVMTIEXPORT_H_
489c9b5090e2 Initial load
duke
parents:
diff changeset
    26
#define _JAVA_JVMTIEXPORT_H_
489c9b5090e2 Initial load
duke
parents:
diff changeset
    27
489c9b5090e2 Initial load
duke
parents:
diff changeset
    28
// Forward declarations
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
class JvmtiEventControllerPrivate;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
class JvmtiManageCapabilities;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
class JvmtiEnv;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
class JvmtiThreadState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
class AttachOperation;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
#ifndef JVMTI_KERNEL
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
#define JVMTI_SUPPORT_FLAG(key)                                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
  private:                                                              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
  static bool  _##key;                                                  \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
  public:                                                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
  inline static void set_##key(bool on)       { _##key = (on != 0); }   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
  inline static bool key()                    { return _##key; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
#else  // JVMTI_KERNEL
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
#define JVMTI_SUPPORT_FLAG(key)                                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
  private:                                                                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
  const static bool _##key = false;                                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  public:                                                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
  inline static void set_##key(bool on)       { report_unsupported(on); } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  inline static bool key()                    { return _##key; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
#endif // JVMTI_KERNEL
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
// This class contains the JVMTI interface for the rest of hotspot.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
class JvmtiExport : public AllStatic {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  static int         _field_access_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  static int         _field_modification_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  static bool        _can_access_local_variables;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  static bool        _can_examine_or_deopt_anywhere;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  static bool        _can_hotswap_or_post_breakpoint;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  static bool        _can_modify_any_class;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  static bool        _can_walk_any_space;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  JVMTI_SUPPORT_FLAG(can_get_source_debug_extension)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  JVMTI_SUPPORT_FLAG(can_maintain_original_method_order)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  JVMTI_SUPPORT_FLAG(can_post_interpreter_events)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  JVMTI_SUPPORT_FLAG(can_post_exceptions)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  JVMTI_SUPPORT_FLAG(can_post_breakpoint)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  JVMTI_SUPPORT_FLAG(can_post_field_access)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  JVMTI_SUPPORT_FLAG(can_post_field_modification)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  JVMTI_SUPPORT_FLAG(can_post_method_entry)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  JVMTI_SUPPORT_FLAG(can_post_method_exit)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  JVMTI_SUPPORT_FLAG(can_pop_frame)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  JVMTI_SUPPORT_FLAG(can_force_early_return)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  friend class JvmtiEventControllerPrivate;  // should only modify these flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  JVMTI_SUPPORT_FLAG(should_post_single_step)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  JVMTI_SUPPORT_FLAG(should_post_field_access)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  JVMTI_SUPPORT_FLAG(should_post_field_modification)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  JVMTI_SUPPORT_FLAG(should_post_class_load)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  JVMTI_SUPPORT_FLAG(should_post_class_prepare)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  JVMTI_SUPPORT_FLAG(should_post_class_unload)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  JVMTI_SUPPORT_FLAG(should_post_native_method_bind)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  JVMTI_SUPPORT_FLAG(should_post_compiled_method_load)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  JVMTI_SUPPORT_FLAG(should_post_compiled_method_unload)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  JVMTI_SUPPORT_FLAG(should_post_dynamic_code_generated)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  JVMTI_SUPPORT_FLAG(should_post_monitor_contended_enter)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  JVMTI_SUPPORT_FLAG(should_post_monitor_contended_entered)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  JVMTI_SUPPORT_FLAG(should_post_monitor_wait)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  JVMTI_SUPPORT_FLAG(should_post_monitor_waited)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  JVMTI_SUPPORT_FLAG(should_post_data_dump)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  JVMTI_SUPPORT_FLAG(should_post_garbage_collection_start)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  JVMTI_SUPPORT_FLAG(should_post_garbage_collection_finish)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  // ------ the below maybe don't have to be (but are for now)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  // fixed conditions here ------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  // any events can be enabled
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  JVMTI_SUPPORT_FLAG(should_post_thread_life)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  JVMTI_SUPPORT_FLAG(should_post_object_free)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  JVMTI_SUPPORT_FLAG(should_post_resource_exhausted)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  // we are holding objects on the heap - need to talk to GC - e.g.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  // breakpoint info
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  JVMTI_SUPPORT_FLAG(should_clean_up_heap_objects)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  JVMTI_SUPPORT_FLAG(should_post_vm_object_alloc)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  // If flag cannot be implemented, give an error if on=true
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  static void report_unsupported(bool on);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  // these should only be called by the friend class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  friend class JvmtiManageCapabilities;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  inline static void set_can_examine_or_deopt_anywhere(bool on)        { _can_examine_or_deopt_anywhere = (on != 0); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  inline static void set_can_modify_any_class(bool on)                 { _can_modify_any_class = (on != 0); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  inline static void set_can_access_local_variables(bool on)           { _can_access_local_variables = (on != 0); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  inline static void set_can_hotswap_or_post_breakpoint(bool on)       { _can_hotswap_or_post_breakpoint = (on != 0); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  inline static void set_can_walk_any_space(bool on)                   { _can_walk_any_space = (on != 0); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  enum {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
    JVMTI_VERSION_MASK   = 0x70000000,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
    JVMTI_VERSION_VALUE  = 0x30000000,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
    JVMDI_VERSION_VALUE  = 0x20000000
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  static void post_field_modification(JavaThread *thread, methodOop method, address location,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
                                      KlassHandle field_klass, Handle object, jfieldID field,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
                                      char sig_type, jvalue *value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  // CompiledMethodUnload events are reported from the VM thread so they
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  // are collected in lists (of jmethodID/addresses) and the events are posted later
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  // from threads posting CompieldMethodLoad or DynamicCodeGenerated events.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  static bool _have_pending_compiled_method_unload_events;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  static GrowableArray<jmethodID>* _pending_compiled_method_unload_method_ids;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  static GrowableArray<const void *>* _pending_compiled_method_unload_code_begins;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  static JavaThread* _current_poster;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  // tests if there are CompiledMethodUnload events pending
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  inline static bool have_pending_compiled_method_unload_events() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
    return _have_pending_compiled_method_unload_events;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  // posts any pending CompiledMethodUnload events.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  static void post_pending_compiled_method_unload_events();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  // posts a DynamicCodeGenerated event (internal/private implementation).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  // The public post_dynamic_code_generated* functions make use of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  // internal implementation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  static void post_dynamic_code_generated_internal(const char *name, const void *code_begin, const void *code_end) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  // GenerateEvents support to allow posting of CompiledMethodLoad and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  // DynamicCodeGenerated events for a given environment.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  friend class JvmtiCodeBlobEvents;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  static void post_compiled_method_load(JvmtiEnv* env, const jmethodID method, const jint length,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
                                        const void *code_begin, const jint map_length,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
                                        const jvmtiAddrLocationMap* map) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  static void post_dynamic_code_generated(JvmtiEnv* env, const char *name, const void *code_begin,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
                                          const void *code_end) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  // The RedefineClasses() API breaks some invariants in the "regular"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  // system. For example, there are sanity checks when GC'ing nmethods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  // that require the containing class to be unloading. However, when a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  // method is redefined, the old method and nmethod can become GC'able
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  // without the containing class unloading. The state of becoming
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  // GC'able can be asynchronous to the RedefineClasses() call since
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  // the old method may still be running and cannot be GC'ed until
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  // after all old invocations have finished. Additionally, a method
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  // that has not been redefined may have an nmethod that depends on
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  // the redefined method. The dependent nmethod will get deopted in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  // this case and may also be GC'able without the containing class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  // being unloaded.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  // This flag indicates whether RedefineClasses() has ever redefined
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  // one or more classes during the lifetime of the VM. The flag should
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  // only be set by the friend class and can be queried by other sub
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  // systems as needed to relax invariant checks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  static bool _has_redefined_a_class;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  friend class VM_RedefineClasses;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  inline static void set_has_redefined_a_class() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
    _has_redefined_a_class = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  // Flag to indicate if the compiler has recorded all dependencies. When the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  // can_redefine_classes capability is enabled in the OnLoad phase then the compiler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  // records all dependencies from startup. However if the capability is first
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  // enabled some time later then the dependencies recorded by the compiler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  // are incomplete. This flag is used by RedefineClasses to know if the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  // dependency information is complete or not.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  static bool _all_dependencies_are_recorded;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  inline static bool has_redefined_a_class() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
    return _has_redefined_a_class;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  inline static bool all_dependencies_are_recorded() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
    return _all_dependencies_are_recorded;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  inline static void set_all_dependencies_are_recorded(bool on) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
    _all_dependencies_are_recorded = (on != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  // let JVMTI know that the JVM_OnLoad code is running
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  static void enter_onload_phase();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  // let JVMTI know that the VM isn't up yet (and JVM_OnLoad code isn't running)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  static void enter_primordial_phase();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  // let JVMTI know that the VM isn't up yet but JNI is live
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  static void enter_start_phase();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  // let JVMTI know that the VM is fully up and running now
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  static void enter_live_phase();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  // ------ can_* conditions (below) are set at OnLoad and never changed ------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  inline static bool can_examine_or_deopt_anywhere()              { return _can_examine_or_deopt_anywhere; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  inline static bool can_modify_any_class()                       { return _can_modify_any_class; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  inline static bool can_access_local_variables()                 { return _can_access_local_variables; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  inline static bool can_hotswap_or_post_breakpoint()             { return _can_hotswap_or_post_breakpoint; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  inline static bool can_walk_any_space()                         { return _can_walk_any_space; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  // field access management
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  static address  get_field_access_count_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  // field modification management
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  static address  get_field_modification_count_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  // -----------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  static bool is_jvmti_version(jint version)                      { return (version & JVMTI_VERSION_MASK) == JVMTI_VERSION_VALUE; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  static bool is_jvmdi_version(jint version)                      { return (version & JVMTI_VERSION_MASK) == JVMDI_VERSION_VALUE; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  static jint get_jvmti_interface(JavaVM *jvm, void **penv, jint version);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  // single stepping management methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  static void at_single_stepping_point(JavaThread *thread, methodOop method, address location) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  static void expose_single_stepping(JavaThread *thread) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  static bool hide_single_stepping(JavaThread *thread) KERNEL_RETURN_(return false;);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  // Methods that notify the debugger that something interesting has happened in the VM.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  static void post_vm_start              ();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  static void post_vm_initialized        ();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  static void post_vm_death              ();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  static void post_single_step           (JavaThread *thread, methodOop method, address location) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  static void post_raw_breakpoint        (JavaThread *thread, methodOop method, address location) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  static void post_exception_throw       (JavaThread *thread, methodOop method, address location, oop exception) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  static void notice_unwind_due_to_exception (JavaThread *thread, methodOop method, address location, oop exception, bool in_handler_frame) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  static oop jni_GetField_probe          (JavaThread *thread, jobject jobj,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
    oop obj, klassOop klass, jfieldID fieldID, bool is_static)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
    KERNEL_RETURN_(return NULL;);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  static oop jni_GetField_probe_nh       (JavaThread *thread, jobject jobj,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
    oop obj, klassOop klass, jfieldID fieldID, bool is_static)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
    KERNEL_RETURN_(return NULL;);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  static void post_field_access_by_jni   (JavaThread *thread, oop obj,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
    klassOop klass, jfieldID fieldID, bool is_static) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  static void post_field_access          (JavaThread *thread, methodOop method,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
    address location, KlassHandle field_klass, Handle object, jfieldID field) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  static oop jni_SetField_probe          (JavaThread *thread, jobject jobj,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
    oop obj, klassOop klass, jfieldID fieldID, bool is_static, char sig_type,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
    jvalue *value) KERNEL_RETURN_(return NULL;);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  static oop jni_SetField_probe_nh       (JavaThread *thread, jobject jobj,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
    oop obj, klassOop klass, jfieldID fieldID, bool is_static, char sig_type,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
    jvalue *value) KERNEL_RETURN_(return NULL;);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  static void post_field_modification_by_jni(JavaThread *thread, oop obj,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
    klassOop klass, jfieldID fieldID, bool is_static, char sig_type,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
    jvalue *value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  static void post_raw_field_modification(JavaThread *thread, methodOop method,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
    address location, KlassHandle field_klass, Handle object, jfieldID field,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
    char sig_type, jvalue *value) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  static void post_method_entry          (JavaThread *thread, methodOop method, frame current_frame) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  static void post_method_exit           (JavaThread *thread, methodOop method, frame current_frame) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  static void post_class_load            (JavaThread *thread, klassOop klass) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  static void post_class_unload          (klassOop klass) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  static void post_class_prepare         (JavaThread *thread, klassOop klass) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  static void post_thread_start          (JavaThread *thread) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  static void post_thread_end            (JavaThread *thread) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  // Support for java.lang.instrument agent loading.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  static bool _should_post_class_file_load_hook;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  inline static void set_should_post_class_file_load_hook(bool on)     { _should_post_class_file_load_hook = on;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  inline static bool should_post_class_file_load_hook()           { return _should_post_class_file_load_hook; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  static void post_class_file_load_hook(symbolHandle h_name, Handle class_loader,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
                                        Handle h_protection_domain,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
                                        unsigned char **data_ptr, unsigned char **end_ptr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
                                        unsigned char **cached_data_ptr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
                                        jint *cached_length_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  static void post_native_method_bind(methodOop method, address* function_ptr) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  static void post_compiled_method_load(nmethod *nm) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  static void post_dynamic_code_generated(const char *name, const void *code_begin, const void *code_end) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  // used at a safepoint to post a CompiledMethodUnload event
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  static void post_compiled_method_unload_at_safepoint(jmethodID mid, const void *code_begin) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  // similiar to post_dynamic_code_generated except that it can be used to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  // post a DynamicCodeGenerated event while holding locks in the VM. Any event
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  // posted using this function is recorded by the enclosing event collector
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  // -- JvmtiDynamicCodeEventCollector.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  static void post_dynamic_code_generated_while_holding_locks(const char* name, address code_begin, address code_end) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  static void post_garbage_collection_finish() KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  static void post_garbage_collection_start() KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  static void post_data_dump() KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  static void post_monitor_contended_enter(JavaThread *thread, ObjectMonitor *obj_mntr) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  static void post_monitor_contended_entered(JavaThread *thread, ObjectMonitor *obj_mntr) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  static void post_monitor_wait(JavaThread *thread, oop obj, jlong timeout) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  static void post_monitor_waited(JavaThread *thread, ObjectMonitor *obj_mntr, jboolean timed_out) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  static void post_object_free(JvmtiEnv* env, jlong tag) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  static void post_resource_exhausted(jint resource_exhausted_flags, const char* detail) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  static void record_vm_internal_object_allocation(oop object) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  // Post objects collected by vm_object_alloc_event_collector.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  static void post_vm_object_alloc(JavaThread *thread, oop object) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  // Collects vm internal objects for later event posting.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  inline static void vm_object_alloc_event_collector(oop object) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
    if (should_post_vm_object_alloc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
      record_vm_internal_object_allocation(object);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  static void cleanup_thread             (JavaThread* thread) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  static void oops_do(OopClosure* f) KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  static void transition_pending_onload_raw_monitors() KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
#ifndef SERVICES_KERNEL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  // attach support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  static jint load_agent_library(AttachOperation* op, outputStream* out);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
#endif // SERVICES_KERNEL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  // SetNativeMethodPrefix support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
  static char** get_all_native_method_prefixes(int* count_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  // call after CMS has completed referencing processing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  static void cms_ref_processing_epilogue() KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
// Support class used by JvmtiDynamicCodeEventCollector and others. It
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
// describes a single code blob by name and address range.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
class JvmtiCodeBlobDesc : public CHeapObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  char _name[64];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  address _code_begin;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  address _code_end;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  JvmtiCodeBlobDesc(const char *name, address code_begin, address code_end) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
    assert(name != NULL, "all code blobs must be named");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
    strncpy(_name, name, sizeof(_name));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
    _name[sizeof(_name)-1] = '\0';
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
    _code_begin = code_begin;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
    _code_end = code_end;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  char* name()                  { return _name; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  address code_begin()          { return _code_begin; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  address code_end()            { return _code_end; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
// JvmtiEventCollector is a helper class to setup thread for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
// event collection.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
class JvmtiEventCollector : public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  JvmtiEventCollector* _prev;  // Save previous one to support nested event collector.
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
  void setup_jvmti_thread_state(); // Set this collector in current thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  void unset_jvmti_thread_state(); // Reset previous collector in current thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  virtual bool is_dynamic_code_event()   { return false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  virtual bool is_vm_object_alloc_event(){ return false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  JvmtiEventCollector *get_prev()        { return _prev; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
// A JvmtiDynamicCodeEventCollector is a helper class for the JvmtiExport
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
// interface. It collects "dynamic code generated" events that are posted
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
// while holding locks. When the event collector goes out of scope the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
// events will be posted.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
// Usage :-
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
// {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
//   JvmtiDynamicCodeEventCollector event_collector;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
//   :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
//   { MutexLocker ml(...)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
//     :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
//     JvmtiExport::post_dynamic_code_generated_while_holding_locks(...)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
//   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
//   // event collector goes out of scope => post events to profiler.
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 JvmtiDynamicCodeEventCollector : public JvmtiEventCollector {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  GrowableArray<JvmtiCodeBlobDesc*>* _code_blobs;           // collected code blob events
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  friend class JvmtiExport;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  void register_stub(const char* name, address start, address end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  JvmtiDynamicCodeEventCollector()  KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  ~JvmtiDynamicCodeEventCollector() KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  bool is_dynamic_code_event()   { return true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
// Used to record vm internally allocated object oops and post
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
// vm object alloc event for objects visible to java world.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
// Constructor enables JvmtiThreadState flag and all vm allocated
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
// objects are recorded in a growable array. When destructor is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
// called the vm object alloc event is posted for each objects
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
// visible to java world.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
// See jvm.cpp file for its usage.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
class JvmtiVMObjectAllocEventCollector : public JvmtiEventCollector {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  GrowableArray<oop>* _allocated; // field to record vm internally allocated object oop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  bool _enable;                   // This flag is enabled in constructor and disabled
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
                                  // in destructor before posting event. To avoid
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
                                  // collection of objects allocated while running java code inside
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
                                  // agent post_vm_object_alloc() event handler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  //GC support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  void oops_do(OopClosure* f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  friend class JvmtiExport;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  // Record vm allocated object oop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  inline void record_allocation(oop obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  //GC support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
  static void oops_do_for_all_threads(OopClosure* f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  JvmtiVMObjectAllocEventCollector()  KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  ~JvmtiVMObjectAllocEventCollector() KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  bool is_vm_object_alloc_event()   { return true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  bool is_enabled()                 { return _enable; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  void set_enabled(bool on)         { _enable = on; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
// Marker class to disable the posting of VMObjectAlloc events
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
// within its scope.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
// Usage :-
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
// {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
//   NoJvmtiVMObjectAllocMark njm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
//   :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
//   // VMObjAlloc event will not be posted
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
//   JvmtiExport::vm_object_alloc_event_collector(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
//   :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
// }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
class NoJvmtiVMObjectAllocMark : public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  // enclosing collector if enabled, NULL otherwise
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  JvmtiVMObjectAllocEventCollector *_collector;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  bool was_enabled()    { return _collector != NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  NoJvmtiVMObjectAllocMark() KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  ~NoJvmtiVMObjectAllocMark() KERNEL_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
// Base class for reporting GC events to JVMTI.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
class JvmtiGCMarker : public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
  bool _full;                           // marks a "full" GC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  unsigned int _invocation_count;       // GC invocation count
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
  JvmtiGCMarker(bool full) KERNEL_RETURN;       // protected
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  ~JvmtiGCMarker() KERNEL_RETURN;               // protected
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
// Support class used to report GC events to JVMTI. The class is stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
// allocated and should be placed in the doit() implementation of all
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
// vm operations that do a stop-the-world GC for failed allocation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
// Usage :-
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
// void VM_GenCollectForAllocation::doit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
//   JvmtiGCForAllocationMarker jgcm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
//   :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
// }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
// If jvmti is not enabled the constructor and destructor is essentially
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
// a no-op (no overhead).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
class JvmtiGCForAllocationMarker : public JvmtiGCMarker {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
  JvmtiGCForAllocationMarker() : JvmtiGCMarker(false) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
// Support class used to report GC events to JVMTI. The class is stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
// allocated and should be placed in the doit() implementation of all
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
// vm operations that do a "full" stop-the-world GC. This class differs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
// from JvmtiGCForAllocationMarker in that this class assumes that a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
// "full" GC will happen.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
// Usage :-
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
// void VM_GenCollectFull::doit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
//   JvmtiGCFullMarker jgcm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
//   :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
// }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
class JvmtiGCFullMarker : public JvmtiGCMarker {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  JvmtiGCFullMarker() : JvmtiGCMarker(true) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
// JvmtiHideSingleStepping is a helper class for hiding
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
// internal single step events.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
class JvmtiHideSingleStepping : public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  bool         _single_step_hidden;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  JavaThread * _thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  JvmtiHideSingleStepping(JavaThread * thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
    assert(thread != NULL, "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
    _single_step_hidden = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
    _thread = thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
    if (JvmtiExport::should_post_single_step()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
      _single_step_hidden = JvmtiExport::hide_single_stepping(_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  ~JvmtiHideSingleStepping() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
    if (_single_step_hidden) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
      JvmtiExport::expose_single_stepping(_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
#endif   /* _JAVA_JVMTIEXPORT_H_ */