src/share/vm/prims/jvmtiImpl.cpp

Tue, 08 Aug 2017 15:57:29 +0800

author
aoqi
date
Tue, 08 Aug 2017 15:57:29 +0800
changeset 6876
710a3c8b516e
parent 6680
78bbf4d43a14
parent 0
f90c822e73f8
child 7994
04ff2f6cd0eb
permissions
-rw-r--r--

merge

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

mercurial