hotspot/src/share/vm/prims/jvmtiEventController.cpp
author ysr
Thu, 03 Dec 2009 15:01:57 -0800
changeset 4461 c17c526d36ef
parent 2135 f82c3012ec86
child 4761 bdb7375a1fee
permissions -rw-r--r--
6906727: UseCompressedOops: some card-marking fixes related to object arrays Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17). Reviewed-by: kvn, coleenp, jmasa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
     2
 * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    19
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    20
 * CA 95054 USA or visit www.sun.com if you need additional information or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    21
 * have any questions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
489c9b5090e2 Initial load
duke
parents:
diff changeset
    25
# include "incls/_precompiled.incl"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    26
# include "incls/_jvmtiEventController.cpp.incl"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    27
489c9b5090e2 Initial load
duke
parents:
diff changeset
    28
#ifdef JVMTI_TRACE
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
#define EC_TRACE(out) if (JvmtiTrace::trace_event_controller()) { SafeResourceMark rm; tty->print_cr out; } while (0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
#define EC_TRACE(out)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
#endif /*JVMTI_TRACE */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
// bits for standard events
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
static const jlong  SINGLE_STEP_BIT = (((jlong)1) << (JVMTI_EVENT_SINGLE_STEP - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
static const jlong  FRAME_POP_BIT = (((jlong)1) << (JVMTI_EVENT_FRAME_POP - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
static const jlong  BREAKPOINT_BIT = (((jlong)1) << (JVMTI_EVENT_BREAKPOINT - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
static const jlong  FIELD_ACCESS_BIT = (((jlong)1) << (JVMTI_EVENT_FIELD_ACCESS - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
static const jlong  FIELD_MODIFICATION_BIT = (((jlong)1) << (JVMTI_EVENT_FIELD_MODIFICATION - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
static const jlong  METHOD_ENTRY_BIT = (((jlong)1) << (JVMTI_EVENT_METHOD_ENTRY - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
static const jlong  METHOD_EXIT_BIT = (((jlong)1) << (JVMTI_EVENT_METHOD_EXIT - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
static const jlong  CLASS_FILE_LOAD_HOOK_BIT = (((jlong)1) << (JVMTI_EVENT_CLASS_FILE_LOAD_HOOK - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
static const jlong  NATIVE_METHOD_BIND_BIT = (((jlong)1) << (JVMTI_EVENT_NATIVE_METHOD_BIND - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
static const jlong  VM_START_BIT = (((jlong)1) << (JVMTI_EVENT_VM_START - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
static const jlong  VM_INIT_BIT = (((jlong)1) << (JVMTI_EVENT_VM_INIT - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
static const jlong  VM_DEATH_BIT = (((jlong)1) << (JVMTI_EVENT_VM_DEATH - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
static const jlong  CLASS_LOAD_BIT = (((jlong)1) << (JVMTI_EVENT_CLASS_LOAD - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
static const jlong  CLASS_PREPARE_BIT = (((jlong)1) << (JVMTI_EVENT_CLASS_PREPARE - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
static const jlong  THREAD_START_BIT = (((jlong)1) << (JVMTI_EVENT_THREAD_START - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
static const jlong  THREAD_END_BIT = (((jlong)1) << (JVMTI_EVENT_THREAD_END - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
static const jlong  EXCEPTION_THROW_BIT = (((jlong)1) << (JVMTI_EVENT_EXCEPTION - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
static const jlong  EXCEPTION_CATCH_BIT = (((jlong)1) << (JVMTI_EVENT_EXCEPTION_CATCH - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
static const jlong  MONITOR_CONTENDED_ENTER_BIT = (((jlong)1) << (JVMTI_EVENT_MONITOR_CONTENDED_ENTER - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
static const jlong  MONITOR_CONTENDED_ENTERED_BIT = (((jlong)1) << (JVMTI_EVENT_MONITOR_CONTENDED_ENTERED - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
static const jlong  MONITOR_WAIT_BIT = (((jlong)1) << (JVMTI_EVENT_MONITOR_WAIT - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
static const jlong  MONITOR_WAITED_BIT = (((jlong)1) << (JVMTI_EVENT_MONITOR_WAITED - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
static const jlong  DYNAMIC_CODE_GENERATED_BIT = (((jlong)1) << (JVMTI_EVENT_DYNAMIC_CODE_GENERATED - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
static const jlong  DATA_DUMP_BIT = (((jlong)1) << (JVMTI_EVENT_DATA_DUMP_REQUEST - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
static const jlong  COMPILED_METHOD_LOAD_BIT = (((jlong)1) << (JVMTI_EVENT_COMPILED_METHOD_LOAD - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
static const jlong  COMPILED_METHOD_UNLOAD_BIT = (((jlong)1) << (JVMTI_EVENT_COMPILED_METHOD_UNLOAD - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
static const jlong  GARBAGE_COLLECTION_START_BIT = (((jlong)1) << (JVMTI_EVENT_GARBAGE_COLLECTION_START - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
static const jlong  GARBAGE_COLLECTION_FINISH_BIT = (((jlong)1) << (JVMTI_EVENT_GARBAGE_COLLECTION_FINISH - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
static const jlong  OBJECT_FREE_BIT = (((jlong)1) << (JVMTI_EVENT_OBJECT_FREE - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
static const jlong  RESOURCE_EXHAUSTED_BIT = (((jlong)1) << (JVMTI_EVENT_RESOURCE_EXHAUSTED - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
static const jlong  VM_OBJECT_ALLOC_BIT = (((jlong)1) << (JVMTI_EVENT_VM_OBJECT_ALLOC - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
// bits for extension events
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
static const jlong  CLASS_UNLOAD_BIT = (((jlong)1) << (EXT_EVENT_CLASS_UNLOAD - TOTAL_MIN_EVENT_TYPE_VAL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
static const jlong  MONITOR_BITS = MONITOR_CONTENDED_ENTER_BIT | MONITOR_CONTENDED_ENTERED_BIT |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
                          MONITOR_WAIT_BIT | MONITOR_WAITED_BIT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
static const jlong  EXCEPTION_BITS = EXCEPTION_THROW_BIT | EXCEPTION_CATCH_BIT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
static const jlong  INTERP_EVENT_BITS =  SINGLE_STEP_BIT | METHOD_ENTRY_BIT | METHOD_EXIT_BIT |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
                                FRAME_POP_BIT | FIELD_ACCESS_BIT | FIELD_MODIFICATION_BIT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
static const jlong  THREAD_FILTERED_EVENT_BITS = INTERP_EVENT_BITS | EXCEPTION_BITS | MONITOR_BITS |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
                                        BREAKPOINT_BIT | CLASS_LOAD_BIT | CLASS_PREPARE_BIT | THREAD_END_BIT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
static const jlong  NEED_THREAD_LIFE_EVENTS = THREAD_FILTERED_EVENT_BITS | THREAD_START_BIT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
static const jlong  EARLY_EVENT_BITS = CLASS_FILE_LOAD_HOOK_BIT |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
                               VM_START_BIT | VM_INIT_BIT | VM_DEATH_BIT | NATIVE_METHOD_BIND_BIT |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
                               THREAD_START_BIT | THREAD_END_BIT |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
                               DYNAMIC_CODE_GENERATED_BIT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
static const jlong  GLOBAL_EVENT_BITS = ~THREAD_FILTERED_EVENT_BITS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
///////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
// JvmtiEventEnabled
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
JvmtiEventEnabled::JvmtiEventEnabled() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
void JvmtiEventEnabled::clear() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  _enabled_bits = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  _init_guard = JEE_INIT_GUARD;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
void JvmtiEventEnabled::set_enabled(jvmtiEvent event_type, bool enabled) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  jlong bits = get_bits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  jlong mask = bit_for(event_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  if (enabled) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
    bits |= mask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
    bits &= ~mask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  set_bits(bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
///////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
// JvmtiEnvThreadEventEnable
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
JvmtiEnvThreadEventEnable::JvmtiEnvThreadEventEnable() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  _event_user_enabled.clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  _event_enabled.clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
JvmtiEnvThreadEventEnable::~JvmtiEnvThreadEventEnable() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  _event_user_enabled.clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  _event_enabled.clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
///////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
// JvmtiThreadEventEnable
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
JvmtiThreadEventEnable::JvmtiThreadEventEnable() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  _event_enabled.clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
JvmtiThreadEventEnable::~JvmtiThreadEventEnable() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  _event_enabled.clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
///////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
// JvmtiEnvEventEnable
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
JvmtiEnvEventEnable::JvmtiEnvEventEnable() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  _event_user_enabled.clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  _event_callback_enabled.clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  _event_enabled.clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
JvmtiEnvEventEnable::~JvmtiEnvEventEnable() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  _event_user_enabled.clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  _event_callback_enabled.clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  _event_enabled.clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
///////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
// VM_EnterInterpOnlyMode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
class VM_EnterInterpOnlyMode : public VM_Operation {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  JvmtiThreadState *_state;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  VM_EnterInterpOnlyMode(JvmtiThreadState *state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  bool allow_nested_vm_operations() const        { return true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  VMOp_Type type() const { return VMOp_EnterInterpOnlyMode; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  void doit();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  // to do: this same function is in jvmtiImpl - should be in one place
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  bool can_be_deoptimized(vframe* vf) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
    return (vf->is_compiled_frame() && vf->fr().can_be_deoptimized());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
VM_EnterInterpOnlyMode::VM_EnterInterpOnlyMode(JvmtiThreadState *state)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  : _state(state)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
void VM_EnterInterpOnlyMode::doit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  // Set up the current stack depth for later tracking
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  _state->invalidate_cur_stack_depth();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  _state->enter_interp_only_mode();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  JavaThread *thread = _state->get_thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  if (thread->has_last_Java_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
    // If running in fullspeed mode, single stepping is implemented
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
    // as follows: first, the interpreter does not dispatch to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
    // compiled code for threads that have single stepping enabled;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
    // second, we deoptimize all methods on the thread's stack when
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
    // interpreted-only mode is enabled the first time for a given
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
    // thread (nothing to do if no Java frames yet).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
    int num_marked = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
    ResourceMark resMark;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
    RegisterMap rm(thread, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
    for (vframe* vf = thread->last_java_vframe(&rm); vf; vf = vf->sender()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
      if (can_be_deoptimized(vf)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
        ((compiledVFrame*) vf)->code()->mark_for_deoptimization();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
        ++num_marked;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
    if (num_marked > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
      VM_Deoptimize op;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
      VMThread::execute(&op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
///////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
// VM_ChangeSingleStep
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
class VM_ChangeSingleStep : public VM_Operation {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  bool _on;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  VM_ChangeSingleStep(bool on);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  VMOp_Type type() const                         { return VMOp_ChangeSingleStep; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  bool allow_nested_vm_operations() const        { return true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  void doit();   // method definition is after definition of JvmtiEventControllerPrivate because of scoping
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
VM_ChangeSingleStep::VM_ChangeSingleStep(bool on)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  : _on(on != 0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
///////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
// JvmtiEventControllerPrivate
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
// Private internal implementation methods for JvmtiEventController.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
// These methods are thread safe either because they are called
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
// in early VM initialization which is single threaded, or they
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
// hold the JvmtiThreadState_lock.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
class JvmtiEventControllerPrivate : public AllStatic {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  static bool _initialized;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  static void set_should_post_single_step(bool on);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  static void enter_interp_only_mode(JvmtiThreadState *state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  static void leave_interp_only_mode(JvmtiThreadState *state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  static void recompute_enabled();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  static jlong recompute_env_enabled(JvmtiEnvBase* env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  static jlong recompute_env_thread_enabled(JvmtiEnvThreadState* ets, JvmtiThreadState* state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  static jlong recompute_thread_enabled(JvmtiThreadState *state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  static void event_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  static void set_user_enabled(JvmtiEnvBase *env, JavaThread *thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
                        jvmtiEvent event_type, bool enabled);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  static void set_event_callbacks(JvmtiEnvBase *env,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
                                  const jvmtiEventCallbacks* callbacks,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
                                  jint size_of_callbacks);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  static void set_extension_event_callback(JvmtiEnvBase *env,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
                                           jint extension_event_index,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
                                           jvmtiExtensionEvent callback);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  static void set_frame_pop(JvmtiEnvThreadState *env_thread, JvmtiFramePop fpop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  static void clear_frame_pop(JvmtiEnvThreadState *env_thread, JvmtiFramePop fpop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  static void clear_to_frame_pop(JvmtiEnvThreadState *env_thread, JvmtiFramePop fpop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  static void change_field_watch(jvmtiEvent event_type, bool added);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  static void thread_started(JavaThread *thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  static void thread_ended(JavaThread *thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  static void env_initialize(JvmtiEnvBase *env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  static void env_dispose(JvmtiEnvBase *env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  static void vm_start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  static void vm_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  static void vm_death();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  static void trace_changed(JvmtiThreadState *state, jlong now_enabled, jlong changed);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  static void trace_changed(jlong now_enabled, jlong changed);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
bool JvmtiEventControllerPrivate::_initialized = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
void JvmtiEventControllerPrivate::set_should_post_single_step(bool on) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  // we have permission to do this, VM op doesn't
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  JvmtiExport::set_should_post_single_step(on);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
// This change must always be occur when at a safepoint.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
// Being at a safepoint causes the interpreter to use the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
// safepoint dispatch table which we overload to find single
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
// step points.  Just to be sure that it has been set, we
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
// call notice_safepoints when turning on single stepping.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
// When we leave our current safepoint, should_post_single_step
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
// will be checked by the interpreter, and the table kept
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
// or changed accordingly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
void VM_ChangeSingleStep::doit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  JvmtiEventControllerPrivate::set_should_post_single_step(_on);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  if (_on) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
    Interpreter::notice_safepoints();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
void JvmtiEventControllerPrivate::enter_interp_only_mode(JvmtiThreadState *state) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  EC_TRACE(("JVMTI [%s] # Entering interpreter only mode",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
            JvmtiTrace::safe_get_thread_name(state->get_thread())));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  VM_EnterInterpOnlyMode op(state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  VMThread::execute(&op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
JvmtiEventControllerPrivate::leave_interp_only_mode(JvmtiThreadState *state) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  EC_TRACE(("JVMTI [%s] # Leaving interpreter only mode",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
            JvmtiTrace::safe_get_thread_name(state->get_thread())));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  state->leave_interp_only_mode();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
JvmtiEventControllerPrivate::trace_changed(JvmtiThreadState *state, jlong now_enabled, jlong changed) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
#ifdef JVMTI_TRACE
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  if (JvmtiTrace::trace_event_controller()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
    SafeResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
    // traces standard events only
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
    for (int ei = JVMTI_MIN_EVENT_TYPE_VAL; ei <= JVMTI_MAX_EVENT_TYPE_VAL; ++ei) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
      jlong bit = JvmtiEventEnabled::bit_for((jvmtiEvent)ei);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
      if (changed & bit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
        // it changed, print it
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
        tty->print_cr("JVMTI [%s] # %s event %s",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
                      JvmtiTrace::safe_get_thread_name(state->get_thread()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
                      (now_enabled & bit)? "Enabling" : "Disabling", JvmtiTrace::event_name((jvmtiEvent)ei));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
#endif /*JVMTI_TRACE */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
JvmtiEventControllerPrivate::trace_changed(jlong now_enabled, jlong changed) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
#ifdef JVMTI_TRACE
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  if (JvmtiTrace::trace_event_controller()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
    SafeResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
    // traces standard events only
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
    for (int ei = JVMTI_MIN_EVENT_TYPE_VAL; ei <= JVMTI_MAX_EVENT_TYPE_VAL; ++ei) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
      jlong bit = JvmtiEventEnabled::bit_for((jvmtiEvent)ei);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
      if (changed & bit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
        // it changed, print it
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
        tty->print_cr("JVMTI [-] # %s event %s",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
                      (now_enabled & bit)? "Enabling" : "Disabling", JvmtiTrace::event_name((jvmtiEvent)ei));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
#endif /*JVMTI_TRACE */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
// For the specified env: compute the currently truly enabled events
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
// set external state accordingly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
// Return value and set value must include all events.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
// But outside this class, only non-thread-filtered events can be queried..
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
jlong
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
JvmtiEventControllerPrivate::recompute_env_enabled(JvmtiEnvBase* env) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  jlong was_enabled = env->env_event_enable()->_event_enabled.get_bits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  jlong now_enabled =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
    env->env_event_enable()->_event_callback_enabled.get_bits() &
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
    env->env_event_enable()->_event_user_enabled.get_bits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  switch (JvmtiEnv::get_phase()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  case JVMTI_PHASE_PRIMORDIAL:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  case JVMTI_PHASE_ONLOAD:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
    // only these events allowed in primordial or onload phase
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
    now_enabled &= (EARLY_EVENT_BITS & ~THREAD_FILTERED_EVENT_BITS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  case JVMTI_PHASE_START:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
    // only these events allowed in start phase
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
    now_enabled &= EARLY_EVENT_BITS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  case JVMTI_PHASE_LIVE:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
    // all events allowed during live phase
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  case JVMTI_PHASE_DEAD:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
    // no events allowed when dead
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
    now_enabled = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
    assert(false, "no other phases - sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  // will we really send these events to this env
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  env->env_event_enable()->_event_enabled.set_bits(now_enabled);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
  trace_changed(now_enabled, (now_enabled ^ was_enabled)  & ~THREAD_FILTERED_EVENT_BITS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  return now_enabled;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
// For the specified env and thread: compute the currently truly enabled events
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
// set external state accordingly.  Only thread-filtered events are included.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
jlong
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
JvmtiEventControllerPrivate::recompute_env_thread_enabled(JvmtiEnvThreadState* ets, JvmtiThreadState* state) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  JvmtiEnv *env = ets->get_env();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  jlong was_enabled = ets->event_enable()->_event_enabled.get_bits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  jlong now_enabled =  THREAD_FILTERED_EVENT_BITS &
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
    env->env_event_enable()->_event_callback_enabled.get_bits() &
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
    (env->env_event_enable()->_event_user_enabled.get_bits() |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
     ets->event_enable()->_event_user_enabled.get_bits());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  // for frame pops and field watchs, computed enabled state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
  // is only true if an event has been requested
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
  if (!ets->has_frame_pops()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
    now_enabled &= ~FRAME_POP_BIT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  if (*((int *)JvmtiExport::get_field_access_count_addr()) == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
    now_enabled &= ~FIELD_ACCESS_BIT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  if (*((int *)JvmtiExport::get_field_modification_count_addr()) == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
    now_enabled &= ~FIELD_MODIFICATION_BIT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  switch (JvmtiEnv::get_phase()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  case JVMTI_PHASE_DEAD:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
    // no events allowed when dead
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
    now_enabled = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  // if anything changed do update
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  if (now_enabled != was_enabled) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
    // will we really send these events to this thread x env
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
    ets->event_enable()->_event_enabled.set_bits(now_enabled);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
    // If the enabled status of the single step or breakpoint events changed,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
    // the location status may need to change as well.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
    jlong changed = now_enabled ^ was_enabled;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
    if (changed & SINGLE_STEP_BIT) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
      ets->reset_current_location(JVMTI_EVENT_SINGLE_STEP, (now_enabled & SINGLE_STEP_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
    if (changed & BREAKPOINT_BIT) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
      ets->reset_current_location(JVMTI_EVENT_BREAKPOINT,  (now_enabled & BREAKPOINT_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
    trace_changed(state, now_enabled, changed);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  return now_enabled;
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
// For the specified thread: compute the currently truly enabled events
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
// set external state accordingly.  Only thread-filtered events are included.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
jlong
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
JvmtiEventControllerPrivate::recompute_thread_enabled(JvmtiThreadState *state) {
2135
f82c3012ec86 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 1
diff changeset
   481
  if (state == NULL) {
f82c3012ec86 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 1
diff changeset
   482
    // associated JavaThread is exiting
f82c3012ec86 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 1
diff changeset
   483
    return (jlong)0;
f82c3012ec86 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 1
diff changeset
   484
  }
f82c3012ec86 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 1
diff changeset
   485
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
  jlong was_any_env_enabled = state->thread_event_enable()->_event_enabled.get_bits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
  jlong any_env_enabled = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
    // This iteration will include JvmtiEnvThreadStates whoses environments
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
    // have been disposed.  These JvmtiEnvThreadStates must not be filtered
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
    // as recompute must be called on them to disable their events,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
    JvmtiEnvThreadStateIterator it(state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
    for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
      any_env_enabled |= recompute_env_thread_enabled(ets, state);
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 (any_env_enabled != was_any_env_enabled) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
    // mark if event is truly enabled on this thread in any environment
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
    state->thread_event_enable()->_event_enabled.set_bits(any_env_enabled);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
    // compute interp_only mode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
    bool should_be_interp = (any_env_enabled & INTERP_EVENT_BITS) != 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
    bool is_now_interp = state->is_interp_only_mode();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
    if (should_be_interp != is_now_interp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
      if (should_be_interp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
        enter_interp_only_mode(state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
        leave_interp_only_mode(state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  return any_env_enabled;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
// Compute truly enabled events - meaning if the event can and could be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
// sent.  An event is truly enabled if it is user enabled on the thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
// or globally user enabled, but only if there is a callback or event hook
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
// for it and, for field watch and frame pop, one has been set.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
// Compute if truly enabled, per thread, per environment, per combination
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
// (thread x environment), and overall.  These merges are true if any is true.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
// True per thread if some environment has callback set and the event is globally
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
// enabled or enabled for this thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
// True per environment if the callback is set and the event is globally
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
// enabled in this environment or enabled for any thread in this environment.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
// True per combination if the environment has the callback set and the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
// event is globally enabled in this environment or the event is enabled
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
// for this thread and environment.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
// All states transitions dependent on these transitions are also handled here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
JvmtiEventControllerPrivate::recompute_enabled() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  assert(Threads::number_of_threads() == 0 || JvmtiThreadState_lock->is_locked(), "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  // event enabled for any thread in any environment
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  jlong was_any_env_thread_enabled = JvmtiEventController::_universal_global_event_enabled.get_bits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  jlong any_env_thread_enabled = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  EC_TRACE(("JVMTI [-] # recompute enabled - before %llx", was_any_env_thread_enabled));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  // compute non-thread-filters events.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  // This must be done separately from thread-filtered events, since some
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  // events can occur before any threads exist.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
  JvmtiEnvIterator it;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  for (JvmtiEnvBase* env = it.first(); env != NULL; env = it.next(env)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
    any_env_thread_enabled |= recompute_env_enabled(env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  // We need to create any missing jvmti_thread_state if there are globally set thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  // filtered events and there weren't last time
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
  if (    (any_env_thread_enabled & THREAD_FILTERED_EVENT_BITS) != 0 &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
      (was_any_env_thread_enabled & THREAD_FILTERED_EVENT_BITS) == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
    assert(JvmtiEnv::is_vm_live() || (JvmtiEnv::get_phase()==JVMTI_PHASE_START),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
      "thread filtered events should not be enabled when VM not in start or live phase");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
      MutexLocker mu(Threads_lock);   //hold the Threads_lock for the iteration
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
      for (JavaThread *tp = Threads::first(); tp != NULL; tp = tp->next()) {
2135
f82c3012ec86 6800721: 3/4 JavaThread::jvmti_thread_state() and JvmtiThreadState::state_for() robustness
dcubed
parents: 1
diff changeset
   561
        // state_for_while_locked() makes tp->is_exiting() check
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
        JvmtiThreadState::state_for_while_locked(tp);  // create the thread state if missing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
    }// release Threads_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  // compute and set thread-filtered events
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  for (JvmtiThreadState *state = JvmtiThreadState::first(); state != NULL; state = state->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
    any_env_thread_enabled |= recompute_thread_enabled(state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
  // set universal state (across all envs and threads)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
  jlong delta = any_env_thread_enabled ^ was_any_env_thread_enabled;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
  if (delta != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
    JvmtiExport::set_should_post_field_access((any_env_thread_enabled & FIELD_ACCESS_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
    JvmtiExport::set_should_post_field_modification((any_env_thread_enabled & FIELD_MODIFICATION_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
    JvmtiExport::set_should_post_class_load((any_env_thread_enabled & CLASS_LOAD_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
    JvmtiExport::set_should_post_class_file_load_hook((any_env_thread_enabled & CLASS_FILE_LOAD_HOOK_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
    JvmtiExport::set_should_post_native_method_bind((any_env_thread_enabled & NATIVE_METHOD_BIND_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
    JvmtiExport::set_should_post_dynamic_code_generated((any_env_thread_enabled & DYNAMIC_CODE_GENERATED_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
    JvmtiExport::set_should_post_data_dump((any_env_thread_enabled & DATA_DUMP_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
    JvmtiExport::set_should_post_class_prepare((any_env_thread_enabled & CLASS_PREPARE_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
    JvmtiExport::set_should_post_class_unload((any_env_thread_enabled & CLASS_UNLOAD_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
    JvmtiExport::set_should_post_monitor_contended_enter((any_env_thread_enabled & MONITOR_CONTENDED_ENTER_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
    JvmtiExport::set_should_post_monitor_contended_entered((any_env_thread_enabled & MONITOR_CONTENDED_ENTERED_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
    JvmtiExport::set_should_post_monitor_wait((any_env_thread_enabled & MONITOR_WAIT_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
    JvmtiExport::set_should_post_monitor_waited((any_env_thread_enabled & MONITOR_WAITED_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
    JvmtiExport::set_should_post_garbage_collection_start((any_env_thread_enabled & GARBAGE_COLLECTION_START_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
    JvmtiExport::set_should_post_garbage_collection_finish((any_env_thread_enabled & GARBAGE_COLLECTION_FINISH_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
    JvmtiExport::set_should_post_object_free((any_env_thread_enabled & OBJECT_FREE_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
    JvmtiExport::set_should_post_resource_exhausted((any_env_thread_enabled & RESOURCE_EXHAUSTED_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
    JvmtiExport::set_should_post_compiled_method_load((any_env_thread_enabled & COMPILED_METHOD_LOAD_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
    JvmtiExport::set_should_post_compiled_method_unload((any_env_thread_enabled & COMPILED_METHOD_UNLOAD_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
    JvmtiExport::set_should_post_vm_object_alloc((any_env_thread_enabled & VM_OBJECT_ALLOC_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
    // need this if we want thread events or we need them to init data
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
    JvmtiExport::set_should_post_thread_life((any_env_thread_enabled & NEED_THREAD_LIFE_EVENTS) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
    // If single stepping is turned on or off, execute the VM op to change it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
    if (delta & SINGLE_STEP_BIT) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
      switch (JvmtiEnv::get_phase()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
      case JVMTI_PHASE_DEAD:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
        // If the VM is dying we can't execute VM ops
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
      case JVMTI_PHASE_LIVE: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
        VM_ChangeSingleStep op((any_env_thread_enabled & SINGLE_STEP_BIT) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
        VMThread::execute(&op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
      default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
        assert(false, "should never come here before live phase");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
    // set global truly enabled, that is, any thread in any environment
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
    JvmtiEventController::_universal_global_event_enabled.set_bits(any_env_thread_enabled);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
  EC_TRACE(("JVMTI [-] # recompute enabled - after %llx", any_env_thread_enabled));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
JvmtiEventControllerPrivate::thread_started(JavaThread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
  assert(thread->is_Java_thread(), "Must be JavaThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  assert(thread == Thread::current(), "must be current thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
  assert(JvmtiEnvBase::environments_might_exist(), "to enter event controller, JVM TI environments must exist");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
  EC_TRACE(("JVMTI [%s] # thread started", JvmtiTrace::safe_get_thread_name(thread)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
  // if we have any thread filtered events globally enabled, create/update the thread state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
  if ((JvmtiEventController::_universal_global_event_enabled.get_bits() & THREAD_FILTERED_EVENT_BITS) != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
    MutexLocker mu(JvmtiThreadState_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
    // create the thread state if missing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
    JvmtiThreadState *state = JvmtiThreadState::state_for_while_locked(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
    if (state != NULL) {    // skip threads with no JVMTI thread state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
      recompute_thread_enabled(state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
JvmtiEventControllerPrivate::thread_ended(JavaThread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
  // Removes the JvmtiThreadState associated with the specified thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
  // May be called after all environments have been disposed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  EC_TRACE(("JVMTI [%s] # thread ended", JvmtiTrace::safe_get_thread_name(thread)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
  JvmtiThreadState *state = thread->jvmti_thread_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
  if (state != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
    MutexLocker mu(JvmtiThreadState_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
    delete state;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
void JvmtiEventControllerPrivate::set_event_callbacks(JvmtiEnvBase *env,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
                                                      const jvmtiEventCallbacks* callbacks,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
                                                      jint size_of_callbacks) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
  assert(Threads::number_of_threads() == 0 || JvmtiThreadState_lock->is_locked(), "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
  EC_TRACE(("JVMTI [*] # set event callbacks"));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
  env->set_event_callbacks(callbacks, size_of_callbacks);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
  jlong enabled_bits = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
  for (int ei = JVMTI_MIN_EVENT_TYPE_VAL; ei <= JVMTI_MAX_EVENT_TYPE_VAL; ++ei) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
    jvmtiEvent evt_t = (jvmtiEvent)ei;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
    if (env->has_callback(evt_t)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
      enabled_bits |= JvmtiEventEnabled::bit_for(evt_t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
  env->env_event_enable()->_event_callback_enabled.set_bits(enabled_bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
  recompute_enabled();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
JvmtiEventControllerPrivate::set_extension_event_callback(JvmtiEnvBase *env,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
                                                          jint extension_event_index,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
                                                          jvmtiExtensionEvent callback)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
  assert(Threads::number_of_threads() == 0 || JvmtiThreadState_lock->is_locked(), "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
  EC_TRACE(("JVMTI [*] # set extension event callback"));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
  // extension events are allocated below JVMTI_MIN_EVENT_TYPE_VAL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
  assert(extension_event_index >= (jint)EXT_MIN_EVENT_TYPE_VAL &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
         extension_event_index <= (jint)EXT_MAX_EVENT_TYPE_VAL, "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
  // As the bits for both standard (jvmtiEvent) and extension
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
  // (jvmtiExtEvents) are stored in the same word we cast here to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
  // jvmtiEvent to set/clear the bit for this extension event.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
  jvmtiEvent event_type = (jvmtiEvent)extension_event_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
  // Prevent a possible race condition where events are re-enabled by a call to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
  // set event callbacks, where the DisposeEnvironment occurs after the boiler-plate
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
  // environment check and before the lock is acquired.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
  // We can safely do the is_valid check now, as JvmtiThreadState_lock is held.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
  bool enabling = (callback != NULL) && (env->is_valid());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
  env->env_event_enable()->set_user_enabled(event_type, enabling);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
  // update the callback
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
  jvmtiExtEventCallbacks* ext_callbacks = env->ext_callbacks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
  switch (extension_event_index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
    case EXT_EVENT_CLASS_UNLOAD :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
      ext_callbacks->ClassUnload = callback;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
  // update the callback enable/disable bit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
  jlong enabled_bits = env->env_event_enable()->_event_callback_enabled.get_bits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
  jlong bit_for = JvmtiEventEnabled::bit_for(event_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
  if (enabling) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
    enabled_bits |= bit_for;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
    enabled_bits &= ~bit_for;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
  env->env_event_enable()->_event_callback_enabled.set_bits(enabled_bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
  recompute_enabled();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
JvmtiEventControllerPrivate::env_initialize(JvmtiEnvBase *env) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
  assert(Threads::number_of_threads() == 0 || JvmtiThreadState_lock->is_locked(), "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
  EC_TRACE(("JVMTI [*] # env initialize"));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
  if (JvmtiEnvBase::is_vm_live()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
    // if we didn't initialize event info already (this is a late
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
    // launched environment), do it now.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
    event_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
  env->initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
  // add the JvmtiEnvThreadState to each JvmtiThreadState
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
  for (JvmtiThreadState *state = JvmtiThreadState::first(); state != NULL; state = state->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
    state->add_env(env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
    assert((JvmtiEnv*)(state->env_thread_state(env)->get_env()) == env, "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
  JvmtiEventControllerPrivate::recompute_enabled();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
JvmtiEventControllerPrivate::env_dispose(JvmtiEnvBase *env) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
  assert(Threads::number_of_threads() == 0 || JvmtiThreadState_lock->is_locked(), "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
  EC_TRACE(("JVMTI [*] # env dispose"));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
  // Before the environment is marked disposed, disable all events on this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
  // environment (by zapping the callbacks).  As a result, the disposed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
  // environment will not call event handlers.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
  set_event_callbacks(env, NULL, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
  for (jint extension_event_index = EXT_MIN_EVENT_TYPE_VAL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
       extension_event_index <= EXT_MAX_EVENT_TYPE_VAL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
       ++extension_event_index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
    set_extension_event_callback(env, extension_event_index, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
  // Let the environment finish disposing itself.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
  env->env_dispose();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
JvmtiEventControllerPrivate::set_user_enabled(JvmtiEnvBase *env, JavaThread *thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
                                          jvmtiEvent event_type, bool enabled) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
  assert(Threads::number_of_threads() == 0 || JvmtiThreadState_lock->is_locked(), "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
  EC_TRACE(("JVMTI [%s] # user %s event %s",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
            thread==NULL? "ALL": JvmtiTrace::safe_get_thread_name(thread),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
            enabled? "enabled" : "disabled", JvmtiTrace::event_name(event_type)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
  if (thread == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
    env->env_event_enable()->set_user_enabled(event_type, enabled);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
    // create the thread state (if it didn't exist before)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
    JvmtiThreadState *state = JvmtiThreadState::state_for_while_locked(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
    if (state != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
      state->env_thread_state(env)->event_enable()->set_user_enabled(event_type, enabled);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
  recompute_enabled();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
JvmtiEventControllerPrivate::set_frame_pop(JvmtiEnvThreadState *ets, JvmtiFramePop fpop) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
  EC_TRACE(("JVMTI [%s] # set frame pop - frame=%d",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
            JvmtiTrace::safe_get_thread_name(ets->get_thread()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
            fpop.frame_number() ));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
  ets->get_frame_pops()->set(fpop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
  recompute_thread_enabled(ets->get_thread()->jvmti_thread_state());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
JvmtiEventControllerPrivate::clear_frame_pop(JvmtiEnvThreadState *ets, JvmtiFramePop fpop) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
  EC_TRACE(("JVMTI [%s] # clear frame pop - frame=%d",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
            JvmtiTrace::safe_get_thread_name(ets->get_thread()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
            fpop.frame_number() ));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
  ets->get_frame_pops()->clear(fpop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
  recompute_thread_enabled(ets->get_thread()->jvmti_thread_state());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
JvmtiEventControllerPrivate::clear_to_frame_pop(JvmtiEnvThreadState *ets, JvmtiFramePop fpop) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
  int cleared_cnt = ets->get_frame_pops()->clear_to(fpop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
  EC_TRACE(("JVMTI [%s] # clear to frame pop - frame=%d, count=%d",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
            JvmtiTrace::safe_get_thread_name(ets->get_thread()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
            fpop.frame_number(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
            cleared_cnt ));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
  if (cleared_cnt > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
    recompute_thread_enabled(ets->get_thread()->jvmti_thread_state());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
JvmtiEventControllerPrivate::change_field_watch(jvmtiEvent event_type, bool added) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
  int *count_addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
  switch (event_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
  case JVMTI_EVENT_FIELD_MODIFICATION:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
    count_addr = (int *)JvmtiExport::get_field_modification_count_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
  case JVMTI_EVENT_FIELD_ACCESS:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
    count_addr = (int *)JvmtiExport::get_field_access_count_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
  default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
    assert(false, "incorrect event");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
  EC_TRACE(("JVMTI [-] # change field watch - %s %s count=%d",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
            event_type==JVMTI_EVENT_FIELD_MODIFICATION? "modification" : "access",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
            added? "add" : "remove",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
            *count_addr));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
  if (added) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
    (*count_addr)++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
    if (*count_addr == 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
      recompute_enabled();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
    if (*count_addr > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
      (*count_addr)--;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
      if (*count_addr == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
        recompute_enabled();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
      assert(false, "field watch out of phase");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
JvmtiEventControllerPrivate::event_init() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
  assert(JvmtiThreadState_lock->is_locked(), "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
  if (_initialized) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
  EC_TRACE(("JVMTI [-] # VM live"));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
  // check that our idea and the spec's idea of threaded events match
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
  for (int ei = JVMTI_MIN_EVENT_TYPE_VAL; ei <= JVMTI_MAX_EVENT_TYPE_VAL; ++ei) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
    jlong bit = JvmtiEventEnabled::bit_for((jvmtiEvent)ei);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
    assert(((THREAD_FILTERED_EVENT_BITS & bit) != 0) == JvmtiUtil::event_threaded(ei),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
           "thread filtered event list does not match");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
  _initialized = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
JvmtiEventControllerPrivate::vm_start() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
  // some events are now able to be enabled (phase has changed)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
  JvmtiEventControllerPrivate::recompute_enabled();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
JvmtiEventControllerPrivate::vm_init() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
  event_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
  // all the events are now able to be enabled (phase has changed)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
  JvmtiEventControllerPrivate::recompute_enabled();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
JvmtiEventControllerPrivate::vm_death() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
  // events are disabled (phase has changed)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
  JvmtiEventControllerPrivate::recompute_enabled();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
///////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
// JvmtiEventController
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
JvmtiEventEnabled JvmtiEventController::_universal_global_event_enabled;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
bool
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
JvmtiEventController::is_global_event(jvmtiEvent event_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
  assert(is_valid_event_type(event_type), "invalid event type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
  jlong bit_for = ((jlong)1) << (event_type - TOTAL_MIN_EVENT_TYPE_VAL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
  return((bit_for & GLOBAL_EVENT_BITS)!=0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
JvmtiEventController::set_user_enabled(JvmtiEnvBase *env, JavaThread *thread, jvmtiEvent event_type, bool enabled) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
  if (Threads::number_of_threads() == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
    // during early VM start-up locks don't exist, but we are safely single threaded,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
    // call the functionality without holding the JvmtiThreadState_lock.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
    JvmtiEventControllerPrivate::set_user_enabled(env, thread, event_type, enabled);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
    MutexLocker mu(JvmtiThreadState_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
    JvmtiEventControllerPrivate::set_user_enabled(env, thread, event_type, enabled);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
JvmtiEventController::set_event_callbacks(JvmtiEnvBase *env,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
                                          const jvmtiEventCallbacks* callbacks,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
                                          jint size_of_callbacks) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
  if (Threads::number_of_threads() == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
    // during early VM start-up locks don't exist, but we are safely single threaded,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
    // call the functionality without holding the JvmtiThreadState_lock.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
    JvmtiEventControllerPrivate::set_event_callbacks(env, callbacks, size_of_callbacks);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
    MutexLocker mu(JvmtiThreadState_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
    JvmtiEventControllerPrivate::set_event_callbacks(env, callbacks, size_of_callbacks);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
JvmtiEventController::set_extension_event_callback(JvmtiEnvBase *env,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
                                                   jint extension_event_index,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
                                                   jvmtiExtensionEvent callback) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
  if (Threads::number_of_threads() == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
    JvmtiEventControllerPrivate::set_extension_event_callback(env, extension_event_index, callback);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
    MutexLocker mu(JvmtiThreadState_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
    JvmtiEventControllerPrivate::set_extension_event_callback(env, extension_event_index, callback);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
JvmtiEventController::set_frame_pop(JvmtiEnvThreadState *ets, JvmtiFramePop fpop) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
  MutexLocker mu(JvmtiThreadState_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
  JvmtiEventControllerPrivate::set_frame_pop(ets, fpop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
JvmtiEventController::clear_frame_pop(JvmtiEnvThreadState *ets, JvmtiFramePop fpop) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
  MutexLocker mu(JvmtiThreadState_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
  JvmtiEventControllerPrivate::clear_frame_pop(ets, fpop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
JvmtiEventController::clear_to_frame_pop(JvmtiEnvThreadState *ets, JvmtiFramePop fpop) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
  MutexLocker mu(JvmtiThreadState_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
  JvmtiEventControllerPrivate::clear_to_frame_pop(ets, fpop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
JvmtiEventController::change_field_watch(jvmtiEvent event_type, bool added) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
  MutexLocker mu(JvmtiThreadState_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
  JvmtiEventControllerPrivate::change_field_watch(event_type, added);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
JvmtiEventController::thread_started(JavaThread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
  // operates only on the current thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
  // JvmtiThreadState_lock grabbed only if needed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
  JvmtiEventControllerPrivate::thread_started(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
JvmtiEventController::thread_ended(JavaThread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
  // operates only on the current thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
  // JvmtiThreadState_lock grabbed only if needed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
  JvmtiEventControllerPrivate::thread_ended(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
JvmtiEventController::env_initialize(JvmtiEnvBase *env) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
  if (Threads::number_of_threads() == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
    // during early VM start-up locks don't exist, but we are safely single threaded,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
    // call the functionality without holding the JvmtiThreadState_lock.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
    JvmtiEventControllerPrivate::env_initialize(env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
    MutexLocker mu(JvmtiThreadState_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
    JvmtiEventControllerPrivate::env_initialize(env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
JvmtiEventController::env_dispose(JvmtiEnvBase *env) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
  if (Threads::number_of_threads() == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
    // during early VM start-up locks don't exist, but we are safely single threaded,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
    // call the functionality without holding the JvmtiThreadState_lock.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
    JvmtiEventControllerPrivate::env_dispose(env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
    MutexLocker mu(JvmtiThreadState_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
    JvmtiEventControllerPrivate::env_dispose(env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
JvmtiEventController::vm_start() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
  if (JvmtiEnvBase::environments_might_exist()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
    MutexLocker mu(JvmtiThreadState_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
    JvmtiEventControllerPrivate::vm_start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
JvmtiEventController::vm_init() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
  if (JvmtiEnvBase::environments_might_exist()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
    MutexLocker mu(JvmtiThreadState_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
    JvmtiEventControllerPrivate::vm_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
JvmtiEventController::vm_death() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
  if (JvmtiEnvBase::environments_might_exist()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
    MutexLocker mu(JvmtiThreadState_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
    JvmtiEventControllerPrivate::vm_death();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
}