hotspot/src/share/vm/prims/jvmtiImpl.cpp
author tschatzl
Wed, 11 Sep 2013 16:25:02 +0200
changeset 19986 33d188c66ed9
parent 18025 b7bcf7497f93
child 20059 c26474fd5ac0
permissions -rw-r--r--
8010722: assert: failed: heap size is too big for compressed oops Summary: Use conservative assumptions of required alignment for the various garbage collector components into account when determining the maximum heap size that supports compressed oops. Using this conservative value avoids several circular dependencies in the calculation. Reviewed-by: stefank, dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
15432
9d976ca484d8 8000692: Remove old KERNEL code
zgu
parents: 14583
diff changeset
     2
 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 2137
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 2137
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 2137
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    26
#include "classfile/systemDictionary.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    27
#include "interpreter/interpreter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    28
#include "jvmtifiles/jvmtiEnv.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    29
#include "memory/resourceArea.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    30
#include "oops/instanceKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    31
#include "prims/jvmtiAgentThread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    32
#include "prims/jvmtiEventController.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    33
#include "prims/jvmtiImpl.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    34
#include "prims/jvmtiRedefineClasses.hpp"
8110
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
    35
#include "runtime/atomic.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    36
#include "runtime/deoptimization.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    37
#include "runtime/handles.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    38
#include "runtime/handles.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    39
#include "runtime/interfaceSupport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    40
#include "runtime/javaCalls.hpp"
9405
d2e9ee78c3c1 7039447: 2/1 java profiling is broken in build 139 (garbage in function name)
dcubed
parents: 8661
diff changeset
    41
#include "runtime/os.hpp"
8110
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
    42
#include "runtime/serviceThread.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    43
#include "runtime/signature.hpp"
14583
d70ee55535f4 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 14488
diff changeset
    44
#include "runtime/thread.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    45
#include "runtime/vframe.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    46
#include "runtime/vframe_hp.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    47
#include "runtime/vm_operations.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    48
#include "utilities/exceptions.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
// class JvmtiAgentThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
// JavaThread used to wrap a thread started by an agent
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
// using the JVMTI method RunAgentThread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
JvmtiAgentThread::JvmtiAgentThread(JvmtiEnv* env, jvmtiStartFunction start_fn, const void *start_arg)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
    : JavaThread(start_function_wrapper) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
    _env = env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
    _start_fn = start_fn;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
    _start_arg = start_arg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
JvmtiAgentThread::start_function_wrapper(JavaThread *thread, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
    // It is expected that any Agent threads will be created as
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
    // Java Threads.  If this is the case, notification of the creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
    // of the thread is given in JavaThread::thread_main().
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
    assert(thread->is_Java_thread(), "debugger thread should be a Java Thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
    assert(thread == JavaThread::current(), "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
    JvmtiAgentThread *dthread = (JvmtiAgentThread *)thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
    dthread->call_start_function();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
JvmtiAgentThread::call_start_function() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
    ThreadToNativeFromVM transition(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
    _start_fn(_env->jvmti_external(), jni_environment(), (void*)_start_arg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
// class GrowableCache - private methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
void GrowableCache::recache() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  int len = _elements->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 10565
diff changeset
    90
  FREE_C_HEAP_ARRAY(address, _cache, mtInternal);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 10565
diff changeset
    91
  _cache = NEW_C_HEAP_ARRAY(address,len+1, mtInternal);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  for (int i=0; i<len; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
    _cache[i] = _elements->at(i)->getCacheValue();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
    // The cache entry has gone bad. Without a valid frame pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
    // value, the entry is useless so we simply delete it in product
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
    // mode. The call to remove() will rebuild the cache again
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
    // without the bad entry.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
    if (_cache[i] == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
      assert(false, "cannot recache NULL elements");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
      remove(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  _cache[len] = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  _listener_fun(_this_obj,_cache);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
bool GrowableCache::equals(void* v, GrowableElement *e2) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  GrowableElement *e1 = (GrowableElement *) v;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  assert(e1 != NULL, "e1 != NULL");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  assert(e2 != NULL, "e2 != NULL");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  return e1->equals(e2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
// class GrowableCache - public methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
GrowableCache::GrowableCache() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  _this_obj       = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  _listener_fun   = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  _elements       = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  _cache          = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
GrowableCache::~GrowableCache() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  delete _elements;
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 10565
diff changeset
   134
  FREE_C_HEAP_ARRAY(address, _cache, mtInternal);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
void GrowableCache::initialize(void *this_obj, void listener_fun(void *, address*) ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  _this_obj       = this_obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  _listener_fun   = listener_fun;
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 10565
diff changeset
   140
  _elements       = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<GrowableElement*>(5,true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  recache();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
// number of elements in the collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
int GrowableCache::length() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  return _elements->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
// get the value of the index element in the collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
GrowableElement* GrowableCache::at(int index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  GrowableElement *e = (GrowableElement *) _elements->at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  assert(e != NULL, "e != NULL");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  return e;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
int GrowableCache::find(GrowableElement* e) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  return _elements->find(e, GrowableCache::equals);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
// append a copy of the element to the end of the collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
void GrowableCache::append(GrowableElement* e) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  GrowableElement *new_e = e->clone();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  _elements->append(new_e);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  recache();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
// insert a copy of the element using lessthan()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
void GrowableCache::insert(GrowableElement* e) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  GrowableElement *new_e = e->clone();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  _elements->append(new_e);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  int n = length()-2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  for (int i=n; i>=0; i--) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
    GrowableElement *e1 = _elements->at(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
    GrowableElement *e2 = _elements->at(i+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
    if (e2->lessThan(e1)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
      _elements->at_put(i+1, e1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
      _elements->at_put(i,   e2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  recache();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
// remove the element at index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
void GrowableCache::remove (int index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  GrowableElement *e = _elements->at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  assert(e != NULL, "e != NULL");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  _elements->remove(e);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  delete e;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  recache();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
// clear out all elements, release all heap space and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
// let our listener know that things have changed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
void GrowableCache::clear() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  int len = _elements->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  for (int i=0; i<len; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
    delete _elements->at(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  _elements->clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  recache();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
void GrowableCache::oops_do(OopClosure* f) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  int len = _elements->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  for (int i=0; i<len; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
    GrowableElement *e = _elements->at(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
    e->oops_do(f);
7918
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7896
diff changeset
   210
  }
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7896
diff changeset
   211
}
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7896
diff changeset
   212
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7896
diff changeset
   213
void GrowableCache::gc_epilogue() {
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7896
diff changeset
   214
  int len = _elements->length();
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7896
diff changeset
   215
  for (int i=0; i<len; i++) {
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7896
diff changeset
   216
    _cache[i] = _elements->at(i)->getCacheValue();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
// class JvmtiBreakpoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
JvmtiBreakpoint::JvmtiBreakpoint() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  _method = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  _bci    = 0;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   227
  _class_loader = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
#ifdef CHECK_UNHANDLED_OOPS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  // This one is always allocated with new, but check it just in case.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  Thread *thread = Thread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  if (thread->is_in_stack((address)&_method)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
    thread->allow_unhandled_oop((oop*)&_method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
#endif // CHECK_UNHANDLED_OOPS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   237
JvmtiBreakpoint::JvmtiBreakpoint(Method* m_method, jlocation location) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  _method        = m_method;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   239
  _class_loader  = _method->method_holder()->class_loader_data()->class_loader();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  assert(_method != NULL, "_method != NULL");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  _bci           = (int) location;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  assert(_bci >= 0, "_bci >= 0");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
void JvmtiBreakpoint::copy(JvmtiBreakpoint& bp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  _method   = bp._method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  _bci      = bp._bci;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   248
  _class_loader = bp._class_loader;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
bool JvmtiBreakpoint::lessThan(JvmtiBreakpoint& bp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  Unimplemented();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
bool JvmtiBreakpoint::equals(JvmtiBreakpoint& bp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  return _method   == bp._method
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
    &&   _bci      == bp._bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
bool JvmtiBreakpoint::is_valid() {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   262
  // class loader can be NULL
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  return _method != NULL &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
         _bci >= 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
address JvmtiBreakpoint::getBcp() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  return _method->bcp_from(_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
void JvmtiBreakpoint::each_method_version_do(method_action meth_act) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   272
  ((Method*)_method->*meth_act)(_bci);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  // add/remove breakpoint to/from versions of the method that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  // are EMCP. Directly or transitively obsolete methods are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  // not saved in the PreviousVersionInfo.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  Thread *thread = Thread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  instanceKlassHandle ikh = instanceKlassHandle(thread, _method->method_holder());
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   279
  Symbol* m_name = _method->name();
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   280
  Symbol* m_signature = _method->signature();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
    ResourceMark rm(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
    // PreviousVersionInfo objects returned via PreviousVersionWalker
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
    // contain a GrowableArray of handles. We have to clean up the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
    // GrowableArray _after_ the PreviousVersionWalker destructor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
    // has destroyed the handles.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
      // search previous versions if they exist
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   290
      PreviousVersionWalker pvw((InstanceKlass *)ikh());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
      for (PreviousVersionInfo * pv_info = pvw.next_previous_version();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
           pv_info != NULL; pv_info = pvw.next_previous_version()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
        GrowableArray<methodHandle>* methods =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
          pv_info->prev_EMCP_method_handles();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
        if (methods == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
          // We have run into a PreviousVersion generation where
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
          // all methods were made obsolete during that generation's
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
          // RedefineClasses() operation. At the time of that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
          // operation, all EMCP methods were flushed so we don't
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
          // have to go back any further.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
          //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
          // A NULL methods array is different than an empty methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
          // array. We cannot infer any optimizations about older
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
          // generations from an empty methods array for the current
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
          // generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
        for (int i = methods->length() - 1; i >= 0; i--) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
          methodHandle method = methods->at(i);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   312
          // obsolete methods that are running are not deleted from
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   313
          // previous version array, but they are skipped here.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   314
          if (!method->is_obsolete() &&
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   315
              method->name() == m_name &&
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   316
              method->signature() == m_signature) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
            RC_TRACE(0x00000800, ("%sing breakpoint in %s(%s)",
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   318
              meth_act == &Method::set_breakpoint ? "sett" : "clear",
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
              method->name()->as_C_string(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
              method->signature()->as_C_string()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   322
            ((Method*)method()->*meth_act)(_bci);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
            break;
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
    } // pvw is cleaned up
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  } // rm is cleaned up
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
void JvmtiBreakpoint::set() {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   332
  each_method_version_do(&Method::set_breakpoint);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
void JvmtiBreakpoint::clear() {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   336
  each_method_version_do(&Method::clear_breakpoint);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
void JvmtiBreakpoint::print() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  const char *class_name  = (_method == NULL) ? "NULL" : _method->klass_name()->as_C_string();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
  const char *method_name = (_method == NULL) ? "NULL" : _method->name()->as_C_string();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  tty->print("Breakpoint(%s,%s,%d,%p)",class_name, method_name, _bci, getBcp());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
// class VM_ChangeBreakpoints
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
// Modify the Breakpoints data structure at a safepoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
void VM_ChangeBreakpoints::doit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  switch (_operation) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  case SET_BREAKPOINT:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
    _breakpoints->set_at_safepoint(*_bp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  case CLEAR_BREAKPOINT:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
    _breakpoints->clear_at_safepoint(*_bp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
    assert(false, "Unknown operation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
void VM_ChangeBreakpoints::oops_do(OopClosure* f) {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 15937
diff changeset
   369
  // The JvmtiBreakpoints in _breakpoints will be visited via
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 15937
diff changeset
   370
  // JvmtiExport::oops_do.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  if (_bp != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
    _bp->oops_do(f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
// class JvmtiBreakpoints
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
// a JVMTI internal collection of JvmtiBreakpoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
JvmtiBreakpoints::JvmtiBreakpoints(void listener_fun(void *,address *)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  _bps.initialize(this,listener_fun);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
JvmtiBreakpoints:: ~JvmtiBreakpoints() {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
void  JvmtiBreakpoints::oops_do(OopClosure* f) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  _bps.oops_do(f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
7918
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7896
diff changeset
   392
void JvmtiBreakpoints::gc_epilogue() {
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7896
diff changeset
   393
  _bps.gc_epilogue();
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7896
diff changeset
   394
}
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7896
diff changeset
   395
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
void  JvmtiBreakpoints::print() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  int n = _bps.length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  for (int i=0; i<n; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
    JvmtiBreakpoint& bp = _bps.at(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
    tty->print("%d: ", i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
    bp.print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
    tty->print_cr("");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
void JvmtiBreakpoints::set_at_safepoint(JvmtiBreakpoint& bp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  int i = _bps.find(bp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  if (i == -1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
    _bps.append(bp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
    bp.set();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
void JvmtiBreakpoints::clear_at_safepoint(JvmtiBreakpoint& bp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  int i = _bps.find(bp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  if (i != -1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
    _bps.remove(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
    bp.clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
int JvmtiBreakpoints::length() { return _bps.length(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
int JvmtiBreakpoints::set(JvmtiBreakpoint& bp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  if ( _bps.find(bp) != -1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
     return JVMTI_ERROR_DUPLICATE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  }
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 15937
diff changeset
   437
  VM_ChangeBreakpoints set_breakpoint(VM_ChangeBreakpoints::SET_BREAKPOINT, &bp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
  VMThread::execute(&set_breakpoint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
  return JVMTI_ERROR_NONE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
int JvmtiBreakpoints::clear(JvmtiBreakpoint& bp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  if ( _bps.find(bp) == -1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
     return JVMTI_ERROR_NOT_FOUND;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 15937
diff changeset
   447
  VM_ChangeBreakpoints clear_breakpoint(VM_ChangeBreakpoints::CLEAR_BREAKPOINT, &bp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
  VMThread::execute(&clear_breakpoint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  return JVMTI_ERROR_NONE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   452
void JvmtiBreakpoints::clearall_in_class_at_safepoint(Klass* klass) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  bool changed = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  // We are going to run thru the list of bkpts
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  // and delete some.  This deletion probably alters
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  // the list in some implementation defined way such
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  // that when we delete entry i, the next entry might
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  // no longer be at i+1.  To be safe, each time we delete
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
  // an entry, we'll just start again from the beginning.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  // We'll stop when we make a pass thru the whole list without
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
  // deleting anything.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  while (changed) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
    int len = _bps.length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
    changed = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
    for (int i = 0; i < len; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
      JvmtiBreakpoint& bp = _bps.at(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
      if (bp.method()->method_holder() == klass) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
        bp.clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
        _bps.remove(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
        // This changed 'i' so we have to start over.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
        changed = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
      }
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
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
// class JvmtiCurrentBreakpoints
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
JvmtiBreakpoints *JvmtiCurrentBreakpoints::_jvmti_breakpoints  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
address *         JvmtiCurrentBreakpoints::_breakpoint_list    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
JvmtiBreakpoints& JvmtiCurrentBreakpoints::get_jvmti_breakpoints() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
  if (_jvmti_breakpoints != NULL) return (*_jvmti_breakpoints);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
  _jvmti_breakpoints = new JvmtiBreakpoints(listener_fun);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  assert(_jvmti_breakpoints != NULL, "_jvmti_breakpoints != NULL");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
  return (*_jvmti_breakpoints);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
void  JvmtiCurrentBreakpoints::listener_fun(void *this_obj, address *cache) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  JvmtiBreakpoints *this_jvmti = (JvmtiBreakpoints *) this_obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
  assert(this_jvmti != NULL, "this_jvmti != NULL");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  debug_only(int n = this_jvmti->length(););
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  assert(cache[n] == NULL, "cache must be NULL terminated");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
  set_breakpoint_list(cache);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
void JvmtiCurrentBreakpoints::oops_do(OopClosure* f) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  if (_jvmti_breakpoints != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
    _jvmti_breakpoints->oops_do(f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
7918
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7896
diff changeset
   510
void JvmtiCurrentBreakpoints::gc_epilogue() {
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7896
diff changeset
   511
  if (_jvmti_breakpoints != NULL) {
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7896
diff changeset
   512
    _jvmti_breakpoints->gc_epilogue();
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7896
diff changeset
   513
  }
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7896
diff changeset
   514
}
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7896
diff changeset
   515
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
///////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
// class VM_GetOrSetLocal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
// Constructor for non-object getter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
VM_GetOrSetLocal::VM_GetOrSetLocal(JavaThread* thread, jint depth, int index, BasicType type)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  : _thread(thread)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  , _calling_thread(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  , _depth(depth)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
  , _index(index)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
  , _type(type)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  , _set(false)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  , _jvf(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  , _result(JVMTI_ERROR_NONE)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
// Constructor for object or non-object setter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
VM_GetOrSetLocal::VM_GetOrSetLocal(JavaThread* thread, jint depth, int index, BasicType type, jvalue value)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  : _thread(thread)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
  , _calling_thread(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  , _depth(depth)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  , _index(index)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  , _type(type)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  , _value(value)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  , _set(true)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  , _jvf(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  , _result(JVMTI_ERROR_NONE)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
// Constructor for object getter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
VM_GetOrSetLocal::VM_GetOrSetLocal(JavaThread* thread, JavaThread* calling_thread, jint depth, int index)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  : _thread(thread)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  , _calling_thread(calling_thread)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  , _depth(depth)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  , _index(index)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
  , _type(T_OBJECT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
  , _set(false)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
  , _jvf(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
  , _result(JVMTI_ERROR_NONE)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
vframe *VM_GetOrSetLocal::get_vframe() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
  if (!_thread->has_last_Java_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
  RegisterMap reg_map(_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
  vframe *vf = _thread->last_java_vframe(&reg_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  int d = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  while ((vf != NULL) && (d < _depth)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
    vf = vf->java_sender();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
    d++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
  return vf;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
javaVFrame *VM_GetOrSetLocal::get_java_vframe() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
  vframe* vf = get_vframe();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  if (vf == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
    _result = JVMTI_ERROR_NO_MORE_FRAMES;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
  javaVFrame *jvf = (javaVFrame*)vf;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
7444
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   583
  if (!vf->is_java_frame()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
    _result = JVMTI_ERROR_OPAQUE_FRAME;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
  return jvf;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
// Check that the klass is assignable to a type with the given signature.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
// Another solution could be to use the function Klass::is_subtype_of(type).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
// But the type class can be forced to load/initialize eagerly in such a case.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
// This may cause unexpected consequences like CFLH or class-init JVMTI events.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
// It is better to avoid such a behavior.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
bool VM_GetOrSetLocal::is_assignable(const char* ty_sign, Klass* klass, Thread* thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
  assert(ty_sign != NULL, "type signature must not be NULL");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
  assert(thread != NULL, "thread must not be NULL");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
  assert(klass != NULL, "klass must not be NULL");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
  int len = (int) strlen(ty_sign);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
  if (ty_sign[0] == 'L' && ty_sign[len-1] == ';') { // Need pure class/interface name
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
    ty_sign++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
    len -= 2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
  }
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   605
  TempNewSymbol ty_sym = SymbolTable::new_symbol(ty_sign, len, thread);
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   606
  if (klass->name() == ty_sym) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
  // Compare primary supers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
  int super_depth = klass->super_depth();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
  int idx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
  for (idx = 0; idx < super_depth; idx++) {
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 13728
diff changeset
   613
    if (klass->primary_super_of_depth(idx)->name() == ty_sym) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
  // Compare secondary supers
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   618
  Array<Klass*>* sec_supers = klass->secondary_supers();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
  for (idx = 0; idx < sec_supers->length(); idx++) {
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 13728
diff changeset
   620
    if (((Klass*) sec_supers->at(idx))->name() == ty_sym) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
// Checks error conditions:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
//   JVMTI_ERROR_INVALID_SLOT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
//   JVMTI_ERROR_TYPE_MISMATCH
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
// Returns: 'true' - everything is Ok, 'false' - error code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
bool VM_GetOrSetLocal::check_slot_type(javaVFrame* jvf) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   633
  Method* method_oop = jvf->method();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
  if (!method_oop->has_localvariable_table()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
    // Just to check index boundaries
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
    jint extra_slot = (_type == T_LONG || _type == T_DOUBLE) ? 1 : 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
    if (_index < 0 || _index + extra_slot >= method_oop->max_locals()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
      _result = JVMTI_ERROR_INVALID_SLOT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
  jint num_entries = method_oop->localvariable_table_length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
  if (num_entries == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
    _result = JVMTI_ERROR_INVALID_SLOT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
    return false;       // There are no slots
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  int signature_idx = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
  int vf_bci = jvf->bci();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
  LocalVariableTableElement* table = method_oop->localvariable_table_start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
  for (int i = 0; i < num_entries; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
    int start_bci = table[i].start_bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
    int end_bci = start_bci + table[i].length;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
    // Here we assume that locations of LVT entries
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
    // with the same slot number cannot be overlapped
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
    if (_index == (jint) table[i].slot && start_bci <= vf_bci && vf_bci <= end_bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
      signature_idx = (int) table[i].descriptor_cp_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
  if (signature_idx == -1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
    _result = JVMTI_ERROR_INVALID_SLOT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
    return false;       // Incorrect slot index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
  }
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   667
  Symbol*   sign_sym  = method_oop->constants()->symbol_at(signature_idx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
  const char* signature = (const char *) sign_sym->as_utf8();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  BasicType slot_type = char2type(signature[0]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
  switch (slot_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
  case T_BYTE:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
  case T_SHORT:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
  case T_CHAR:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
  case T_BOOLEAN:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
    slot_type = T_INT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
  case T_ARRAY:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
    slot_type = T_OBJECT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
  if (_type != slot_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
    _result = JVMTI_ERROR_TYPE_MISMATCH;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
  jobject jobj = _value.l;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
  if (_set && slot_type == T_OBJECT && jobj != NULL) { // NULL reference is allowed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
    // Check that the jobject class matches the return type signature.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
    JavaThread* cur_thread = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
    HandleMark hm(cur_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
    Handle obj = Handle(cur_thread, JNIHandles::resolve_external_guard(jobj));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
    NULL_CHECK(obj, (_result = JVMTI_ERROR_INVALID_OBJECT, false));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
    KlassHandle ob_kh = KlassHandle(cur_thread, obj->klass());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
    NULL_CHECK(ob_kh, (_result = JVMTI_ERROR_INVALID_OBJECT, false));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 13728
diff changeset
   698
    if (!is_assignable(signature, ob_kh(), cur_thread)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
      _result = JVMTI_ERROR_TYPE_MISMATCH;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
static bool can_be_deoptimized(vframe* vf) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
  return (vf->is_compiled_frame() && vf->fr().can_be_deoptimized());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
bool VM_GetOrSetLocal::doit_prologue() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
  _jvf = get_java_vframe();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
  NULL_CHECK(_jvf, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
7444
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   714
  if (_jvf->method()->is_native()) {
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   715
    if (getting_receiver() && !_jvf->method()->is_static()) {
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   716
      return true;
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   717
    } else {
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   718
      _result = JVMTI_ERROR_OPAQUE_FRAME;
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   719
      return false;
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   720
    }
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   721
  }
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   722
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
  if (!check_slot_type(_jvf)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
void VM_GetOrSetLocal::doit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
  if (_set) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
    // Force deoptimization of frame if compiled because it's
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
    // possible the compiler emitted some locals as constant values,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
    // meaning they are not mutable.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
    if (can_be_deoptimized(_jvf)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
      // Schedule deoptimization so that eventually the local
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
      // update will be written to an interpreter frame.
7106
867c9d296c6b 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 5547
diff changeset
   738
      Deoptimization::deoptimize_frame(_jvf->thread(), _jvf->fr().id());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
      // Now store a new value for the local which will be applied
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
      // once deoptimization occurs. Note however that while this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
      // write is deferred until deoptimization actually happens
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
      // can vframe created after this point will have its locals
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
      // reflecting this update so as far as anyone can see the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
      // write has already taken place.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
      // If we are updating an oop then get the oop from the handle
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
      // since the handle will be long gone by the time the deopt
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
      // happens. The oop stored in the deferred local will be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
      // gc'd on its own.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
      if (_type == T_OBJECT) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
        _value.l = (jobject) (JNIHandles::resolve_external_guard(_value.l));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
      // Re-read the vframe so we can see that it is deoptimized
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
      // [ Only need because of assert in update_local() ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
      _jvf = get_java_vframe();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
      ((compiledVFrame*)_jvf)->update_local(_type, _index, _value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
    StackValueCollection *locals = _jvf->locals();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
    HandleMark hm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
    switch (_type) {
7444
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   764
      case T_INT:    locals->set_int_at   (_index, _value.i); break;
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   765
      case T_LONG:   locals->set_long_at  (_index, _value.j); break;
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   766
      case T_FLOAT:  locals->set_float_at (_index, _value.f); break;
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   767
      case T_DOUBLE: locals->set_double_at(_index, _value.d); break;
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   768
      case T_OBJECT: {
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   769
        Handle ob_h(JNIHandles::resolve_external_guard(_value.l));
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   770
        locals->set_obj_at (_index, ob_h);
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   771
        break;
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   772
      }
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   773
      default: ShouldNotReachHere();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
    _jvf->set_locals(locals);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
  } else {
7444
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   777
    if (_jvf->method()->is_native() && _jvf->is_compiled_frame()) {
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   778
      assert(getting_receiver(), "Can only get here when getting receiver");
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   779
      oop receiver = _jvf->fr().get_native_receiver();
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   780
      _value.l = JNIHandles::make_local(_calling_thread, receiver);
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   781
    } else {
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   782
      StackValueCollection *locals = _jvf->locals();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
7444
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   784
      if (locals->at(_index)->type() == T_CONFLICT) {
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   785
        memset(&_value, 0, sizeof(_value));
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   786
        _value.l = NULL;
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   787
        return;
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   788
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
7444
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   790
      switch (_type) {
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   791
        case T_INT:    _value.i = locals->int_at   (_index);   break;
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   792
        case T_LONG:   _value.j = locals->long_at  (_index);   break;
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   793
        case T_FLOAT:  _value.f = locals->float_at (_index);   break;
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   794
        case T_DOUBLE: _value.d = locals->double_at(_index);   break;
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   795
        case T_OBJECT: {
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   796
          // Wrap the oop to be returned in a local JNI handle since
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   797
          // oops_do() no longer applies after doit() is finished.
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   798
          oop obj = locals->obj_at(_index)();
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   799
          _value.l = JNIHandles::make_local(_calling_thread, obj);
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   800
          break;
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   801
        }
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   802
        default: ShouldNotReachHere();
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   803
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
bool VM_GetOrSetLocal::allow_nested_vm_operations() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
  return true; // May need to deoptimize
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
7444
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   814
VM_GetReceiver::VM_GetReceiver(
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   815
    JavaThread* thread, JavaThread* caller_thread, jint depth)
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   816
    : VM_GetOrSetLocal(thread, caller_thread, depth, 0) {}
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   817
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
/////////////////////////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
// class JvmtiSuspendControl - see comments in jvmtiImpl.hpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
bool JvmtiSuspendControl::suspend(JavaThread *java_thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
  // external suspend should have caught suspending a thread twice
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
  // Immediate suspension required for JPDA back-end so JVMTI agent threads do
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
  // not deadlock due to later suspension on transitions while holding
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
  // raw monitors.  Passing true causes the immediate suspension.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
  // java_suspend() will catch threads in the process of exiting
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
  // and will ignore them.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
  java_thread->java_suspend();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
  // It would be nice to have the following assertion in all the time,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
  // but it is possible for a racing resume request to have resumed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
  // this thread right after we suspended it. Temporarily enable this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
  // assertion if you are chasing a different kind of bug.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
  // assert(java_lang_Thread::thread(java_thread->threadObj()) == NULL ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
  //   java_thread->is_being_ext_suspended(), "thread is not suspended");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
  if (java_lang_Thread::thread(java_thread->threadObj()) == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
    // check again because we can get delayed in java_suspend():
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
    // the thread is in process of exiting.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
bool JvmtiSuspendControl::resume(JavaThread *java_thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
  // external suspend should have caught resuming a thread twice
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
  assert(java_thread->is_being_ext_suspended(), "thread should be suspended");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
  // resume thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
    // must always grab Threads_lock, see JVM_SuspendThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
    MutexLocker ml(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
    java_thread->java_resume();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
void JvmtiSuspendControl::print() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
  MutexLocker mu(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
  tty->print("Suspended Threads: [");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
  for (JavaThread *thread = Threads::first(); thread != NULL; thread = thread->next()) {
15937
fd3d2d0175f9 8006498: #if <symbol> is wrong in the code.
jprovino
parents: 15432
diff changeset
   873
#ifdef JVMTI_TRACE
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
    const char *name   = JvmtiTrace::safe_get_thread_name(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
    const char *name   = "";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
#endif /*JVMTI_TRACE */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
    tty->print("%s(%c ", name, thread->is_being_ext_suspended() ? 'S' : '_');
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
    if (!thread->has_last_Java_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
      tty->print("no stack");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
    tty->print(") ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
  tty->print_cr("]");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
}
8110
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   887
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   888
JvmtiDeferredEvent JvmtiDeferredEvent::compiled_method_load_event(
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   889
    nmethod* nm) {
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   890
  JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_LOAD);
8475
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   891
  event._event_data.compiled_method_load = nm;
8661
3dc8a18ac563 7024970: 2/3 assert(ServiceThread::is_service_thread(Thread::current())) failed: Service thread must post enqueue
dcubed
parents: 8475
diff changeset
   892
  // Keep the nmethod alive until the ServiceThread can process
3dc8a18ac563 7024970: 2/3 assert(ServiceThread::is_service_thread(Thread::current())) failed: Service thread must post enqueue
dcubed
parents: 8475
diff changeset
   893
  // this deferred event.
3dc8a18ac563 7024970: 2/3 assert(ServiceThread::is_service_thread(Thread::current())) failed: Service thread must post enqueue
dcubed
parents: 8475
diff changeset
   894
  nmethodLocker::lock_nmethod(nm);
8110
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   895
  return event;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   896
}
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   897
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   898
JvmtiDeferredEvent JvmtiDeferredEvent::compiled_method_unload_event(
8661
3dc8a18ac563 7024970: 2/3 assert(ServiceThread::is_service_thread(Thread::current())) failed: Service thread must post enqueue
dcubed
parents: 8475
diff changeset
   899
    nmethod* nm, jmethodID id, const void* code) {
8110
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   900
  JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_UNLOAD);
8661
3dc8a18ac563 7024970: 2/3 assert(ServiceThread::is_service_thread(Thread::current())) failed: Service thread must post enqueue
dcubed
parents: 8475
diff changeset
   901
  event._event_data.compiled_method_unload.nm = nm;
8475
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   902
  event._event_data.compiled_method_unload.method_id = id;
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   903
  event._event_data.compiled_method_unload.code_begin = code;
8661
3dc8a18ac563 7024970: 2/3 assert(ServiceThread::is_service_thread(Thread::current())) failed: Service thread must post enqueue
dcubed
parents: 8475
diff changeset
   904
  // Keep the nmethod alive until the ServiceThread can process
3dc8a18ac563 7024970: 2/3 assert(ServiceThread::is_service_thread(Thread::current())) failed: Service thread must post enqueue
dcubed
parents: 8475
diff changeset
   905
  // this deferred event. This will keep the memory for the
3dc8a18ac563 7024970: 2/3 assert(ServiceThread::is_service_thread(Thread::current())) failed: Service thread must post enqueue
dcubed
parents: 8475
diff changeset
   906
  // generated code from being reused too early. We pass
3dc8a18ac563 7024970: 2/3 assert(ServiceThread::is_service_thread(Thread::current())) failed: Service thread must post enqueue
dcubed
parents: 8475
diff changeset
   907
  // zombie_ok == true here so that our nmethod that was just
3dc8a18ac563 7024970: 2/3 assert(ServiceThread::is_service_thread(Thread::current())) failed: Service thread must post enqueue
dcubed
parents: 8475
diff changeset
   908
  // made into a zombie can be locked.
3dc8a18ac563 7024970: 2/3 assert(ServiceThread::is_service_thread(Thread::current())) failed: Service thread must post enqueue
dcubed
parents: 8475
diff changeset
   909
  nmethodLocker::lock_nmethod(nm, true /* zombie_ok */);
8475
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   910
  return event;
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   911
}
9405
d2e9ee78c3c1 7039447: 2/1 java profiling is broken in build 139 (garbage in function name)
dcubed
parents: 8661
diff changeset
   912
8475
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   913
JvmtiDeferredEvent JvmtiDeferredEvent::dynamic_code_generated_event(
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   914
      const char* name, const void* code_begin, const void* code_end) {
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   915
  JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_DYNAMIC_CODE_GENERATED);
9405
d2e9ee78c3c1 7039447: 2/1 java profiling is broken in build 139 (garbage in function name)
dcubed
parents: 8661
diff changeset
   916
  // Need to make a copy of the name since we don't know how long
d2e9ee78c3c1 7039447: 2/1 java profiling is broken in build 139 (garbage in function name)
dcubed
parents: 8661
diff changeset
   917
  // the event poster will keep it around after we enqueue the
d2e9ee78c3c1 7039447: 2/1 java profiling is broken in build 139 (garbage in function name)
dcubed
parents: 8661
diff changeset
   918
  // deferred event and return. strdup() failure is handled in
d2e9ee78c3c1 7039447: 2/1 java profiling is broken in build 139 (garbage in function name)
dcubed
parents: 8661
diff changeset
   919
  // the post() routine below.
d2e9ee78c3c1 7039447: 2/1 java profiling is broken in build 139 (garbage in function name)
dcubed
parents: 8661
diff changeset
   920
  event._event_data.dynamic_code_generated.name = os::strdup(name);
8475
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   921
  event._event_data.dynamic_code_generated.code_begin = code_begin;
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   922
  event._event_data.dynamic_code_generated.code_end = code_end;
8110
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   923
  return event;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   924
}
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   925
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   926
void JvmtiDeferredEvent::post() {
8475
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   927
  assert(ServiceThread::is_service_thread(Thread::current()),
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   928
         "Service thread must post enqueued events");
8110
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   929
  switch(_type) {
8475
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   930
    case TYPE_COMPILED_METHOD_LOAD: {
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   931
      nmethod* nm = _event_data.compiled_method_load;
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   932
      JvmtiExport::post_compiled_method_load(nm);
8661
3dc8a18ac563 7024970: 2/3 assert(ServiceThread::is_service_thread(Thread::current())) failed: Service thread must post enqueue
dcubed
parents: 8475
diff changeset
   933
      // done with the deferred event so unlock the nmethod
8475
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   934
      nmethodLocker::unlock_nmethod(nm);
8110
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   935
      break;
8475
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   936
    }
8661
3dc8a18ac563 7024970: 2/3 assert(ServiceThread::is_service_thread(Thread::current())) failed: Service thread must post enqueue
dcubed
parents: 8475
diff changeset
   937
    case TYPE_COMPILED_METHOD_UNLOAD: {
3dc8a18ac563 7024970: 2/3 assert(ServiceThread::is_service_thread(Thread::current())) failed: Service thread must post enqueue
dcubed
parents: 8475
diff changeset
   938
      nmethod* nm = _event_data.compiled_method_unload.nm;
8110
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   939
      JvmtiExport::post_compiled_method_unload(
8475
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   940
        _event_data.compiled_method_unload.method_id,
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   941
        _event_data.compiled_method_unload.code_begin);
8661
3dc8a18ac563 7024970: 2/3 assert(ServiceThread::is_service_thread(Thread::current())) failed: Service thread must post enqueue
dcubed
parents: 8475
diff changeset
   942
      // done with the deferred event so unlock the nmethod
3dc8a18ac563 7024970: 2/3 assert(ServiceThread::is_service_thread(Thread::current())) failed: Service thread must post enqueue
dcubed
parents: 8475
diff changeset
   943
      nmethodLocker::unlock_nmethod(nm);
8110
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   944
      break;
8661
3dc8a18ac563 7024970: 2/3 assert(ServiceThread::is_service_thread(Thread::current())) failed: Service thread must post enqueue
dcubed
parents: 8475
diff changeset
   945
    }
9405
d2e9ee78c3c1 7039447: 2/1 java profiling is broken in build 139 (garbage in function name)
dcubed
parents: 8661
diff changeset
   946
    case TYPE_DYNAMIC_CODE_GENERATED: {
8475
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   947
      JvmtiExport::post_dynamic_code_generated_internal(
9405
d2e9ee78c3c1 7039447: 2/1 java profiling is broken in build 139 (garbage in function name)
dcubed
parents: 8661
diff changeset
   948
        // if strdup failed give the event a default name
d2e9ee78c3c1 7039447: 2/1 java profiling is broken in build 139 (garbage in function name)
dcubed
parents: 8661
diff changeset
   949
        (_event_data.dynamic_code_generated.name == NULL)
d2e9ee78c3c1 7039447: 2/1 java profiling is broken in build 139 (garbage in function name)
dcubed
parents: 8661
diff changeset
   950
          ? "unknown_code" : _event_data.dynamic_code_generated.name,
8475
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   951
        _event_data.dynamic_code_generated.code_begin,
c2b97a27943a 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 8110
diff changeset
   952
        _event_data.dynamic_code_generated.code_end);
9405
d2e9ee78c3c1 7039447: 2/1 java profiling is broken in build 139 (garbage in function name)
dcubed
parents: 8661
diff changeset
   953
      if (_event_data.dynamic_code_generated.name != NULL) {
d2e9ee78c3c1 7039447: 2/1 java profiling is broken in build 139 (garbage in function name)
dcubed
parents: 8661
diff changeset
   954
        // release our copy
d2e9ee78c3c1 7039447: 2/1 java profiling is broken in build 139 (garbage in function name)
dcubed
parents: 8661
diff changeset
   955
        os::free((void *)_event_data.dynamic_code_generated.name);
d2e9ee78c3c1 7039447: 2/1 java profiling is broken in build 139 (garbage in function name)
dcubed
parents: 8661
diff changeset
   956
      }
8110
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   957
      break;
9405
d2e9ee78c3c1 7039447: 2/1 java profiling is broken in build 139 (garbage in function name)
dcubed
parents: 8661
diff changeset
   958
    }
8110
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   959
    default:
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   960
      ShouldNotReachHere();
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   961
  }
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   962
}
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   963
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   964
JvmtiDeferredEventQueue::QueueNode* JvmtiDeferredEventQueue::_queue_tail = NULL;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   965
JvmtiDeferredEventQueue::QueueNode* JvmtiDeferredEventQueue::_queue_head = NULL;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   966
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   967
volatile JvmtiDeferredEventQueue::QueueNode*
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   968
    JvmtiDeferredEventQueue::_pending_list = NULL;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   969
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   970
bool JvmtiDeferredEventQueue::has_events() {
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   971
  assert(Service_lock->owned_by_self(), "Must own Service_lock");
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   972
  return _queue_head != NULL || _pending_list != NULL;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   973
}
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   974
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   975
void JvmtiDeferredEventQueue::enqueue(const JvmtiDeferredEvent& event) {
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   976
  assert(Service_lock->owned_by_self(), "Must own Service_lock");
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   977
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   978
  process_pending_events();
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   979
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   980
  // Events get added to the end of the queue (and are pulled off the front).
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   981
  QueueNode* node = new QueueNode(event);
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   982
  if (_queue_tail == NULL) {
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   983
    _queue_tail = _queue_head = node;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   984
  } else {
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   985
    assert(_queue_tail->next() == NULL, "Must be the last element in the list");
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   986
    _queue_tail->set_next(node);
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   987
    _queue_tail = node;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   988
  }
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   989
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   990
  Service_lock->notify_all();
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   991
  assert((_queue_head == NULL) == (_queue_tail == NULL),
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   992
         "Inconsistent queue markers");
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   993
}
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   994
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   995
JvmtiDeferredEvent JvmtiDeferredEventQueue::dequeue() {
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   996
  assert(Service_lock->owned_by_self(), "Must own Service_lock");
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   997
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   998
  process_pending_events();
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
   999
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1000
  assert(_queue_head != NULL, "Nothing to dequeue");
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1001
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1002
  if (_queue_head == NULL) {
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1003
    // Just in case this happens in product; it shouldn't but let's not crash
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1004
    return JvmtiDeferredEvent();
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1005
  }
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1006
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1007
  QueueNode* node = _queue_head;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1008
  _queue_head = _queue_head->next();
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1009
  if (_queue_head == NULL) {
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1010
    _queue_tail = NULL;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1011
  }
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1012
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1013
  assert((_queue_head == NULL) == (_queue_tail == NULL),
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1014
         "Inconsistent queue markers");
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1015
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1016
  JvmtiDeferredEvent event = node->event();
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1017
  delete node;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1018
  return event;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1019
}
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1020
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1021
void JvmtiDeferredEventQueue::add_pending_event(
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1022
    const JvmtiDeferredEvent& event) {
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1023
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1024
  QueueNode* node = new QueueNode(event);
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1025
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1026
  bool success = false;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1027
  QueueNode* prev_value = (QueueNode*)_pending_list;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1028
  do {
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1029
    node->set_next(prev_value);
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1030
    prev_value = (QueueNode*)Atomic::cmpxchg_ptr(
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1031
        (void*)node, (volatile void*)&_pending_list, (void*)node->next());
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1032
  } while (prev_value != node->next());
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1033
}
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1034
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1035
// This method transfers any events that were added by someone NOT holding
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1036
// the lock into the mainline queue.
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1037
void JvmtiDeferredEventQueue::process_pending_events() {
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1038
  assert(Service_lock->owned_by_self(), "Must own Service_lock");
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1039
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1040
  if (_pending_list != NULL) {
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1041
    QueueNode* head =
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1042
        (QueueNode*)Atomic::xchg_ptr(NULL, (volatile void*)&_pending_list);
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1043
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1044
    assert((_queue_head == NULL) == (_queue_tail == NULL),
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1045
           "Inconsistent queue markers");
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1046
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1047
    if (head != NULL) {
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1048
      // Since we've treated the pending list as a stack (with newer
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1049
      // events at the beginning), we need to join the bottom of the stack
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1050
      // with the 'tail' of the queue in order to get the events in the
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1051
      // right order.  We do this by reversing the pending list and appending
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1052
      // it to the queue.
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1053
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1054
      QueueNode* new_tail = head;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1055
      QueueNode* new_head = NULL;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1056
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1057
      // This reverses the list
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1058
      QueueNode* prev = new_tail;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1059
      QueueNode* node = new_tail->next();
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1060
      new_tail->set_next(NULL);
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1061
      while (node != NULL) {
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1062
        QueueNode* next = node->next();
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1063
        node->set_next(prev);
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1064
        prev = node;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1065
        node = next;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1066
      }
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1067
      new_head = prev;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1068
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1069
      // Now append the new list to the queue
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1070
      if (_queue_tail != NULL) {
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1071
        _queue_tail->set_next(new_head);
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1072
      } else { // _queue_head == NULL
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1073
        _queue_head = new_head;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1074
      }
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1075
      _queue_tail = new_tail;
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1076
    }
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1077
  }
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 8076
diff changeset
  1078
}