1 /*
   2  * Copyright 2003-2010 Sun Microsystems, Inc.  All Rights Reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  20  * CA 95054 USA or visit www.sun.com if you need additional information or
  21  * have any questions.
  22  *
  23  */
  24 
  25 # include "incls/_precompiled.incl"
  26 # include "incls/_jvmtiExport.cpp.incl"
  27 
  28 #ifdef JVMTI_TRACE
  29 #define EVT_TRACE(evt,out) if ((JvmtiTrace::event_trace_flags(evt) & JvmtiTrace::SHOW_EVENT_SENT) != 0) { SafeResourceMark rm; tty->print_cr out; }
  30 #define EVT_TRIG_TRACE(evt,out) if ((JvmtiTrace::event_trace_flags(evt) & JvmtiTrace::SHOW_EVENT_TRIGGER) != 0) { SafeResourceMark rm; tty->print_cr out; }
  31 #else
  32 #define EVT_TRIG_TRACE(evt,out)
  33 #define EVT_TRACE(evt,out)
  34 #endif
  35 
  36 ///////////////////////////////////////////////////////////////
  37 //
  38 // JvmtiEventTransition
  39 //
  40 // TO DO --
  41 //  more handle purging
  42 
  43 // Use this for JavaThreads and state is  _thread_in_vm.
  44 class JvmtiJavaThreadEventTransition : StackObj {
  45 private:
  46   ResourceMark _rm;
  47   ThreadToNativeFromVM _transition;
  48   HandleMark _hm;
  49 
  50 public:
  51   JvmtiJavaThreadEventTransition(JavaThread *thread) :
  52     _rm(),
  53     _transition(thread),
  54     _hm(thread)  {};
  55 };
  56 
  57 // For JavaThreads which are not in _thread_in_vm state
  58 // and other system threads use this.
  59 class JvmtiThreadEventTransition : StackObj {
  60 private:
  61   ResourceMark _rm;
  62   HandleMark _hm;
  63   JavaThreadState _saved_state;
  64   JavaThread *_jthread;
  65 
  66 public:
  67   JvmtiThreadEventTransition(Thread *thread) : _rm(), _hm() {
  68     if (thread->is_Java_thread()) {
  69        _jthread = (JavaThread *)thread;
  70        _saved_state = _jthread->thread_state();
  71        if (_saved_state == _thread_in_Java) {
  72          ThreadStateTransition::transition_from_java(_jthread, _thread_in_native);
  73        } else {
  74          ThreadStateTransition::transition(_jthread, _saved_state, _thread_in_native);
  75        }
  76     } else {
  77       _jthread = NULL;
  78     }
  79   }
  80 
  81   ~JvmtiThreadEventTransition() {
  82     if (_jthread != NULL)
  83       ThreadStateTransition::transition_from_native(_jthread, _saved_state);
  84   }
  85 };
  86 
  87 
  88 ///////////////////////////////////////////////////////////////
  89 //
  90 // JvmtiEventMark
  91 //
  92 
  93 class JvmtiEventMark : public StackObj {
  94 private:
  95   JavaThread *_thread;
  96   JNIEnv* _jni_env;
  97   bool _exception_detected;
  98   bool _exception_caught;
  99 #if 0
 100   JNIHandleBlock* _hblock;
 101 #endif
 102 
 103 public:
 104   JvmtiEventMark(JavaThread *thread) :  _thread(thread),
 105                                          _jni_env(thread->jni_environment()) {
 106 #if 0
 107     _hblock = thread->active_handles();
 108     _hblock->clear_thoroughly(); // so we can be safe
 109 #else
 110     // we want to use the code above - but that needs the JNIHandle changes - later...
 111     // for now, steal JNI push local frame code
 112     JvmtiThreadState *state = thread->jvmti_thread_state();
 113     // we are before an event.
 114     // Save current jvmti thread exception state.
 115     if (state != NULL) {
 116       _exception_detected = state->is_exception_detected();
 117       _exception_caught = state->is_exception_caught();
 118     } else {
 119       _exception_detected = false;
 120       _exception_caught = false;
 121     }
 122 
 123     JNIHandleBlock* old_handles = thread->active_handles();
 124     JNIHandleBlock* new_handles = JNIHandleBlock::allocate_block(thread);
 125     assert(new_handles != NULL, "should not be NULL");
 126     new_handles->set_pop_frame_link(old_handles);
 127     thread->set_active_handles(new_handles);
 128 #endif
 129     assert(thread == JavaThread::current(), "thread must be current!");
 130     thread->frame_anchor()->make_walkable(thread);
 131   };
 132 
 133   ~JvmtiEventMark() {
 134 #if 0
 135     _hblock->clear(); // for consistency with future correct behavior
 136 #else
 137     // we want to use the code above - but that needs the JNIHandle changes - later...
 138     // for now, steal JNI pop local frame code
 139     JNIHandleBlock* old_handles = _thread->active_handles();
 140     JNIHandleBlock* new_handles = old_handles->pop_frame_link();
 141     assert(new_handles != NULL, "should not be NULL");
 142     _thread->set_active_handles(new_handles);
 143     // Note that we set the pop_frame_link to NULL explicitly, otherwise
 144     // the release_block call will release the blocks.
 145     old_handles->set_pop_frame_link(NULL);
 146     JNIHandleBlock::release_block(old_handles, _thread); // may block
 147 #endif
 148 
 149     JvmtiThreadState* state = _thread->jvmti_thread_state();
 150     // we are continuing after an event.
 151     if (state != NULL) {
 152       // Restore the jvmti thread exception state.
 153       if (_exception_detected) {
 154         state->set_exception_detected();
 155       }
 156       if (_exception_caught) {
 157         state->set_exception_caught();
 158       }
 159     }
 160   }
 161 
 162 #if 0
 163   jobject to_jobject(oop obj) { return obj == NULL? NULL : _hblock->allocate_handle_fast(obj); }
 164 #else
 165   // we want to use the code above - but that needs the JNIHandle changes - later...
 166   // for now, use regular make_local
 167   jobject to_jobject(oop obj) { return JNIHandles::make_local(_thread,obj); }
 168 #endif
 169 
 170   jclass to_jclass(klassOop klass) { return (klass == NULL ? NULL : (jclass)to_jobject(Klass::cast(klass)->java_mirror())); }
 171 
 172   jmethodID to_jmethodID(methodHandle method) { return method->jmethod_id(); }
 173 
 174   JNIEnv* jni_env() { return _jni_env; }
 175 };
 176 
 177 class JvmtiThreadEventMark : public JvmtiEventMark {
 178 private:
 179   jthread _jt;
 180 
 181 public:
 182   JvmtiThreadEventMark(JavaThread *thread) :
 183     JvmtiEventMark(thread) {
 184     _jt = (jthread)(to_jobject(thread->threadObj()));
 185   };
 186  jthread jni_thread() { return _jt; }
 187 };
 188 
 189 class JvmtiClassEventMark : public JvmtiThreadEventMark {
 190 private:
 191   jclass _jc;
 192 
 193 public:
 194   JvmtiClassEventMark(JavaThread *thread, klassOop klass) :
 195     JvmtiThreadEventMark(thread) {
 196     _jc = to_jclass(klass);
 197   };
 198   jclass jni_class() { return _jc; }
 199 };
 200 
 201 class JvmtiMethodEventMark : public JvmtiThreadEventMark {
 202 private:
 203   jmethodID _mid;
 204 
 205 public:
 206   JvmtiMethodEventMark(JavaThread *thread, methodHandle method) :
 207     JvmtiThreadEventMark(thread),
 208     _mid(to_jmethodID(method)) {};
 209   jmethodID jni_methodID() { return _mid; }
 210 };
 211 
 212 class JvmtiLocationEventMark : public JvmtiMethodEventMark {
 213 private:
 214   jlocation _loc;
 215 
 216 public:
 217   JvmtiLocationEventMark(JavaThread *thread, methodHandle method, address location) :
 218     JvmtiMethodEventMark(thread, method),
 219     _loc(location - method->code_base()) {};
 220   jlocation location() { return _loc; }
 221 };
 222 
 223 class JvmtiExceptionEventMark : public JvmtiLocationEventMark {
 224 private:
 225   jobject _exc;
 226 
 227 public:
 228   JvmtiExceptionEventMark(JavaThread *thread, methodHandle method, address location, Handle exception) :
 229     JvmtiLocationEventMark(thread, method, location),
 230     _exc(to_jobject(exception())) {};
 231   jobject exception() { return _exc; }
 232 };
 233 
 234 class JvmtiClassFileLoadEventMark : public JvmtiThreadEventMark {
 235 private:
 236   const char *_class_name;
 237   jobject _jloader;
 238   jobject _protection_domain;
 239   jclass  _class_being_redefined;
 240 
 241 public:
 242   JvmtiClassFileLoadEventMark(JavaThread *thread, symbolHandle name,
 243      Handle class_loader, Handle prot_domain, KlassHandle *class_being_redefined) : JvmtiThreadEventMark(thread) {
 244       _class_name = name() != NULL? name->as_utf8() : NULL;
 245       _jloader = (jobject)to_jobject(class_loader());
 246       _protection_domain = (jobject)to_jobject(prot_domain());
 247       if (class_being_redefined == NULL) {
 248         _class_being_redefined = NULL;
 249       } else {
 250         _class_being_redefined = (jclass)to_jclass((*class_being_redefined)());
 251       }
 252   };
 253   const char *class_name() {
 254     return _class_name;
 255   }
 256   jobject jloader() {
 257     return _jloader;
 258   }
 259   jobject protection_domain() {
 260     return _protection_domain;
 261   }
 262   jclass class_being_redefined() {
 263     return _class_being_redefined;
 264   }
 265 };
 266 
 267 //////////////////////////////////////////////////////////////////////////////
 268 
 269 int               JvmtiExport::_field_access_count                        = 0;
 270 int               JvmtiExport::_field_modification_count                  = 0;
 271 
 272 bool              JvmtiExport::_can_access_local_variables                = false;
 273 bool              JvmtiExport::_can_examine_or_deopt_anywhere             = false;
 274 bool              JvmtiExport::_can_hotswap_or_post_breakpoint            = false;
 275 bool              JvmtiExport::_can_modify_any_class                      = false;
 276 bool              JvmtiExport::_can_walk_any_space                        = false;
 277 
 278 bool              JvmtiExport::_has_redefined_a_class                     = false;
 279 bool              JvmtiExport::_all_dependencies_are_recorded             = false;
 280 
 281 //
 282 // field access management
 283 //
 284 
 285 // interpreter generator needs the address of the counter
 286 address JvmtiExport::get_field_access_count_addr() {
 287   // We don't grab a lock because we don't want to
 288   // serialize field access between all threads. This means that a
 289   // thread on another processor can see the wrong count value and
 290   // may either miss making a needed call into post_field_access()
 291   // or will make an unneeded call into post_field_access(). We pay
 292   // this price to avoid slowing down the VM when we aren't watching
 293   // field accesses.
 294   // Other access/mutation safe by virtue of being in VM state.
 295   return (address)(&_field_access_count);
 296 }
 297 
 298 //
 299 // field modification management
 300 //
 301 
 302 // interpreter generator needs the address of the counter
 303 address JvmtiExport::get_field_modification_count_addr() {
 304   // We don't grab a lock because we don't
 305   // want to serialize field modification between all threads. This
 306   // means that a thread on another processor can see the wrong
 307   // count value and may either miss making a needed call into
 308   // post_field_modification() or will make an unneeded call into
 309   // post_field_modification(). We pay this price to avoid slowing
 310   // down the VM when we aren't watching field modifications.
 311   // Other access/mutation safe by virtue of being in VM state.
 312   return (address)(&_field_modification_count);
 313 }
 314 
 315 
 316 ///////////////////////////////////////////////////////////////
 317 // Functions needed by java.lang.instrument for starting up javaagent.
 318 ///////////////////////////////////////////////////////////////
 319 
 320 jint
 321 JvmtiExport::get_jvmti_interface(JavaVM *jvm, void **penv, jint version) {
 322   // The JVMTI_VERSION_INTERFACE_JVMTI part of the version number
 323   // has already been validated in JNI GetEnv().
 324   int major, minor, micro;
 325 
 326   // micro version doesn't matter here (yet?)
 327   decode_version_values(version, &major, &minor, &micro);
 328   switch (major) {
 329   case 1:
 330       switch (minor) {
 331       case 0:  // version 1.0.<micro> is recognized
 332       case 1:  // version 1.1.<micro> is recognized
 333           break;
 334 
 335       default:
 336           return JNI_EVERSION;  // unsupported minor version number
 337       }
 338       break;
 339 
 340   default:
 341       return JNI_EVERSION;  // unsupported major version number
 342   }
 343 
 344   if (JvmtiEnv::get_phase() == JVMTI_PHASE_LIVE) {
 345     JavaThread* current_thread = (JavaThread*) ThreadLocalStorage::thread();
 346     // transition code: native to VM
 347     ThreadInVMfromNative __tiv(current_thread);
 348     __ENTRY(jvmtiEnv*, JvmtiExport::get_jvmti_interface, current_thread)
 349     debug_only(VMNativeEntryWrapper __vew;)
 350 
 351     JvmtiEnv *jvmti_env = JvmtiEnv::create_a_jvmti(version);
 352     *penv = jvmti_env->jvmti_external();  // actual type is jvmtiEnv* -- not to be confused with JvmtiEnv*
 353     return JNI_OK;
 354 
 355   } else if (JvmtiEnv::get_phase() == JVMTI_PHASE_ONLOAD) {
 356     // not live, no thread to transition
 357     JvmtiEnv *jvmti_env = JvmtiEnv::create_a_jvmti(version);
 358     *penv = jvmti_env->jvmti_external();  // actual type is jvmtiEnv* -- not to be confused with JvmtiEnv*
 359     return JNI_OK;
 360 
 361   } else {
 362     // Called at the wrong time
 363     *penv = NULL;
 364     return JNI_EDETACHED;
 365   }
 366 }
 367 
 368 
 369 void
 370 JvmtiExport::decode_version_values(jint version, int * major, int * minor,
 371                                    int * micro) {
 372   *major = (version & JVMTI_VERSION_MASK_MAJOR) >> JVMTI_VERSION_SHIFT_MAJOR;
 373   *minor = (version & JVMTI_VERSION_MASK_MINOR) >> JVMTI_VERSION_SHIFT_MINOR;
 374   *micro = (version & JVMTI_VERSION_MASK_MICRO) >> JVMTI_VERSION_SHIFT_MICRO;
 375 }
 376 
 377 void JvmtiExport::enter_primordial_phase() {
 378   JvmtiEnvBase::set_phase(JVMTI_PHASE_PRIMORDIAL);
 379 }
 380 
 381 void JvmtiExport::enter_start_phase() {
 382   JvmtiManageCapabilities::recompute_always_capabilities();
 383   JvmtiEnvBase::set_phase(JVMTI_PHASE_START);
 384 }
 385 
 386 void JvmtiExport::enter_onload_phase() {
 387   JvmtiEnvBase::set_phase(JVMTI_PHASE_ONLOAD);
 388 }
 389 
 390 void JvmtiExport::enter_live_phase() {
 391   JvmtiEnvBase::set_phase(JVMTI_PHASE_LIVE);
 392 }
 393 
 394 //
 395 // JVMTI events that the VM posts to the debugger and also startup agent
 396 // and call the agent's premain() for java.lang.instrument.
 397 //
 398 
 399 void JvmtiExport::post_vm_start() {
 400   EVT_TRIG_TRACE(JVMTI_EVENT_VM_START, ("JVMTI Trg VM start event triggered" ));
 401 
 402   // can now enable some events
 403   JvmtiEventController::vm_start();
 404 
 405   JvmtiEnvIterator it;
 406   for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
 407     if (env->is_enabled(JVMTI_EVENT_VM_START)) {
 408       EVT_TRACE(JVMTI_EVENT_VM_START, ("JVMTI Evt VM start event sent" ));
 409 
 410       JavaThread *thread  = JavaThread::current();
 411       JvmtiThreadEventMark jem(thread);
 412       JvmtiJavaThreadEventTransition jet(thread);
 413       jvmtiEventVMStart callback = env->callbacks()->VMStart;
 414       if (callback != NULL) {
 415         (*callback)(env->jvmti_external(), jem.jni_env());
 416       }
 417     }
 418   }
 419 }
 420 
 421 
 422 void JvmtiExport::post_vm_initialized() {
 423   EVT_TRIG_TRACE(JVMTI_EVENT_VM_INIT, ("JVMTI Trg VM init event triggered" ));
 424 
 425   // can now enable events
 426   JvmtiEventController::vm_init();
 427 
 428   JvmtiEnvIterator it;
 429   for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
 430     if (env->is_enabled(JVMTI_EVENT_VM_INIT)) {
 431       EVT_TRACE(JVMTI_EVENT_VM_INIT, ("JVMTI Evt VM init event sent" ));
 432 
 433       JavaThread *thread  = JavaThread::current();
 434       JvmtiThreadEventMark jem(thread);
 435       JvmtiJavaThreadEventTransition jet(thread);
 436       jvmtiEventVMInit callback = env->callbacks()->VMInit;
 437       if (callback != NULL) {
 438         (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread());
 439       }
 440     }
 441   }
 442 }
 443 
 444 
 445 void JvmtiExport::post_vm_death() {
 446   EVT_TRIG_TRACE(JVMTI_EVENT_VM_DEATH, ("JVMTI Trg VM death event triggered" ));
 447 
 448   JvmtiEnvIterator it;
 449   for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
 450     if (env->is_enabled(JVMTI_EVENT_VM_DEATH)) {
 451       EVT_TRACE(JVMTI_EVENT_VM_DEATH, ("JVMTI Evt VM death event sent" ));
 452 
 453       JavaThread *thread  = JavaThread::current();
 454       JvmtiEventMark jem(thread);
 455       JvmtiJavaThreadEventTransition jet(thread);
 456       jvmtiEventVMDeath callback = env->callbacks()->VMDeath;
 457       if (callback != NULL) {
 458         (*callback)(env->jvmti_external(), jem.jni_env());
 459       }
 460     }
 461   }
 462 
 463   JvmtiEnvBase::set_phase(JVMTI_PHASE_DEAD);
 464   JvmtiEventController::vm_death();
 465 }
 466 
 467 char**
 468 JvmtiExport::get_all_native_method_prefixes(int* count_ptr) {
 469   // Have to grab JVMTI thread state lock to be sure environment doesn't
 470   // go away while we iterate them.  No locks during VM bring-up.
 471   if (Threads::number_of_threads() == 0 || SafepointSynchronize::is_at_safepoint()) {
 472     return JvmtiEnvBase::get_all_native_method_prefixes(count_ptr);
 473   } else {
 474     MutexLocker mu(JvmtiThreadState_lock);
 475     return JvmtiEnvBase::get_all_native_method_prefixes(count_ptr);
 476   }
 477 }
 478 
 479 class JvmtiClassFileLoadHookPoster : public StackObj {
 480  private:
 481   symbolHandle         _h_name;
 482   Handle               _class_loader;
 483   Handle               _h_protection_domain;
 484   unsigned char **     _data_ptr;
 485   unsigned char **     _end_ptr;
 486   JavaThread *         _thread;
 487   jint                 _curr_len;
 488   unsigned char *      _curr_data;
 489   JvmtiEnv *           _curr_env;
 490   jint *               _cached_length_ptr;
 491   unsigned char **     _cached_data_ptr;
 492   JvmtiThreadState *   _state;
 493   KlassHandle *        _h_class_being_redefined;
 494   JvmtiClassLoadKind   _load_kind;
 495 
 496  public:
 497   inline JvmtiClassFileLoadHookPoster(symbolHandle h_name, Handle class_loader,
 498                                       Handle h_protection_domain,
 499                                       unsigned char **data_ptr, unsigned char **end_ptr,
 500                                       unsigned char **cached_data_ptr,
 501                                       jint *cached_length_ptr) {
 502     _h_name = h_name;
 503     _class_loader = class_loader;
 504     _h_protection_domain = h_protection_domain;
 505     _data_ptr = data_ptr;
 506     _end_ptr = end_ptr;
 507     _thread = JavaThread::current();
 508     _curr_len = *end_ptr - *data_ptr;
 509     _curr_data = *data_ptr;
 510     _curr_env = NULL;
 511     _cached_length_ptr = cached_length_ptr;
 512     _cached_data_ptr = cached_data_ptr;
 513     *_cached_length_ptr = 0;
 514     *_cached_data_ptr = NULL;
 515 
 516     _state = _thread->jvmti_thread_state();
 517     if (_state != NULL) {
 518       _h_class_being_redefined = _state->get_class_being_redefined();
 519       _load_kind = _state->get_class_load_kind();
 520       // Clear class_being_redefined flag here. The action
 521       // from agent handler could generate a new class file load
 522       // hook event and if it is not cleared the new event generated
 523       // from regular class file load could have this stale redefined
 524       // class handle info.
 525       _state->clear_class_being_redefined();
 526     } else {
 527       // redefine and retransform will always set the thread state
 528       _h_class_being_redefined = (KlassHandle *) NULL;
 529       _load_kind = jvmti_class_load_kind_load;
 530     }
 531   }
 532 
 533   void post() {
 534 //    EVT_TRIG_TRACE(JVMTI_EVENT_CLASS_FILE_LOAD_HOOK,
 535 //                   ("JVMTI [%s] class file load hook event triggered",
 536 //                    JvmtiTrace::safe_get_thread_name(_thread)));
 537     post_all_envs();
 538     copy_modified_data();
 539   }
 540 
 541  private:
 542   void post_all_envs() {
 543     if (_load_kind != jvmti_class_load_kind_retransform) {
 544       // for class load and redefine,
 545       // call the non-retransformable agents
 546       JvmtiEnvIterator it;
 547       for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
 548         if (!env->is_retransformable() && env->is_enabled(JVMTI_EVENT_CLASS_FILE_LOAD_HOOK)) {
 549           // non-retransformable agents cannot retransform back,
 550           // so no need to cache the original class file bytes
 551           post_to_env(env, false);
 552         }
 553       }
 554     }
 555     JvmtiEnvIterator it;
 556     for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
 557       // retransformable agents get all events
 558       if (env->is_retransformable() && env->is_enabled(JVMTI_EVENT_CLASS_FILE_LOAD_HOOK)) {
 559         // retransformable agents need to cache the original class file
 560         // bytes if changes are made via the ClassFileLoadHook
 561         post_to_env(env, true);
 562       }
 563     }
 564   }
 565 
 566   void post_to_env(JvmtiEnv* env, bool caching_needed) {
 567     unsigned char *new_data = NULL;
 568     jint new_len = 0;
 569 //    EVT_TRACE(JVMTI_EVENT_CLASS_FILE_LOAD_HOOK,
 570 //     ("JVMTI [%s] class file load hook event sent %s  data_ptr = %d, data_len = %d",
 571 //               JvmtiTrace::safe_get_thread_name(_thread),
 572 //               _h_name.is_null() ? "NULL" : _h_name->as_utf8(),
 573 //               _curr_data, _curr_len ));
 574     JvmtiClassFileLoadEventMark jem(_thread, _h_name, _class_loader,
 575                                     _h_protection_domain,
 576                                     _h_class_being_redefined);
 577     JvmtiJavaThreadEventTransition jet(_thread);
 578     JNIEnv* jni_env =  (JvmtiEnv::get_phase() == JVMTI_PHASE_PRIMORDIAL)?
 579                                                         NULL : jem.jni_env();
 580     jvmtiEventClassFileLoadHook callback = env->callbacks()->ClassFileLoadHook;
 581     if (callback != NULL) {
 582       (*callback)(env->jvmti_external(), jni_env,
 583                   jem.class_being_redefined(),
 584                   jem.jloader(), jem.class_name(),
 585                   jem.protection_domain(),
 586                   _curr_len, _curr_data,
 587                   &new_len, &new_data);
 588     }
 589     if (new_data != NULL) {
 590       // this agent has modified class data.
 591       if (caching_needed && *_cached_data_ptr == NULL) {
 592         // data has been changed by the new retransformable agent
 593         // and it hasn't already been cached, cache it
 594         *_cached_data_ptr = (unsigned char *)os::malloc(_curr_len);
 595         memcpy(*_cached_data_ptr, _curr_data, _curr_len);
 596         *_cached_length_ptr = _curr_len;
 597       }
 598 
 599       if (_curr_data != *_data_ptr) {
 600         // curr_data is previous agent modified class data.
 601         // And this has been changed by the new agent so
 602         // we can delete it now.
 603         _curr_env->Deallocate(_curr_data);
 604       }
 605 
 606       // Class file data has changed by the current agent.
 607       _curr_data = new_data;
 608       _curr_len = new_len;
 609       // Save the current agent env we need this to deallocate the
 610       // memory allocated by this agent.
 611       _curr_env = env;
 612     }
 613   }
 614 
 615   void copy_modified_data() {
 616     // if one of the agent has modified class file data.
 617     // Copy modified class data to new resources array.
 618     if (_curr_data != *_data_ptr) {
 619       *_data_ptr = NEW_RESOURCE_ARRAY(u1, _curr_len);
 620       memcpy(*_data_ptr, _curr_data, _curr_len);
 621       *_end_ptr = *_data_ptr + _curr_len;
 622       _curr_env->Deallocate(_curr_data);
 623     }
 624   }
 625 };
 626 
 627 bool JvmtiExport::_should_post_class_file_load_hook = false;
 628 
 629 // this entry is for class file load hook on class load, redefine and retransform
 630 void JvmtiExport::post_class_file_load_hook(symbolHandle h_name,
 631                                             Handle class_loader,
 632                                             Handle h_protection_domain,
 633                                             unsigned char **data_ptr,
 634                                             unsigned char **end_ptr,
 635                                             unsigned char **cached_data_ptr,
 636                                             jint *cached_length_ptr) {
 637   JvmtiClassFileLoadHookPoster poster(h_name, class_loader,
 638                                       h_protection_domain,
 639                                       data_ptr, end_ptr,
 640                                       cached_data_ptr,
 641                                       cached_length_ptr);
 642   poster.post();
 643 }
 644 
 645 void JvmtiExport::report_unsupported(bool on) {
 646   // If any JVMTI service is turned on, we need to exit before native code
 647   // tries to access nonexistant services.
 648   if (on) {
 649     vm_exit_during_initialization("Java Kernel does not support JVMTI.");
 650   }
 651 }
 652 
 653 
 654 #ifndef JVMTI_KERNEL
 655 static inline klassOop oop_to_klassOop(oop obj) {
 656   klassOop k = obj->klass();
 657 
 658   // if the object is a java.lang.Class then return the java mirror
 659   if (k == SystemDictionary::class_klass()) {
 660     if (!java_lang_Class::is_primitive(obj)) {
 661       k = java_lang_Class::as_klassOop(obj);
 662       assert(k != NULL, "class for non-primitive mirror must exist");
 663     }
 664   }
 665   return k;
 666 }
 667 
 668 class JvmtiVMObjectAllocEventMark : public JvmtiClassEventMark  {
 669  private:
 670    jobject _jobj;
 671    jlong    _size;
 672  public:
 673    JvmtiVMObjectAllocEventMark(JavaThread *thread, oop obj) : JvmtiClassEventMark(thread, oop_to_klassOop(obj)) {
 674      _jobj = (jobject)to_jobject(obj);
 675      _size = obj->size() * wordSize;
 676    };
 677    jobject jni_jobject() { return _jobj; }
 678    jlong size() { return _size; }
 679 };
 680 
 681 class JvmtiCompiledMethodLoadEventMark : public JvmtiMethodEventMark {
 682  private:
 683   jint _code_size;
 684   const void *_code_data;
 685   jint _map_length;
 686   jvmtiAddrLocationMap *_map;
 687   const void *_compile_info;
 688  public:
 689   JvmtiCompiledMethodLoadEventMark(JavaThread *thread, nmethod *nm, void* compile_info_ptr = NULL)
 690           : JvmtiMethodEventMark(thread,methodHandle(thread, nm->method())) {
 691     _code_data = nm->code_begin();
 692     _code_size = nm->code_size();
 693     _compile_info = compile_info_ptr; // Set void pointer of compiledMethodLoad Event. Default value is NULL.
 694     JvmtiCodeBlobEvents::build_jvmti_addr_location_map(nm, &_map, &_map_length);
 695   }
 696   ~JvmtiCompiledMethodLoadEventMark() {
 697      FREE_C_HEAP_ARRAY(jvmtiAddrLocationMap, _map);
 698   }
 699 
 700   jint code_size() { return _code_size; }
 701   const void *code_data() { return _code_data; }
 702   jint map_length() { return _map_length; }
 703   const jvmtiAddrLocationMap* map() { return _map; }
 704   const void *compile_info() { return _compile_info; }
 705 };
 706 
 707 
 708 
 709 class JvmtiMonitorEventMark : public JvmtiThreadEventMark {
 710 private:
 711   jobject _jobj;
 712 public:
 713   JvmtiMonitorEventMark(JavaThread *thread, oop object)
 714           : JvmtiThreadEventMark(thread){
 715      _jobj = to_jobject(object);
 716   }
 717   jobject jni_object() { return _jobj; }
 718 };
 719 
 720 ///////////////////////////////////////////////////////////////
 721 //
 722 // pending CompiledMethodUnload support
 723 //
 724 
 725 bool JvmtiExport::_have_pending_compiled_method_unload_events;
 726 GrowableArray<jmethodID>* JvmtiExport::_pending_compiled_method_unload_method_ids;
 727 GrowableArray<const void *>* JvmtiExport::_pending_compiled_method_unload_code_begins;
 728 JavaThread* JvmtiExport::_current_poster;
 729 
 730 // post any pending CompiledMethodUnload events
 731 
 732 void JvmtiExport::post_pending_compiled_method_unload_events() {
 733   JavaThread* self = JavaThread::current();
 734   assert(!self->owns_locks(), "can't hold locks");
 735 
 736   // Indicates if this is the first activiation of this function.
 737   // In theory the profiler's callback could call back into VM and provoke
 738   // another CompiledMethodLoad event to be posted from this thread. As the
 739   // stack rewinds we need to ensure that the original activation does the
 740   // completion and notifies any waiters.
 741   bool first_activation = false;
 742 
 743   // the jmethodID (may not be valid) to be used for a single event
 744   jmethodID method;
 745   const void *code_begin;
 746 
 747   // grab the monitor and check if another thread is already posting
 748   // events. If there is another thread posting events then we wait
 749   // until it completes. (In theory we could check the pending events to
 750   // see if any of the addresses overlap with the event that we want to
 751   // post but as it will happen so rarely we just block any thread waiting
 752   // to post a CompiledMethodLoad or DynamicCodeGenerated event until all
 753   // pending CompiledMethodUnload events have been posted).
 754   //
 755   // If another thread isn't posting we examine the list of pending jmethodIDs.
 756   // If the list is empty then we are done. If it's not empty then this thread
 757   // (self) becomes the pending event poster and we remove the top (last)
 758   // event from the list. Note that this means we remove the newest event first
 759   // but as they are all CompiledMethodUnload events the order doesn't matter.
 760   // Once we have removed a jmethodID then we exit the monitor. Any other thread
 761   // wanting to post a CompiledMethodLoad or DynamicCodeGenerated event will
 762   // be forced to wait on the monitor.
 763   {
 764     MutexLocker mu(JvmtiPendingEvent_lock);
 765     if (_current_poster != self) {
 766       while (_current_poster != NULL) {
 767         JvmtiPendingEvent_lock->wait();
 768       }
 769     }
 770     if ((_pending_compiled_method_unload_method_ids == NULL) ||
 771         (_pending_compiled_method_unload_method_ids->length() == 0)) {
 772       return;
 773     }
 774     if (_current_poster == NULL) {
 775       _current_poster = self;
 776       first_activation = true;
 777     } else {
 778       // re-entrant
 779       guarantee(_current_poster == self, "checking");
 780     }
 781     method = _pending_compiled_method_unload_method_ids->pop();
 782     code_begin = _pending_compiled_method_unload_code_begins->pop();
 783   }
 784 
 785   // This thread is the pending event poster so it first posts the CompiledMethodUnload
 786   // event for the jmethodID that has been removed from the list. Once posted it
 787   // re-grabs the monitor and checks the list again. If the list is empty then and this
 788   // is the first activation of the function then we reset the _have_pending_events
 789   // flag, cleanup _current_poster to indicate that no thread is now servicing the
 790   // pending events list, and finally notify any thread that might be waiting.
 791   for (;;) {
 792     EVT_TRIG_TRACE(JVMTI_EVENT_COMPILED_METHOD_UNLOAD,
 793                    ("JVMTI [%s] method compile unload event triggered",
 794                    JvmtiTrace::safe_get_thread_name(self)));
 795 
 796     // post the event for each environment that has this event enabled.
 797     JvmtiEnvIterator it;
 798     for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
 799       if (env->is_enabled(JVMTI_EVENT_COMPILED_METHOD_UNLOAD)) {
 800         EVT_TRACE(JVMTI_EVENT_COMPILED_METHOD_UNLOAD,
 801                   ("JVMTI [%s] class compile method unload event sent jmethodID " PTR_FORMAT,
 802                   JvmtiTrace::safe_get_thread_name(self), method));
 803 
 804         JvmtiEventMark jem(self);
 805         JvmtiJavaThreadEventTransition jet(self);
 806         jvmtiEventCompiledMethodUnload callback = env->callbacks()->CompiledMethodUnload;
 807         if (callback != NULL) {
 808           (*callback)(env->jvmti_external(), method, code_begin);
 809         }
 810       }
 811     }
 812 
 813     // event posted, now re-grab monitor and get the next event
 814     // If there's no next event then we are done. If this is the first
 815     // activiation of this function by this thread notify any waiters
 816     // so that they can post.
 817     {
 818       MutexLocker ml(JvmtiPendingEvent_lock);
 819       if (_pending_compiled_method_unload_method_ids->length() == 0) {
 820         if (first_activation) {
 821           _have_pending_compiled_method_unload_events = false;
 822           _current_poster = NULL;
 823           JvmtiPendingEvent_lock->notify_all();
 824         }
 825         return;
 826       }
 827       method = _pending_compiled_method_unload_method_ids->pop();
 828       code_begin = _pending_compiled_method_unload_code_begins->pop();
 829     }
 830   }
 831 }
 832 
 833 ///////////////////////////////////////////////////////////////
 834 //
 835 // JvmtiExport
 836 //
 837 
 838 void JvmtiExport::post_raw_breakpoint(JavaThread *thread, methodOop method, address location) {
 839   HandleMark hm(thread);
 840   methodHandle mh(thread, method);
 841 
 842   JvmtiThreadState *state = thread->jvmti_thread_state();
 843   if (state == NULL) {
 844     return;
 845   }
 846   EVT_TRIG_TRACE(JVMTI_EVENT_BREAKPOINT, ("JVMTI [%s] Trg Breakpoint triggered",
 847                       JvmtiTrace::safe_get_thread_name(thread)));
 848   JvmtiEnvThreadStateIterator it(state);
 849   for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
 850     ets->compare_and_set_current_location(mh(), location, JVMTI_EVENT_BREAKPOINT);
 851     if (!ets->breakpoint_posted() && ets->is_enabled(JVMTI_EVENT_BREAKPOINT)) {
 852       ThreadState old_os_state = thread->osthread()->get_state();
 853       thread->osthread()->set_state(BREAKPOINTED);
 854       EVT_TRACE(JVMTI_EVENT_BREAKPOINT, ("JVMTI [%s] Evt Breakpoint sent %s.%s @ %d",
 855                      JvmtiTrace::safe_get_thread_name(thread),
 856                      (mh() == NULL) ? "NULL" : mh()->klass_name()->as_C_string(),
 857                      (mh() == NULL) ? "NULL" : mh()->name()->as_C_string(),
 858                      location - mh()->code_base() ));
 859 
 860       JvmtiEnv *env = ets->get_env();
 861       JvmtiLocationEventMark jem(thread, mh, location);
 862       JvmtiJavaThreadEventTransition jet(thread);
 863       jvmtiEventBreakpoint callback = env->callbacks()->Breakpoint;
 864       if (callback != NULL) {
 865         (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(),
 866                     jem.jni_methodID(), jem.location());
 867       }
 868 
 869       ets->set_breakpoint_posted();
 870       thread->osthread()->set_state(old_os_state);
 871     }
 872   }
 873 }
 874 
 875 //////////////////////////////////////////////////////////////////////////////
 876 
 877 bool              JvmtiExport::_can_get_source_debug_extension            = false;
 878 bool              JvmtiExport::_can_maintain_original_method_order        = false;
 879 bool              JvmtiExport::_can_post_interpreter_events               = false;
 880 bool              JvmtiExport::_can_post_exceptions                       = false;
 881 bool              JvmtiExport::_can_post_breakpoint                       = false;
 882 bool              JvmtiExport::_can_post_field_access                     = false;
 883 bool              JvmtiExport::_can_post_field_modification               = false;
 884 bool              JvmtiExport::_can_post_method_entry                     = false;
 885 bool              JvmtiExport::_can_post_method_exit                      = false;
 886 bool              JvmtiExport::_can_pop_frame                             = false;
 887 bool              JvmtiExport::_can_force_early_return                    = false;
 888 
 889 bool              JvmtiExport::_should_post_single_step                   = false;
 890 bool              JvmtiExport::_should_post_field_access                  = false;
 891 bool              JvmtiExport::_should_post_field_modification            = false;
 892 bool              JvmtiExport::_should_post_class_load                    = false;
 893 bool              JvmtiExport::_should_post_class_prepare                 = false;
 894 bool              JvmtiExport::_should_post_class_unload                  = false;
 895 bool              JvmtiExport::_should_post_thread_life                   = false;
 896 bool              JvmtiExport::_should_clean_up_heap_objects              = false;
 897 bool              JvmtiExport::_should_post_native_method_bind            = false;
 898 bool              JvmtiExport::_should_post_dynamic_code_generated        = false;
 899 bool              JvmtiExport::_should_post_data_dump                     = false;
 900 bool              JvmtiExport::_should_post_compiled_method_load          = false;
 901 bool              JvmtiExport::_should_post_compiled_method_unload        = false;
 902 bool              JvmtiExport::_should_post_monitor_contended_enter       = false;
 903 bool              JvmtiExport::_should_post_monitor_contended_entered     = false;
 904 bool              JvmtiExport::_should_post_monitor_wait                  = false;
 905 bool              JvmtiExport::_should_post_monitor_waited                = false;
 906 bool              JvmtiExport::_should_post_garbage_collection_start      = false;
 907 bool              JvmtiExport::_should_post_garbage_collection_finish     = false;
 908 bool              JvmtiExport::_should_post_object_free                   = false;
 909 bool              JvmtiExport::_should_post_resource_exhausted            = false;
 910 bool              JvmtiExport::_should_post_vm_object_alloc               = false;
 911 
 912 ////////////////////////////////////////////////////////////////////////////////////////////////
 913 
 914 
 915 //
 916 // JVMTI single step management
 917 //
 918 void JvmtiExport::at_single_stepping_point(JavaThread *thread, methodOop method, address location) {
 919   assert(JvmtiExport::should_post_single_step(), "must be single stepping");
 920 
 921   HandleMark hm(thread);
 922   methodHandle mh(thread, method);
 923 
 924   // update information about current location and post a step event
 925   JvmtiThreadState *state = thread->jvmti_thread_state();
 926   if (state == NULL) {
 927     return;
 928   }
 929   EVT_TRIG_TRACE(JVMTI_EVENT_SINGLE_STEP, ("JVMTI [%s] Trg Single Step triggered",
 930                       JvmtiTrace::safe_get_thread_name(thread)));
 931   if (!state->hide_single_stepping()) {
 932     if (state->is_pending_step_for_popframe()) {
 933       state->process_pending_step_for_popframe();
 934     }
 935     if (state->is_pending_step_for_earlyret()) {
 936       state->process_pending_step_for_earlyret();
 937     }
 938     JvmtiExport::post_single_step(thread, mh(), location);
 939   }
 940 }
 941 
 942 
 943 void JvmtiExport::expose_single_stepping(JavaThread *thread) {
 944   JvmtiThreadState *state = thread->jvmti_thread_state();
 945   if (state != NULL) {
 946     state->clear_hide_single_stepping();
 947   }
 948 }
 949 
 950 
 951 bool JvmtiExport::hide_single_stepping(JavaThread *thread) {
 952   JvmtiThreadState *state = thread->jvmti_thread_state();
 953   if (state != NULL && state->is_enabled(JVMTI_EVENT_SINGLE_STEP)) {
 954     state->set_hide_single_stepping();
 955     return true;
 956   } else {
 957     return false;
 958   }
 959 }
 960 
 961 void JvmtiExport::post_class_load(JavaThread *thread, klassOop klass) {
 962   HandleMark hm(thread);
 963   KlassHandle kh(thread, klass);
 964 
 965   EVT_TRIG_TRACE(JVMTI_EVENT_CLASS_LOAD, ("JVMTI [%s] Trg Class Load triggered",
 966                       JvmtiTrace::safe_get_thread_name(thread)));
 967   JvmtiThreadState* state = thread->jvmti_thread_state();
 968   if (state == NULL) {
 969     return;
 970   }
 971   JvmtiEnvThreadStateIterator it(state);
 972   for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
 973     if (ets->is_enabled(JVMTI_EVENT_CLASS_LOAD)) {
 974       EVT_TRACE(JVMTI_EVENT_CLASS_LOAD, ("JVMTI [%s] Evt Class Load sent %s",
 975                                          JvmtiTrace::safe_get_thread_name(thread),
 976                                          kh()==NULL? "NULL" : Klass::cast(kh())->external_name() ));
 977 
 978       JvmtiEnv *env = ets->get_env();
 979       JvmtiClassEventMark jem(thread, kh());
 980       JvmtiJavaThreadEventTransition jet(thread);
 981       jvmtiEventClassLoad callback = env->callbacks()->ClassLoad;
 982       if (callback != NULL) {
 983         (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), jem.jni_class());
 984       }
 985     }
 986   }
 987 }
 988 
 989 
 990 void JvmtiExport::post_class_prepare(JavaThread *thread, klassOop klass) {
 991   HandleMark hm(thread);
 992   KlassHandle kh(thread, klass);
 993 
 994   EVT_TRIG_TRACE(JVMTI_EVENT_CLASS_PREPARE, ("JVMTI [%s] Trg Class Prepare triggered",
 995                       JvmtiTrace::safe_get_thread_name(thread)));
 996   JvmtiThreadState* state = thread->jvmti_thread_state();
 997   if (state == NULL) {
 998     return;
 999   }
1000   JvmtiEnvThreadStateIterator it(state);
1001   for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
1002     if (ets->is_enabled(JVMTI_EVENT_CLASS_PREPARE)) {
1003       EVT_TRACE(JVMTI_EVENT_CLASS_PREPARE, ("JVMTI [%s] Evt Class Prepare sent %s",
1004                                             JvmtiTrace::safe_get_thread_name(thread),
1005                                             kh()==NULL? "NULL" : Klass::cast(kh())->external_name() ));
1006 
1007       JvmtiEnv *env = ets->get_env();
1008       JvmtiClassEventMark jem(thread, kh());
1009       JvmtiJavaThreadEventTransition jet(thread);
1010       jvmtiEventClassPrepare callback = env->callbacks()->ClassPrepare;
1011       if (callback != NULL) {
1012         (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), jem.jni_class());
1013       }
1014     }
1015   }
1016 }
1017 
1018 void JvmtiExport::post_class_unload(klassOop klass) {
1019   Thread *thread = Thread::current();
1020   HandleMark hm(thread);
1021   KlassHandle kh(thread, klass);
1022 
1023   EVT_TRIG_TRACE(EXT_EVENT_CLASS_UNLOAD, ("JVMTI [?] Trg Class Unload triggered" ));
1024   if (JvmtiEventController::is_enabled((jvmtiEvent)EXT_EVENT_CLASS_UNLOAD)) {
1025     assert(thread->is_VM_thread(), "wrong thread");
1026 
1027     // get JavaThread for whom we are proxy
1028     JavaThread *real_thread =
1029         (JavaThread *)((VMThread *)thread)->vm_operation()->calling_thread();
1030 
1031     JvmtiEnvIterator it;
1032     for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
1033       if (env->is_enabled((jvmtiEvent)EXT_EVENT_CLASS_UNLOAD)) {
1034         EVT_TRACE(EXT_EVENT_CLASS_UNLOAD, ("JVMTI [?] Evt Class Unload sent %s",
1035                   kh()==NULL? "NULL" : Klass::cast(kh())->external_name() ));
1036 
1037         // do everything manually, since this is a proxy - needs special care
1038         JNIEnv* jni_env = real_thread->jni_environment();
1039         jthread jt = (jthread)JNIHandles::make_local(real_thread, real_thread->threadObj());
1040         jclass jk = (jclass)JNIHandles::make_local(real_thread, Klass::cast(kh())->java_mirror());
1041 
1042         // Before we call the JVMTI agent, we have to set the state in the
1043         // thread for which we are proxying.
1044         JavaThreadState prev_state = real_thread->thread_state();
1045         assert(prev_state == _thread_blocked, "JavaThread should be at safepoint");
1046         real_thread->set_thread_state(_thread_in_native);
1047 
1048         jvmtiExtensionEvent callback = env->ext_callbacks()->ClassUnload;
1049         if (callback != NULL) {
1050           (*callback)(env->jvmti_external(), jni_env, jt, jk);
1051         }
1052 
1053         assert(real_thread->thread_state() == _thread_in_native,
1054                "JavaThread should be in native");
1055         real_thread->set_thread_state(prev_state);
1056 
1057         JNIHandles::destroy_local(jk);
1058         JNIHandles::destroy_local(jt);
1059       }
1060     }
1061   }
1062 }
1063 
1064 
1065 void JvmtiExport::post_thread_start(JavaThread *thread) {
1066   assert(thread->thread_state() == _thread_in_vm, "must be in vm state");
1067 
1068   EVT_TRIG_TRACE(JVMTI_EVENT_THREAD_START, ("JVMTI [%s] Trg Thread Start event triggered",
1069                       JvmtiTrace::safe_get_thread_name(thread)));
1070 
1071   // do JVMTI thread initialization (if needed)
1072   JvmtiEventController::thread_started(thread);
1073 
1074   // Do not post thread start event for hidden java thread.
1075   if (JvmtiEventController::is_enabled(JVMTI_EVENT_THREAD_START) &&
1076       !thread->is_hidden_from_external_view()) {
1077     JvmtiEnvIterator it;
1078     for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
1079       if (env->is_enabled(JVMTI_EVENT_THREAD_START)) {
1080         EVT_TRACE(JVMTI_EVENT_THREAD_START, ("JVMTI [%s] Evt Thread Start event sent",
1081                      JvmtiTrace::safe_get_thread_name(thread) ));
1082 
1083         JvmtiThreadEventMark jem(thread);
1084         JvmtiJavaThreadEventTransition jet(thread);
1085         jvmtiEventThreadStart callback = env->callbacks()->ThreadStart;
1086         if (callback != NULL) {
1087           (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread());
1088         }
1089       }
1090     }
1091   }
1092 }
1093 
1094 
1095 void JvmtiExport::post_thread_end(JavaThread *thread) {
1096   EVT_TRIG_TRACE(JVMTI_EVENT_THREAD_END, ("JVMTI [%s] Trg Thread End event triggered",
1097                       JvmtiTrace::safe_get_thread_name(thread)));
1098 
1099   JvmtiThreadState *state = thread->jvmti_thread_state();
1100   if (state == NULL) {
1101     return;
1102   }
1103 
1104   // Do not post thread end event for hidden java thread.
1105   if (state->is_enabled(JVMTI_EVENT_THREAD_END) &&
1106       !thread->is_hidden_from_external_view()) {
1107 
1108     JvmtiEnvThreadStateIterator it(state);
1109     for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
1110       if (ets->is_enabled(JVMTI_EVENT_THREAD_END)) {
1111         EVT_TRACE(JVMTI_EVENT_THREAD_END, ("JVMTI [%s] Evt Thread End event sent",
1112                      JvmtiTrace::safe_get_thread_name(thread) ));
1113 
1114         JvmtiEnv *env = ets->get_env();
1115         JvmtiThreadEventMark jem(thread);
1116         JvmtiJavaThreadEventTransition jet(thread);
1117         jvmtiEventThreadEnd callback = env->callbacks()->ThreadEnd;
1118         if (callback != NULL) {
1119           (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread());
1120         }
1121       }
1122     }
1123   }
1124 }
1125 
1126 void JvmtiExport::post_object_free(JvmtiEnv* env, jlong tag) {
1127   assert(SafepointSynchronize::is_at_safepoint(), "must be executed at safepoint");
1128   assert(env->is_enabled(JVMTI_EVENT_OBJECT_FREE), "checking");
1129 
1130   EVT_TRIG_TRACE(JVMTI_EVENT_OBJECT_FREE, ("JVMTI [?] Trg Object Free triggered" ));
1131   EVT_TRACE(JVMTI_EVENT_OBJECT_FREE, ("JVMTI [?] Evt Object Free sent"));
1132 
1133   jvmtiEventObjectFree callback = env->callbacks()->ObjectFree;
1134   if (callback != NULL) {
1135     (*callback)(env->jvmti_external(), tag);
1136   }
1137 }
1138 
1139 void JvmtiExport::post_resource_exhausted(jint resource_exhausted_flags, const char* description) {
1140   EVT_TRIG_TRACE(JVMTI_EVENT_RESOURCE_EXHAUSTED, ("JVMTI Trg resource exhausted event triggered" ));
1141 
1142   JvmtiEnvIterator it;
1143   for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
1144     if (env->is_enabled(JVMTI_EVENT_RESOURCE_EXHAUSTED)) {
1145       EVT_TRACE(JVMTI_EVENT_RESOURCE_EXHAUSTED, ("JVMTI Evt resource exhausted event sent" ));
1146 
1147       JavaThread *thread  = JavaThread::current();
1148       JvmtiThreadEventMark jem(thread);
1149       JvmtiJavaThreadEventTransition jet(thread);
1150       jvmtiEventResourceExhausted callback = env->callbacks()->ResourceExhausted;
1151       if (callback != NULL) {
1152         (*callback)(env->jvmti_external(), jem.jni_env(),
1153                     resource_exhausted_flags, NULL, description);
1154       }
1155     }
1156   }
1157 }
1158 
1159 void JvmtiExport::post_method_entry(JavaThread *thread, methodOop method, frame current_frame) {
1160   HandleMark hm(thread);
1161   methodHandle mh(thread, method);
1162 
1163   EVT_TRIG_TRACE(JVMTI_EVENT_METHOD_ENTRY, ("JVMTI [%s] Trg Method Entry triggered %s.%s",
1164                      JvmtiTrace::safe_get_thread_name(thread),
1165                      (mh() == NULL) ? "NULL" : mh()->klass_name()->as_C_string(),
1166                      (mh() == NULL) ? "NULL" : mh()->name()->as_C_string() ));
1167 
1168   JvmtiThreadState* state = thread->jvmti_thread_state();
1169   if (state == NULL || !state->is_interp_only_mode()) {
1170     // for any thread that actually wants method entry, interp_only_mode is set
1171     return;
1172   }
1173 
1174   state->incr_cur_stack_depth();
1175 
1176   if (state->is_enabled(JVMTI_EVENT_METHOD_ENTRY)) {
1177     JvmtiEnvThreadStateIterator it(state);
1178     for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
1179       if (ets->is_enabled(JVMTI_EVENT_METHOD_ENTRY)) {
1180         EVT_TRACE(JVMTI_EVENT_METHOD_ENTRY, ("JVMTI [%s] Evt Method Entry sent %s.%s",
1181                                              JvmtiTrace::safe_get_thread_name(thread),
1182                                              (mh() == NULL) ? "NULL" : mh()->klass_name()->as_C_string(),
1183                                              (mh() == NULL) ? "NULL" : mh()->name()->as_C_string() ));
1184 
1185         JvmtiEnv *env = ets->get_env();
1186         JvmtiMethodEventMark jem(thread, mh);
1187         JvmtiJavaThreadEventTransition jet(thread);
1188         jvmtiEventMethodEntry callback = env->callbacks()->MethodEntry;
1189         if (callback != NULL) {
1190           (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), jem.jni_methodID());
1191         }
1192       }
1193     }
1194   }
1195 }
1196 
1197 void JvmtiExport::post_method_exit(JavaThread *thread, methodOop method, frame current_frame) {
1198   HandleMark hm(thread);
1199   methodHandle mh(thread, method);
1200 
1201   EVT_TRIG_TRACE(JVMTI_EVENT_METHOD_EXIT, ("JVMTI [%s] Trg Method Exit triggered %s.%s",
1202                      JvmtiTrace::safe_get_thread_name(thread),
1203                      (mh() == NULL) ? "NULL" : mh()->klass_name()->as_C_string(),
1204                      (mh() == NULL) ? "NULL" : mh()->name()->as_C_string() ));
1205 
1206   JvmtiThreadState *state = thread->jvmti_thread_state();
1207   if (state == NULL || !state->is_interp_only_mode()) {
1208     // for any thread that actually wants method exit, interp_only_mode is set
1209     return;
1210   }
1211 
1212   // return a flag when a method terminates by throwing an exception
1213   // i.e. if an exception is thrown and it's not caught by the current method
1214   bool exception_exit = state->is_exception_detected() && !state->is_exception_caught();
1215 
1216 
1217   if (state->is_enabled(JVMTI_EVENT_METHOD_EXIT)) {
1218     Handle result;
1219     jvalue value;
1220     value.j = 0L;
1221 
1222     // if the method hasn't been popped because of an exception then we populate
1223     // the return_value parameter for the callback. At this point we only have
1224     // the address of a "raw result" and we just call into the interpreter to
1225     // convert this into a jvalue.
1226     if (!exception_exit) {
1227       oop oop_result;
1228       BasicType type = current_frame.interpreter_frame_result(&oop_result, &value);
1229       if (type == T_OBJECT || type == T_ARRAY) {
1230         result = Handle(thread, oop_result);
1231       }
1232     }
1233 
1234     JvmtiEnvThreadStateIterator it(state);
1235     for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
1236       if (ets->is_enabled(JVMTI_EVENT_METHOD_EXIT)) {
1237         EVT_TRACE(JVMTI_EVENT_METHOD_EXIT, ("JVMTI [%s] Evt Method Exit sent %s.%s",
1238                                             JvmtiTrace::safe_get_thread_name(thread),
1239                                             (mh() == NULL) ? "NULL" : mh()->klass_name()->as_C_string(),
1240                                             (mh() == NULL) ? "NULL" : mh()->name()->as_C_string() ));
1241 
1242         JvmtiEnv *env = ets->get_env();
1243         JvmtiMethodEventMark jem(thread, mh);
1244         if (result.not_null()) {
1245           value.l = JNIHandles::make_local(thread, result());
1246         }
1247         JvmtiJavaThreadEventTransition jet(thread);
1248         jvmtiEventMethodExit callback = env->callbacks()->MethodExit;
1249         if (callback != NULL) {
1250           (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(),
1251                       jem.jni_methodID(), exception_exit,  value);
1252         }
1253       }
1254     }
1255   }
1256 
1257   if (state->is_enabled(JVMTI_EVENT_FRAME_POP)) {
1258     JvmtiEnvThreadStateIterator it(state);
1259     for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
1260       int cur_frame_number = state->cur_stack_depth();
1261 
1262       if (ets->is_frame_pop(cur_frame_number)) {
1263         // we have a NotifyFramePop entry for this frame.
1264         // now check that this env/thread wants this event
1265         if (ets->is_enabled(JVMTI_EVENT_FRAME_POP)) {
1266           EVT_TRACE(JVMTI_EVENT_FRAME_POP, ("JVMTI [%s] Evt Frame Pop sent %s.%s",
1267                                             JvmtiTrace::safe_get_thread_name(thread),
1268                                             (mh() == NULL) ? "NULL" : mh()->klass_name()->as_C_string(),
1269                                             (mh() == NULL) ? "NULL" : mh()->name()->as_C_string() ));
1270 
1271           // we also need to issue a frame pop event for this frame
1272           JvmtiEnv *env = ets->get_env();
1273           JvmtiMethodEventMark jem(thread, mh);
1274           JvmtiJavaThreadEventTransition jet(thread);
1275           jvmtiEventFramePop callback = env->callbacks()->FramePop;
1276           if (callback != NULL) {
1277             (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(),
1278                         jem.jni_methodID(), exception_exit);
1279           }
1280         }
1281         // remove the frame's entry
1282         ets->clear_frame_pop(cur_frame_number);
1283       }
1284     }
1285   }
1286 
1287   state->decr_cur_stack_depth();
1288 }
1289 
1290 
1291 // Todo: inline this for optimization
1292 void JvmtiExport::post_single_step(JavaThread *thread, methodOop method, address location) {
1293   HandleMark hm(thread);
1294   methodHandle mh(thread, method);
1295 
1296   JvmtiThreadState *state = thread->jvmti_thread_state();
1297   if (state == NULL) {
1298     return;
1299   }
1300   JvmtiEnvThreadStateIterator it(state);
1301   for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
1302     ets->compare_and_set_current_location(mh(), location, JVMTI_EVENT_SINGLE_STEP);
1303     if (!ets->single_stepping_posted() && ets->is_enabled(JVMTI_EVENT_SINGLE_STEP)) {
1304       EVT_TRACE(JVMTI_EVENT_SINGLE_STEP, ("JVMTI [%s] Evt Single Step sent %s.%s @ %d",
1305                     JvmtiTrace::safe_get_thread_name(thread),
1306                     (mh() == NULL) ? "NULL" : mh()->klass_name()->as_C_string(),
1307                     (mh() == NULL) ? "NULL" : mh()->name()->as_C_string(),
1308                     location - mh()->code_base() ));
1309 
1310       JvmtiEnv *env = ets->get_env();
1311       JvmtiLocationEventMark jem(thread, mh, location);
1312       JvmtiJavaThreadEventTransition jet(thread);
1313       jvmtiEventSingleStep callback = env->callbacks()->SingleStep;
1314       if (callback != NULL) {
1315         (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(),
1316                     jem.jni_methodID(), jem.location());
1317       }
1318 
1319       ets->set_single_stepping_posted();
1320     }
1321   }
1322 }
1323 
1324 
1325 void JvmtiExport::post_exception_throw(JavaThread *thread, methodOop method, address location, oop exception) {
1326   HandleMark hm(thread);
1327   methodHandle mh(thread, method);
1328   Handle exception_handle(thread, exception);
1329 
1330   JvmtiThreadState *state = thread->jvmti_thread_state();
1331   if (state == NULL) {
1332     return;
1333   }
1334 
1335   EVT_TRIG_TRACE(JVMTI_EVENT_EXCEPTION, ("JVMTI [%s] Trg Exception thrown triggered",
1336                       JvmtiTrace::safe_get_thread_name(thread)));
1337   if (!state->is_exception_detected()) {
1338     state->set_exception_detected();
1339     JvmtiEnvThreadStateIterator it(state);
1340     for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
1341       if (ets->is_enabled(JVMTI_EVENT_EXCEPTION) && (exception != NULL)) {
1342 
1343         EVT_TRACE(JVMTI_EVENT_EXCEPTION,
1344                      ("JVMTI [%s] Evt Exception thrown sent %s.%s @ %d",
1345                       JvmtiTrace::safe_get_thread_name(thread),
1346                       (mh() == NULL) ? "NULL" : mh()->klass_name()->as_C_string(),
1347                       (mh() == NULL) ? "NULL" : mh()->name()->as_C_string(),
1348                       location - mh()->code_base() ));
1349 
1350         JvmtiEnv *env = ets->get_env();
1351         JvmtiExceptionEventMark jem(thread, mh, location, exception_handle);
1352 
1353         // It's okay to clear these exceptions here because we duplicate
1354         // this lookup in InterpreterRuntime::exception_handler_for_exception.
1355         EXCEPTION_MARK;
1356 
1357         bool should_repeat;
1358         vframeStream st(thread);
1359         assert(!st.at_end(), "cannot be at end");
1360         methodOop current_method = NULL;
1361         int current_bci = -1;
1362         do {
1363           current_method = st.method();
1364           current_bci = st.bci();
1365           do {
1366             should_repeat = false;
1367             KlassHandle eh_klass(thread, exception_handle()->klass());
1368             current_bci = current_method->fast_exception_handler_bci_for(
1369               eh_klass, current_bci, THREAD);
1370             if (HAS_PENDING_EXCEPTION) {
1371               exception_handle = KlassHandle(thread, PENDING_EXCEPTION);
1372               CLEAR_PENDING_EXCEPTION;
1373               should_repeat = true;
1374             }
1375           } while (should_repeat && (current_bci != -1));
1376           st.next();
1377         } while ((current_bci < 0) && (!st.at_end()));
1378 
1379         jmethodID catch_jmethodID;
1380         if (current_bci < 0) {
1381           catch_jmethodID = 0;
1382           current_bci = 0;
1383         } else {
1384           catch_jmethodID = jem.to_jmethodID(
1385                                      methodHandle(thread, current_method));
1386         }
1387 
1388         JvmtiJavaThreadEventTransition jet(thread);
1389         jvmtiEventException callback = env->callbacks()->Exception;
1390         if (callback != NULL) {
1391           (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(),
1392                       jem.jni_methodID(), jem.location(),
1393                       jem.exception(),
1394                       catch_jmethodID, current_bci);
1395         }
1396       }
1397     }
1398   }
1399 
1400   // frames may get popped because of this throw, be safe - invalidate cached depth
1401   state->invalidate_cur_stack_depth();
1402 }
1403 
1404 
1405 void JvmtiExport::notice_unwind_due_to_exception(JavaThread *thread, methodOop method, address location, oop exception, bool in_handler_frame) {
1406   HandleMark hm(thread);
1407   methodHandle mh(thread, method);
1408   Handle exception_handle(thread, exception);
1409 
1410   JvmtiThreadState *state = thread->jvmti_thread_state();
1411   if (state == NULL) {
1412     return;
1413   }
1414   EVT_TRIG_TRACE(JVMTI_EVENT_EXCEPTION_CATCH,
1415                     ("JVMTI [%s] Trg unwind_due_to_exception triggered %s.%s @ %s%d - %s",
1416                      JvmtiTrace::safe_get_thread_name(thread),
1417                      (mh() == NULL) ? "NULL" : mh()->klass_name()->as_C_string(),
1418                      (mh() == NULL) ? "NULL" : mh()->name()->as_C_string(),
1419                      location==0? "no location:" : "",
1420                      location==0? 0 : location - mh()->code_base(),
1421                      in_handler_frame? "in handler frame" : "not handler frame" ));
1422 
1423   if (state->is_exception_detected()) {
1424 
1425     state->invalidate_cur_stack_depth();
1426     if (!in_handler_frame) {
1427       // Not in exception handler.
1428       if(state->is_interp_only_mode()) {
1429         // method exit and frame pop events are posted only in interp mode.
1430         // When these events are enabled code should be in running in interp mode.
1431         JvmtiExport::post_method_exit(thread, method, thread->last_frame());
1432         // The cached cur_stack_depth might have changed from the
1433         // operations of frame pop or method exit. We are not 100% sure
1434         // the cached cur_stack_depth is still valid depth so invalidate
1435         // it.
1436         state->invalidate_cur_stack_depth();
1437       }
1438     } else {
1439       // In exception handler frame. Report exception catch.
1440       assert(location != NULL, "must be a known location");
1441       // Update cur_stack_depth - the frames above the current frame
1442       // have been unwound due to this exception:
1443       assert(!state->is_exception_caught(), "exception must not be caught yet.");
1444       state->set_exception_caught();
1445 
1446       JvmtiEnvThreadStateIterator it(state);
1447       for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
1448         if (ets->is_enabled(JVMTI_EVENT_EXCEPTION_CATCH) && (exception_handle() != NULL)) {
1449           EVT_TRACE(JVMTI_EVENT_EXCEPTION_CATCH,
1450                      ("JVMTI [%s] Evt ExceptionCatch sent %s.%s @ %d",
1451                       JvmtiTrace::safe_get_thread_name(thread),
1452                       (mh() == NULL) ? "NULL" : mh()->klass_name()->as_C_string(),
1453                       (mh() == NULL) ? "NULL" : mh()->name()->as_C_string(),
1454                       location - mh()->code_base() ));
1455 
1456           JvmtiEnv *env = ets->get_env();
1457           JvmtiExceptionEventMark jem(thread, mh, location, exception_handle);
1458           JvmtiJavaThreadEventTransition jet(thread);
1459           jvmtiEventExceptionCatch callback = env->callbacks()->ExceptionCatch;
1460           if (callback != NULL) {
1461             (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(),
1462                       jem.jni_methodID(), jem.location(),
1463                       jem.exception());
1464           }
1465         }
1466       }
1467     }
1468   }
1469 }
1470 
1471 oop JvmtiExport::jni_GetField_probe(JavaThread *thread, jobject jobj, oop obj,
1472                                     klassOop klass, jfieldID fieldID, bool is_static) {
1473   if (*((int *)get_field_access_count_addr()) > 0 && thread->has_last_Java_frame()) {
1474     // At least one field access watch is set so we have more work
1475     // to do. This wrapper is used by entry points that allow us
1476     // to create handles in post_field_access_by_jni().
1477     post_field_access_by_jni(thread, obj, klass, fieldID, is_static);
1478     // event posting can block so refetch oop if we were passed a jobj
1479     if (jobj != NULL) return JNIHandles::resolve_non_null(jobj);
1480   }
1481   return obj;
1482 }
1483 
1484 oop JvmtiExport::jni_GetField_probe_nh(JavaThread *thread, jobject jobj, oop obj,
1485                                        klassOop klass, jfieldID fieldID, bool is_static) {
1486   if (*((int *)get_field_access_count_addr()) > 0 && thread->has_last_Java_frame()) {
1487     // At least one field access watch is set so we have more work
1488     // to do. This wrapper is used by "quick" entry points that don't
1489     // allow us to create handles in post_field_access_by_jni(). We
1490     // override that with a ResetNoHandleMark.
1491     ResetNoHandleMark rnhm;
1492     post_field_access_by_jni(thread, obj, klass, fieldID, is_static);
1493     // event posting can block so refetch oop if we were passed a jobj
1494     if (jobj != NULL) return JNIHandles::resolve_non_null(jobj);
1495   }
1496   return obj;
1497 }
1498 
1499 void JvmtiExport::post_field_access_by_jni(JavaThread *thread, oop obj,
1500                                            klassOop klass, jfieldID fieldID, bool is_static) {
1501   // We must be called with a Java context in order to provide reasonable
1502   // values for the klazz, method, and location fields. The callers of this
1503   // function don't make the call unless there is a Java context.
1504   assert(thread->has_last_Java_frame(), "must be called with a Java context");
1505 
1506   ResourceMark rm;
1507   fieldDescriptor fd;
1508   // if get_field_descriptor finds fieldID to be invalid, then we just bail
1509   bool valid_fieldID = JvmtiEnv::get_field_descriptor(klass, fieldID, &fd);
1510   assert(valid_fieldID == true,"post_field_access_by_jni called with invalid fieldID");
1511   if (!valid_fieldID) return;
1512   // field accesses are not watched so bail
1513   if (!fd.is_field_access_watched()) return;
1514 
1515   HandleMark hm(thread);
1516   KlassHandle h_klass(thread, klass);
1517   Handle h_obj;
1518   if (!is_static) {
1519     // non-static field accessors have an object, but we need a handle
1520     assert(obj != NULL, "non-static needs an object");
1521     h_obj = Handle(thread, obj);
1522   }
1523   post_field_access(thread,
1524                     thread->last_frame().interpreter_frame_method(),
1525                     thread->last_frame().interpreter_frame_bcp(),
1526                     h_klass, h_obj, fieldID);
1527 }
1528 
1529 void JvmtiExport::post_field_access(JavaThread *thread, methodOop method,
1530   address location, KlassHandle field_klass, Handle object, jfieldID field) {
1531 
1532   HandleMark hm(thread);
1533   methodHandle mh(thread, method);
1534 
1535   JvmtiThreadState *state = thread->jvmti_thread_state();
1536   if (state == NULL) {
1537     return;
1538   }
1539   EVT_TRIG_TRACE(JVMTI_EVENT_FIELD_ACCESS, ("JVMTI [%s] Trg Field Access event triggered",
1540                       JvmtiTrace::safe_get_thread_name(thread)));
1541   JvmtiEnvThreadStateIterator it(state);
1542   for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
1543     if (ets->is_enabled(JVMTI_EVENT_FIELD_ACCESS)) {
1544       EVT_TRACE(JVMTI_EVENT_FIELD_ACCESS, ("JVMTI [%s] Evt Field Access event sent %s.%s @ %d",
1545                      JvmtiTrace::safe_get_thread_name(thread),
1546                      (mh() == NULL) ? "NULL" : mh()->klass_name()->as_C_string(),
1547                      (mh() == NULL) ? "NULL" : mh()->name()->as_C_string(),
1548                      location - mh()->code_base() ));
1549 
1550       JvmtiEnv *env = ets->get_env();
1551       JvmtiLocationEventMark jem(thread, mh, location);
1552       jclass field_jclass = jem.to_jclass(field_klass());
1553       jobject field_jobject = jem.to_jobject(object());
1554       JvmtiJavaThreadEventTransition jet(thread);
1555       jvmtiEventFieldAccess callback = env->callbacks()->FieldAccess;
1556       if (callback != NULL) {
1557         (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(),
1558                     jem.jni_methodID(), jem.location(),
1559                     field_jclass, field_jobject, field);
1560       }
1561     }
1562   }
1563 }
1564 
1565 oop JvmtiExport::jni_SetField_probe(JavaThread *thread, jobject jobj, oop obj,
1566                                     klassOop klass, jfieldID fieldID, bool is_static,
1567                                     char sig_type, jvalue *value) {
1568   if (*((int *)get_field_modification_count_addr()) > 0 && thread->has_last_Java_frame()) {
1569     // At least one field modification watch is set so we have more work
1570     // to do. This wrapper is used by entry points that allow us
1571     // to create handles in post_field_modification_by_jni().
1572     post_field_modification_by_jni(thread, obj, klass, fieldID, is_static, sig_type, value);
1573     // event posting can block so refetch oop if we were passed a jobj
1574     if (jobj != NULL) return JNIHandles::resolve_non_null(jobj);
1575   }
1576   return obj;
1577 }
1578 
1579 oop JvmtiExport::jni_SetField_probe_nh(JavaThread *thread, jobject jobj, oop obj,
1580                                        klassOop klass, jfieldID fieldID, bool is_static,
1581                                        char sig_type, jvalue *value) {
1582   if (*((int *)get_field_modification_count_addr()) > 0 && thread->has_last_Java_frame()) {
1583     // At least one field modification watch is set so we have more work
1584     // to do. This wrapper is used by "quick" entry points that don't
1585     // allow us to create handles in post_field_modification_by_jni(). We
1586     // override that with a ResetNoHandleMark.
1587     ResetNoHandleMark rnhm;
1588     post_field_modification_by_jni(thread, obj, klass, fieldID, is_static, sig_type, value);
1589     // event posting can block so refetch oop if we were passed a jobj
1590     if (jobj != NULL) return JNIHandles::resolve_non_null(jobj);
1591   }
1592   return obj;
1593 }
1594 
1595 void JvmtiExport::post_field_modification_by_jni(JavaThread *thread, oop obj,
1596                                                  klassOop klass, jfieldID fieldID, bool is_static,
1597                                                  char sig_type, jvalue *value) {
1598   // We must be called with a Java context in order to provide reasonable
1599   // values for the klazz, method, and location fields. The callers of this
1600   // function don't make the call unless there is a Java context.
1601   assert(thread->has_last_Java_frame(), "must be called with Java context");
1602 
1603   ResourceMark rm;
1604   fieldDescriptor fd;
1605   // if get_field_descriptor finds fieldID to be invalid, then we just bail
1606   bool valid_fieldID = JvmtiEnv::get_field_descriptor(klass, fieldID, &fd);
1607   assert(valid_fieldID == true,"post_field_modification_by_jni called with invalid fieldID");
1608   if (!valid_fieldID) return;
1609   // field modifications are not watched so bail
1610   if (!fd.is_field_modification_watched()) return;
1611 
1612   HandleMark hm(thread);
1613 
1614   Handle h_obj;
1615   if (!is_static) {
1616     // non-static field accessors have an object, but we need a handle
1617     assert(obj != NULL, "non-static needs an object");
1618     h_obj = Handle(thread, obj);
1619   }
1620   KlassHandle h_klass(thread, klass);
1621   post_field_modification(thread,
1622                           thread->last_frame().interpreter_frame_method(),
1623                           thread->last_frame().interpreter_frame_bcp(),
1624                           h_klass, h_obj, fieldID, sig_type, value);
1625 }
1626 
1627 void JvmtiExport::post_raw_field_modification(JavaThread *thread, methodOop method,
1628   address location, KlassHandle field_klass, Handle object, jfieldID field,
1629   char sig_type, jvalue *value) {
1630 
1631   if (sig_type == 'I' || sig_type == 'Z' || sig_type == 'C' || sig_type == 'S') {
1632     // 'I' instructions are used for byte, char, short and int.
1633     // determine which it really is, and convert
1634     fieldDescriptor fd;
1635     bool found = JvmtiEnv::get_field_descriptor(field_klass(), field, &fd);
1636     // should be found (if not, leave as is)
1637     if (found) {
1638       jint ival = value->i;
1639       // convert value from int to appropriate type
1640       switch (fd.field_type()) {
1641       case T_BOOLEAN:
1642         sig_type = 'Z';
1643         value->i = 0; // clear it
1644         value->z = (jboolean)ival;
1645         break;
1646       case T_BYTE:
1647         sig_type = 'B';
1648         value->i = 0; // clear it
1649         value->b = (jbyte)ival;
1650         break;
1651       case T_CHAR:
1652         sig_type = 'C';
1653         value->i = 0; // clear it
1654         value->c = (jchar)ival;
1655         break;
1656       case T_SHORT:
1657         sig_type = 'S';
1658         value->i = 0; // clear it
1659         value->s = (jshort)ival;
1660         break;
1661       case T_INT:
1662         // nothing to do
1663         break;
1664       default:
1665         // this is an integer instruction, should be one of above
1666         ShouldNotReachHere();
1667         break;
1668       }
1669     }
1670   }
1671 
1672   // convert oop to JNI handle.
1673   if (sig_type == 'L' || sig_type == '[') {
1674     value->l = (jobject)JNIHandles::make_local(thread, (oop)value->l);
1675   }
1676 
1677   post_field_modification(thread, method, location, field_klass, object, field, sig_type, value);
1678 
1679   // Destroy the JNI handle allocated above.
1680   if (sig_type == 'L') {
1681     JNIHandles::destroy_local(value->l);
1682   }
1683 }
1684 
1685 void JvmtiExport::post_field_modification(JavaThread *thread, methodOop method,
1686   address location, KlassHandle field_klass, Handle object, jfieldID field,
1687   char sig_type, jvalue *value_ptr) {
1688 
1689   HandleMark hm(thread);
1690   methodHandle mh(thread, method);
1691 
1692   JvmtiThreadState *state = thread->jvmti_thread_state();
1693   if (state == NULL) {
1694     return;
1695   }
1696   EVT_TRIG_TRACE(JVMTI_EVENT_FIELD_MODIFICATION,
1697                      ("JVMTI [%s] Trg Field Modification event triggered",
1698                       JvmtiTrace::safe_get_thread_name(thread)));
1699 
1700   JvmtiEnvThreadStateIterator it(state);
1701   for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
1702     if (ets->is_enabled(JVMTI_EVENT_FIELD_MODIFICATION)) {
1703       EVT_TRACE(JVMTI_EVENT_FIELD_MODIFICATION,
1704                    ("JVMTI [%s] Evt Field Modification event sent %s.%s @ %d",
1705                     JvmtiTrace::safe_get_thread_name(thread),
1706                     (mh() == NULL) ? "NULL" : mh()->klass_name()->as_C_string(),
1707                     (mh() == NULL) ? "NULL" : mh()->name()->as_C_string(),
1708                     location - mh()->code_base() ));
1709 
1710       JvmtiEnv *env = ets->get_env();
1711       JvmtiLocationEventMark jem(thread, mh, location);
1712       jclass field_jclass = jem.to_jclass(field_klass());
1713       jobject field_jobject = jem.to_jobject(object());
1714       JvmtiJavaThreadEventTransition jet(thread);
1715       jvmtiEventFieldModification callback = env->callbacks()->FieldModification;
1716       if (callback != NULL) {
1717         (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(),
1718                     jem.jni_methodID(), jem.location(),
1719                     field_jclass, field_jobject, field, sig_type, *value_ptr);
1720       }
1721     }
1722   }
1723 }
1724 
1725 void JvmtiExport::post_native_method_bind(methodOop method, address* function_ptr) {
1726   JavaThread* thread = JavaThread::current();
1727   assert(thread->thread_state() == _thread_in_vm, "must be in vm state");
1728 
1729   HandleMark hm(thread);
1730   methodHandle mh(thread, method);
1731 
1732   EVT_TRIG_TRACE(JVMTI_EVENT_NATIVE_METHOD_BIND, ("JVMTI [%s] Trg Native Method Bind event triggered",
1733                       JvmtiTrace::safe_get_thread_name(thread)));
1734 
1735   if (JvmtiEventController::is_enabled(JVMTI_EVENT_NATIVE_METHOD_BIND)) {
1736     JvmtiEnvIterator it;
1737     for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
1738       if (env->is_enabled(JVMTI_EVENT_NATIVE_METHOD_BIND)) {
1739         EVT_TRACE(JVMTI_EVENT_NATIVE_METHOD_BIND, ("JVMTI [%s] Evt Native Method Bind event sent",
1740                      JvmtiTrace::safe_get_thread_name(thread) ));
1741 
1742         JvmtiMethodEventMark jem(thread, mh);
1743         JvmtiJavaThreadEventTransition jet(thread);
1744         JNIEnv* jni_env =  JvmtiEnv::get_phase() == JVMTI_PHASE_PRIMORDIAL? NULL : jem.jni_env();
1745         jvmtiEventNativeMethodBind callback = env->callbacks()->NativeMethodBind;
1746         if (callback != NULL) {
1747           (*callback)(env->jvmti_external(), jni_env, jem.jni_thread(),
1748                       jem.jni_methodID(), (void*)(*function_ptr), (void**)function_ptr);
1749         }
1750       }
1751     }
1752   }
1753 }
1754 
1755 // Returns a record containing inlining information for the given nmethod
1756 jvmtiCompiledMethodLoadInlineRecord* create_inline_record(nmethod* nm) {
1757   jint numstackframes = 0;
1758   jvmtiCompiledMethodLoadInlineRecord* record = (jvmtiCompiledMethodLoadInlineRecord*)NEW_RESOURCE_OBJ(jvmtiCompiledMethodLoadInlineRecord);
1759   record->header.kind = JVMTI_CMLR_INLINE_INFO;
1760   record->header.next = NULL;
1761   record->header.majorinfoversion = JVMTI_CMLR_MAJOR_VERSION_1;
1762   record->header.minorinfoversion = JVMTI_CMLR_MINOR_VERSION_0;
1763   record->numpcs = 0;
1764   for(PcDesc* p = nm->scopes_pcs_begin(); p < nm->scopes_pcs_end(); p++) {
1765    if(p->scope_decode_offset() == DebugInformationRecorder::serialized_null) continue;
1766    record->numpcs++;
1767   }
1768   record->pcinfo = (PCStackInfo*)(NEW_RESOURCE_ARRAY(PCStackInfo, record->numpcs));
1769   int scope = 0;
1770   for(PcDesc* p = nm->scopes_pcs_begin(); p < nm->scopes_pcs_end(); p++) {
1771     if(p->scope_decode_offset() == DebugInformationRecorder::serialized_null) continue;
1772     void* pc_address = (void*)p->real_pc(nm);   
1773     assert(pc_address != NULL, "pc_address must be non-null");  
1774     record->pcinfo[scope].pc = pc_address;    
1775     numstackframes=0;
1776     for(ScopeDesc* sd = nm->scope_desc_at(p->real_pc(nm));sd != NULL;sd = sd->sender()) {
1777       numstackframes++;
1778     }  
1779     assert(numstackframes != 0, "numstackframes must be nonzero.");
1780     record->pcinfo[scope].methods = (jmethodID *)NEW_RESOURCE_ARRAY(jmethodID, numstackframes);
1781     record->pcinfo[scope].bcis = (jint *)NEW_RESOURCE_ARRAY(jint, numstackframes); 
1782     record->pcinfo[scope].numstackframes = numstackframes;  
1783     int stackframe = 0;   
1784     for(ScopeDesc* sd = nm->scope_desc_at(p->real_pc(nm));sd != NULL;sd = sd->sender()) {
1785       // sd->method() can be NULL for stubs but not for nmethods. To be completely robust, include an assert that we should never see a null sd->method()
1786       assert(!sd->method().is_null(), "sd->method() cannot be null.");
1787       record->pcinfo[scope].methods[stackframe] = sd->method()->jmethod_id();
1788       record->pcinfo[scope].bcis[stackframe] = sd->bci();
1789       stackframe++;
1790     }
1791     scope++;    
1792   }
1793   return record;
1794 }
1795 
1796 void JvmtiExport::post_compiled_method_load(nmethod *nm) {
1797   // If there are pending CompiledMethodUnload events then these are
1798   // posted before this CompiledMethodLoad event. We "lock" the nmethod and
1799   // maintain a handle to the methodOop to ensure that the nmethod isn't
1800   // flushed or unloaded while posting the events.
1801   JavaThread* thread = JavaThread::current();
1802   if (have_pending_compiled_method_unload_events()) {
1803     methodHandle mh(thread, nm->method());
1804     nmethodLocker nml(nm);
1805     post_pending_compiled_method_unload_events();
1806   }
1807 
1808   EVT_TRIG_TRACE(JVMTI_EVENT_COMPILED_METHOD_LOAD,
1809                  ("JVMTI [%s] method compile load event triggered",
1810                  JvmtiTrace::safe_get_thread_name(thread)));
1811 
1812   JvmtiEnvIterator it;
1813   for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
1814     if (env->is_enabled(JVMTI_EVENT_COMPILED_METHOD_LOAD)) {
1815 
1816       EVT_TRACE(JVMTI_EVENT_COMPILED_METHOD_LOAD,
1817                 ("JVMTI [%s] class compile method load event sent %s.%s  ",
1818                 JvmtiTrace::safe_get_thread_name(thread),
1819                 (nm->method() == NULL) ? "NULL" : nm->method()->klass_name()->as_C_string(),
1820                 (nm->method() == NULL) ? "NULL" : nm->method()->name()->as_C_string()));
1821 
1822       ResourceMark rm(thread);
1823 
1824       // Add inlining information
1825       jvmtiCompiledMethodLoadInlineRecord* inlinerecord = create_inline_record(nm);
1826       // Pass inlining information through the void pointer
1827       JvmtiCompiledMethodLoadEventMark jem(thread, nm, inlinerecord);
1828       JvmtiJavaThreadEventTransition jet(thread);
1829       jvmtiEventCompiledMethodLoad callback = env->callbacks()->CompiledMethodLoad;
1830       if (callback != NULL) {
1831         (*callback)(env->jvmti_external(), jem.jni_methodID(),
1832                     jem.code_size(), jem.code_data(), jem.map_length(),
1833                     jem.map(), jem.compile_info());
1834       }
1835     }
1836   }
1837 }
1838 
1839 
1840 // post a COMPILED_METHOD_LOAD event for a given environment
1841 void JvmtiExport::post_compiled_method_load(JvmtiEnv* env, const jmethodID method, const jint length,
1842                                             const void *code_begin, const jint map_length,
1843                                             const jvmtiAddrLocationMap* map)
1844 {
1845   JavaThread* thread = JavaThread::current();
1846   EVT_TRIG_TRACE(JVMTI_EVENT_COMPILED_METHOD_LOAD,
1847                  ("JVMTI [%s] method compile load event triggered (by GenerateEvents)",
1848                  JvmtiTrace::safe_get_thread_name(thread)));
1849   if (env->is_enabled(JVMTI_EVENT_COMPILED_METHOD_LOAD)) {
1850 
1851     EVT_TRACE(JVMTI_EVENT_COMPILED_METHOD_LOAD,
1852               ("JVMTI [%s] class compile method load event sent (by GenerateEvents), jmethodID=" PTR_FORMAT,
1853               JvmtiTrace::safe_get_thread_name(thread), method));
1854 
1855     JvmtiEventMark jem(thread);
1856     JvmtiJavaThreadEventTransition jet(thread);
1857     jvmtiEventCompiledMethodLoad callback = env->callbacks()->CompiledMethodLoad;
1858     if (callback != NULL) {
1859       (*callback)(env->jvmti_external(), method,
1860                   length, code_begin, map_length,
1861                   map, NULL);
1862     }
1863   }
1864 }
1865 
1866 // used at a safepoint to post a CompiledMethodUnload event
1867 void JvmtiExport::post_compiled_method_unload_at_safepoint(jmethodID mid, const void *code_begin) {
1868   assert(SafepointSynchronize::is_at_safepoint(), "must be executed at a safepoint");
1869 
1870   // create list lazily
1871   if (_pending_compiled_method_unload_method_ids == NULL) {
1872     _pending_compiled_method_unload_method_ids = new (ResourceObj::C_HEAP) GrowableArray<jmethodID>(10,true);
1873     _pending_compiled_method_unload_code_begins = new (ResourceObj::C_HEAP) GrowableArray<const void *>(10,true);
1874   }
1875   _pending_compiled_method_unload_method_ids->append(mid);
1876   _pending_compiled_method_unload_code_begins->append(code_begin);
1877   _have_pending_compiled_method_unload_events = true;
1878 }
1879 
1880 void JvmtiExport::post_dynamic_code_generated_internal(const char *name, const void *code_begin, const void *code_end) {
1881   JavaThread* thread = JavaThread::current();
1882   EVT_TRIG_TRACE(JVMTI_EVENT_DYNAMIC_CODE_GENERATED,
1883                  ("JVMTI [%s] method dynamic code generated event triggered",
1884                  JvmtiTrace::safe_get_thread_name(thread)));
1885   JvmtiEnvIterator it;
1886   for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
1887     if (env->is_enabled(JVMTI_EVENT_DYNAMIC_CODE_GENERATED)) {
1888       EVT_TRACE(JVMTI_EVENT_DYNAMIC_CODE_GENERATED,
1889                 ("JVMTI [%s] dynamic code generated event sent for %s",
1890                 JvmtiTrace::safe_get_thread_name(thread), name));
1891       JvmtiEventMark jem(thread);
1892       JvmtiJavaThreadEventTransition jet(thread);
1893       jint length = (jint)pointer_delta(code_end, code_begin, sizeof(char));
1894       jvmtiEventDynamicCodeGenerated callback = env->callbacks()->DynamicCodeGenerated;
1895       if (callback != NULL) {
1896         (*callback)(env->jvmti_external(), name, (void*)code_begin, length);
1897       }
1898     }
1899   }
1900 }
1901 
1902 void JvmtiExport::post_dynamic_code_generated(const char *name, const void *code_begin, const void *code_end) {
1903   // In theory everyone coming thru here is in_vm but we need to be certain
1904   // because a callee will do a vm->native transition
1905   ThreadInVMfromUnknown __tiv;
1906   jvmtiPhase phase = JvmtiEnv::get_phase();
1907   if (phase == JVMTI_PHASE_PRIMORDIAL || phase == JVMTI_PHASE_START) {
1908     post_dynamic_code_generated_internal(name, code_begin, code_end);
1909     return;
1910   }
1911 
1912   if (have_pending_compiled_method_unload_events()) {
1913     post_pending_compiled_method_unload_events();
1914   }
1915   post_dynamic_code_generated_internal(name, code_begin, code_end);
1916 }
1917 
1918 
1919 // post a DYNAMIC_CODE_GENERATED event for a given environment
1920 // used by GenerateEvents
1921 void JvmtiExport::post_dynamic_code_generated(JvmtiEnv* env, const char *name,
1922                                               const void *code_begin, const void *code_end)
1923 {
1924   JavaThread* thread = JavaThread::current();
1925   EVT_TRIG_TRACE(JVMTI_EVENT_DYNAMIC_CODE_GENERATED,
1926                  ("JVMTI [%s] dynamic code generated event triggered (by GenerateEvents)",
1927                   JvmtiTrace::safe_get_thread_name(thread)));
1928   if (env->is_enabled(JVMTI_EVENT_DYNAMIC_CODE_GENERATED)) {
1929     EVT_TRACE(JVMTI_EVENT_DYNAMIC_CODE_GENERATED,
1930               ("JVMTI [%s] dynamic code generated event sent for %s",
1931                JvmtiTrace::safe_get_thread_name(thread), name));
1932     JvmtiEventMark jem(thread);
1933     JvmtiJavaThreadEventTransition jet(thread);
1934     jint length = (jint)pointer_delta(code_end, code_begin, sizeof(char));
1935     jvmtiEventDynamicCodeGenerated callback = env->callbacks()->DynamicCodeGenerated;
1936     if (callback != NULL) {
1937       (*callback)(env->jvmti_external(), name, (void*)code_begin, length);
1938     }
1939   }
1940 }
1941 
1942 // post a DynamicCodeGenerated event while holding locks in the VM.
1943 void JvmtiExport::post_dynamic_code_generated_while_holding_locks(const char* name,
1944                                                                   address code_begin, address code_end)
1945 {
1946   // register the stub with the current dynamic code event collector
1947   JvmtiThreadState* state = JvmtiThreadState::state_for(JavaThread::current());
1948   JvmtiDynamicCodeEventCollector* collector = state->get_dynamic_code_event_collector();
1949   guarantee(collector != NULL, "attempt to register stub without event collector");
1950   collector->register_stub(name, code_begin, code_end);
1951 }
1952 
1953 // Collect all the vm internally allocated objects which are visible to java world
1954 void JvmtiExport::record_vm_internal_object_allocation(oop obj) {
1955   Thread* thread = ThreadLocalStorage::thread();
1956   if (thread != NULL && thread->is_Java_thread())  {
1957     // Can not take safepoint here.
1958     No_Safepoint_Verifier no_sfpt;
1959     // Can not take safepoint here so can not use state_for to get
1960     // jvmti thread state.
1961     JvmtiThreadState *state = ((JavaThread*)thread)->jvmti_thread_state();
1962     if (state != NULL ) {
1963       // state is non NULL when VMObjectAllocEventCollector is enabled.
1964       JvmtiVMObjectAllocEventCollector *collector;
1965       collector = state->get_vm_object_alloc_event_collector();
1966       if (collector != NULL && collector->is_enabled()) {
1967         // Don't record classes as these will be notified via the ClassLoad
1968         // event.
1969         if (obj->klass() != SystemDictionary::class_klass()) {
1970           collector->record_allocation(obj);
1971         }
1972       }
1973     }
1974   }
1975 }
1976 
1977 void JvmtiExport::post_garbage_collection_finish() {
1978   Thread *thread = Thread::current(); // this event is posted from VM-Thread.
1979   EVT_TRIG_TRACE(JVMTI_EVENT_GARBAGE_COLLECTION_FINISH,
1980                  ("JVMTI [%s] garbage collection finish event triggered",
1981                   JvmtiTrace::safe_get_thread_name(thread)));
1982   JvmtiEnvIterator it;
1983   for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
1984     if (env->is_enabled(JVMTI_EVENT_GARBAGE_COLLECTION_FINISH)) {
1985       EVT_TRACE(JVMTI_EVENT_GARBAGE_COLLECTION_FINISH,
1986                 ("JVMTI [%s] garbage collection finish event sent ",
1987                  JvmtiTrace::safe_get_thread_name(thread)));
1988       JvmtiThreadEventTransition jet(thread);
1989       // JNIEnv is NULL here because this event is posted from VM Thread
1990       jvmtiEventGarbageCollectionFinish callback = env->callbacks()->GarbageCollectionFinish;
1991       if (callback != NULL) {
1992         (*callback)(env->jvmti_external());
1993       }
1994     }
1995   }
1996 }
1997 
1998 void JvmtiExport::post_garbage_collection_start() {
1999   Thread* thread = Thread::current(); // this event is posted from vm-thread.
2000   EVT_TRIG_TRACE(JVMTI_EVENT_GARBAGE_COLLECTION_START,
2001                  ("JVMTI [%s] garbage collection start event triggered",
2002                   JvmtiTrace::safe_get_thread_name(thread)));
2003   JvmtiEnvIterator it;
2004   for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
2005     if (env->is_enabled(JVMTI_EVENT_GARBAGE_COLLECTION_START)) {
2006       EVT_TRACE(JVMTI_EVENT_GARBAGE_COLLECTION_START,
2007                 ("JVMTI [%s] garbage collection start event sent ",
2008                  JvmtiTrace::safe_get_thread_name(thread)));
2009       JvmtiThreadEventTransition jet(thread);
2010       // JNIEnv is NULL here because this event is posted from VM Thread
2011       jvmtiEventGarbageCollectionStart callback = env->callbacks()->GarbageCollectionStart;
2012       if (callback != NULL) {
2013         (*callback)(env->jvmti_external());
2014       }
2015     }
2016   }
2017 }
2018 
2019 void JvmtiExport::post_data_dump() {
2020   Thread *thread = Thread::current();
2021   EVT_TRIG_TRACE(JVMTI_EVENT_DATA_DUMP_REQUEST,
2022                  ("JVMTI [%s] data dump request event triggered",
2023                   JvmtiTrace::safe_get_thread_name(thread)));
2024   JvmtiEnvIterator it;
2025   for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
2026     if (env->is_enabled(JVMTI_EVENT_DATA_DUMP_REQUEST)) {
2027       EVT_TRACE(JVMTI_EVENT_DATA_DUMP_REQUEST,
2028                 ("JVMTI [%s] data dump request event sent ",
2029                  JvmtiTrace::safe_get_thread_name(thread)));
2030      JvmtiThreadEventTransition jet(thread);
2031      // JNIEnv is NULL here because this event is posted from VM Thread
2032      jvmtiEventDataDumpRequest callback = env->callbacks()->DataDumpRequest;
2033      if (callback != NULL) {
2034        (*callback)(env->jvmti_external());
2035      }
2036     }
2037   }
2038 }
2039 
2040 void JvmtiExport::post_monitor_contended_enter(JavaThread *thread, ObjectMonitor *obj_mntr) {
2041   oop object = (oop)obj_mntr->object();
2042   if (!ServiceUtil::visible_oop(object)) {
2043     // Ignore monitor contended enter for vm internal object.
2044     return;
2045   }
2046   JvmtiThreadState *state = thread->jvmti_thread_state();
2047   if (state == NULL) {
2048     return;
2049   }
2050 
2051   HandleMark hm(thread);
2052   Handle h(thread, object);
2053 
2054   EVT_TRIG_TRACE(JVMTI_EVENT_MONITOR_CONTENDED_ENTER,
2055                      ("JVMTI [%s] montior contended enter event triggered",
2056                       JvmtiTrace::safe_get_thread_name(thread)));
2057 
2058   JvmtiEnvThreadStateIterator it(state);
2059   for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
2060     if (ets->is_enabled(JVMTI_EVENT_MONITOR_CONTENDED_ENTER)) {
2061       EVT_TRACE(JVMTI_EVENT_MONITOR_CONTENDED_ENTER,
2062                    ("JVMTI [%s] monitor contended enter event sent",
2063                     JvmtiTrace::safe_get_thread_name(thread)));
2064       JvmtiMonitorEventMark  jem(thread, h());
2065       JvmtiEnv *env = ets->get_env();
2066       JvmtiThreadEventTransition jet(thread);
2067       jvmtiEventMonitorContendedEnter callback = env->callbacks()->MonitorContendedEnter;
2068       if (callback != NULL) {
2069         (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), jem.jni_object());
2070       }
2071     }
2072   }
2073 }
2074 
2075 void JvmtiExport::post_monitor_contended_entered(JavaThread *thread, ObjectMonitor *obj_mntr) {
2076   oop object = (oop)obj_mntr->object();
2077   if (!ServiceUtil::visible_oop(object)) {
2078     // Ignore monitor contended entered for vm internal object.
2079     return;
2080   }
2081   JvmtiThreadState *state = thread->jvmti_thread_state();
2082   if (state == NULL) {
2083     return;
2084   }
2085 
2086   HandleMark hm(thread);
2087   Handle h(thread, object);
2088 
2089   EVT_TRIG_TRACE(JVMTI_EVENT_MONITOR_CONTENDED_ENTERED,
2090                      ("JVMTI [%s] montior contended entered event triggered",
2091                       JvmtiTrace::safe_get_thread_name(thread)));
2092 
2093   JvmtiEnvThreadStateIterator it(state);
2094   for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
2095     if (ets->is_enabled(JVMTI_EVENT_MONITOR_CONTENDED_ENTERED)) {
2096       EVT_TRACE(JVMTI_EVENT_MONITOR_CONTENDED_ENTERED,
2097                    ("JVMTI [%s] monitor contended enter event sent",
2098                     JvmtiTrace::safe_get_thread_name(thread)));
2099       JvmtiMonitorEventMark  jem(thread, h());
2100       JvmtiEnv *env = ets->get_env();
2101       JvmtiThreadEventTransition jet(thread);
2102       jvmtiEventMonitorContendedEntered callback = env->callbacks()->MonitorContendedEntered;
2103       if (callback != NULL) {
2104         (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), jem.jni_object());
2105       }
2106     }
2107   }
2108 }
2109 
2110 void JvmtiExport::post_monitor_wait(JavaThread *thread, oop object,
2111                                           jlong timeout) {
2112   JvmtiThreadState *state = thread->jvmti_thread_state();
2113   if (state == NULL) {
2114     return;
2115   }
2116 
2117   HandleMark hm(thread);
2118   Handle h(thread, object);
2119 
2120   EVT_TRIG_TRACE(JVMTI_EVENT_MONITOR_WAIT,
2121                      ("JVMTI [%s] montior wait event triggered",
2122                       JvmtiTrace::safe_get_thread_name(thread)));
2123 
2124   JvmtiEnvThreadStateIterator it(state);
2125   for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
2126     if (ets->is_enabled(JVMTI_EVENT_MONITOR_WAIT)) {
2127       EVT_TRACE(JVMTI_EVENT_MONITOR_WAIT,
2128                    ("JVMTI [%s] monitor wait event sent ",
2129                     JvmtiTrace::safe_get_thread_name(thread)));
2130       JvmtiMonitorEventMark  jem(thread, h());
2131       JvmtiEnv *env = ets->get_env();
2132       JvmtiThreadEventTransition jet(thread);
2133       jvmtiEventMonitorWait callback = env->callbacks()->MonitorWait;
2134       if (callback != NULL) {
2135         (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(),
2136                     jem.jni_object(), timeout);
2137       }
2138     }
2139   }
2140 }
2141 
2142 void JvmtiExport::post_monitor_waited(JavaThread *thread, ObjectMonitor *obj_mntr, jboolean timed_out) {
2143   oop object = (oop)obj_mntr->object();
2144   if (!ServiceUtil::visible_oop(object)) {
2145     // Ignore monitor waited for vm internal object.
2146     return;
2147   }
2148   JvmtiThreadState *state = thread->jvmti_thread_state();
2149   if (state == NULL) {
2150     return;
2151   }
2152 
2153   HandleMark hm(thread);
2154   Handle h(thread, object);
2155 
2156   EVT_TRIG_TRACE(JVMTI_EVENT_MONITOR_WAITED,
2157                      ("JVMTI [%s] montior waited event triggered",
2158                       JvmtiTrace::safe_get_thread_name(thread)));
2159 
2160   JvmtiEnvThreadStateIterator it(state);
2161   for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
2162     if (ets->is_enabled(JVMTI_EVENT_MONITOR_WAITED)) {
2163       EVT_TRACE(JVMTI_EVENT_MONITOR_WAITED,
2164                    ("JVMTI [%s] monitor waited event sent ",
2165                     JvmtiTrace::safe_get_thread_name(thread)));
2166       JvmtiMonitorEventMark  jem(thread, h());
2167       JvmtiEnv *env = ets->get_env();
2168       JvmtiThreadEventTransition jet(thread);
2169       jvmtiEventMonitorWaited callback = env->callbacks()->MonitorWaited;
2170       if (callback != NULL) {
2171         (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(),
2172                     jem.jni_object(), timed_out);
2173       }
2174     }
2175   }
2176 }
2177 
2178 
2179 void JvmtiExport::post_vm_object_alloc(JavaThread *thread,  oop object) {
2180   EVT_TRIG_TRACE(JVMTI_EVENT_VM_OBJECT_ALLOC, ("JVMTI [%s] Trg vm object alloc triggered",
2181                       JvmtiTrace::safe_get_thread_name(thread)));
2182   if (object == NULL) {
2183     return;
2184   }
2185   HandleMark hm(thread);
2186   Handle h(thread, object);
2187   JvmtiEnvIterator it;
2188   for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
2189     if (env->is_enabled(JVMTI_EVENT_VM_OBJECT_ALLOC)) {
2190       EVT_TRACE(JVMTI_EVENT_VM_OBJECT_ALLOC, ("JVMTI [%s] Evt vmobject alloc sent %s",
2191                                          JvmtiTrace::safe_get_thread_name(thread),
2192                                          object==NULL? "NULL" : Klass::cast(java_lang_Class::as_klassOop(object))->external_name()));
2193 
2194       JvmtiVMObjectAllocEventMark jem(thread, h());
2195       JvmtiJavaThreadEventTransition jet(thread);
2196       jvmtiEventVMObjectAlloc callback = env->callbacks()->VMObjectAlloc;
2197       if (callback != NULL) {
2198         (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(),
2199                     jem.jni_jobject(), jem.jni_class(), jem.size());
2200       }
2201     }
2202   }
2203 }
2204 
2205 ////////////////////////////////////////////////////////////////////////////////////////////////
2206 
2207 void JvmtiExport::cleanup_thread(JavaThread* thread) {
2208   assert(JavaThread::current() == thread, "thread is not current");
2209 
2210 
2211   // This has to happen after the thread state is removed, which is
2212   // why it is not in post_thread_end_event like its complement
2213   // Maybe both these functions should be rolled into the posts?
2214   JvmtiEventController::thread_ended(thread);
2215 }
2216 
2217 void JvmtiExport::oops_do(OopClosure* f) {
2218   JvmtiCurrentBreakpoints::oops_do(f);
2219   JvmtiVMObjectAllocEventCollector::oops_do_for_all_threads(f);
2220 }
2221 
2222 // Onload raw monitor transition.
2223 void JvmtiExport::transition_pending_onload_raw_monitors() {
2224   JvmtiPendingMonitors::transition_raw_monitors();
2225 }
2226 
2227 ////////////////////////////////////////////////////////////////////////////////////////////////
2228 
2229 // type for the Agent_OnAttach entry point
2230 extern "C" {
2231   typedef jint (JNICALL *OnAttachEntry_t)(JavaVM*, char *, void *);
2232 }
2233 
2234 #ifndef SERVICES_KERNEL
2235 jint JvmtiExport::load_agent_library(AttachOperation* op, outputStream* st) {
2236   char ebuf[1024];
2237   char buffer[JVM_MAXPATHLEN];
2238   void* library;
2239   jint result = JNI_ERR;
2240 
2241   // get agent name and options
2242   const char* agent = op->arg(0);
2243   const char* absParam = op->arg(1);
2244   const char* options = op->arg(2);
2245 
2246   // The abs paramter should be "true" or "false"
2247   bool is_absolute_path = (absParam != NULL) && (strcmp(absParam,"true")==0);
2248 
2249 
2250   // If the path is absolute we attempt to load the library. Otherwise we try to
2251   // load it from the standard dll directory.
2252 
2253   if (is_absolute_path) {
2254     library = hpi::dll_load(agent, ebuf, sizeof ebuf);
2255   } else {
2256     // Try to load the agent from the standard dll directory
2257     hpi::dll_build_name(buffer, sizeof(buffer), Arguments::get_dll_dir(), agent);
2258     library = hpi::dll_load(buffer, ebuf, sizeof ebuf);
2259     if (library == NULL) {
2260       // not found - try local path
2261       char ns[1] = {0};
2262       hpi::dll_build_name(buffer, sizeof(buffer), ns, agent);
2263       library = hpi::dll_load(buffer, ebuf, sizeof ebuf);
2264     }
2265   }
2266 
2267   // If the library was loaded then we attempt to invoke the Agent_OnAttach
2268   // function
2269   if (library != NULL) {
2270 
2271     // Lookup the Agent_OnAttach function
2272     OnAttachEntry_t on_attach_entry = NULL;
2273     const char *on_attach_symbols[] = AGENT_ONATTACH_SYMBOLS;
2274     for (uint symbol_index = 0; symbol_index < ARRAY_SIZE(on_attach_symbols); symbol_index++) {
2275       on_attach_entry =
2276         CAST_TO_FN_PTR(OnAttachEntry_t, hpi::dll_lookup(library, on_attach_symbols[symbol_index]));
2277       if (on_attach_entry != NULL) break;
2278     }
2279 
2280     if (on_attach_entry == NULL) {
2281       // Agent_OnAttach missing - unload library
2282       hpi::dll_unload(library);
2283     } else {
2284       // Invoke the Agent_OnAttach function
2285       JavaThread* THREAD = JavaThread::current();
2286       {
2287         extern struct JavaVM_ main_vm;
2288         JvmtiThreadEventMark jem(THREAD);
2289         JvmtiJavaThreadEventTransition jet(THREAD);
2290 
2291         result = (*on_attach_entry)(&main_vm, (char*)options, NULL);
2292       }
2293 
2294       // Agent_OnAttach may have used JNI
2295       if (HAS_PENDING_EXCEPTION) {
2296         CLEAR_PENDING_EXCEPTION;
2297       }
2298 
2299       // If OnAttach returns JNI_OK then we add it to the list of
2300       // agent libraries so that we can call Agent_OnUnload later.
2301       if (result == JNI_OK) {
2302         Arguments::add_loaded_agent(agent, (char*)options, is_absolute_path, library);
2303       }
2304 
2305       // Agent_OnAttach executed so completion status is JNI_OK
2306       st->print_cr("%d", result);
2307       result = JNI_OK;
2308     }
2309   }
2310   return result;
2311 }
2312 #endif // SERVICES_KERNEL
2313 
2314 // CMS has completed referencing processing so may need to update
2315 // tag maps.
2316 void JvmtiExport::cms_ref_processing_epilogue() {
2317   if (JvmtiEnv::environments_might_exist()) {
2318     JvmtiTagMap::cms_ref_processing_epilogue();
2319   }
2320 }
2321 
2322 
2323 ////////////////////////////////////////////////////////////////////////////////////////////////
2324 
2325 // Setup current current thread for event collection.
2326 void JvmtiEventCollector::setup_jvmti_thread_state() {
2327   // set this event collector to be the current one.
2328   JvmtiThreadState* state = JvmtiThreadState::state_for(JavaThread::current());
2329   if (is_vm_object_alloc_event()) {
2330     _prev = state->get_vm_object_alloc_event_collector();
2331     state->set_vm_object_alloc_event_collector((JvmtiVMObjectAllocEventCollector *)this);
2332   } else if (is_dynamic_code_event()) {
2333     _prev = state->get_dynamic_code_event_collector();
2334     state->set_dynamic_code_event_collector((JvmtiDynamicCodeEventCollector *)this);
2335   }
2336 }
2337 
2338 // Unset current event collection in this thread and reset it with previous
2339 // collector.
2340 void JvmtiEventCollector::unset_jvmti_thread_state() {
2341   JvmtiThreadState* state = JavaThread::current()->jvmti_thread_state();
2342   if (state != NULL) {
2343     // restore the previous event collector (if any)
2344     if (is_vm_object_alloc_event()) {
2345       if (state->get_vm_object_alloc_event_collector() == this) {
2346         state->set_vm_object_alloc_event_collector((JvmtiVMObjectAllocEventCollector *)_prev);
2347       } else {
2348         // this thread's jvmti state was created during the scope of
2349         // the event collector.
2350       }
2351     } else {
2352       if (is_dynamic_code_event()) {
2353         if (state->get_dynamic_code_event_collector() == this) {
2354           state->set_dynamic_code_event_collector((JvmtiDynamicCodeEventCollector *)_prev);
2355         } else {
2356           // this thread's jvmti state was created during the scope of
2357           // the event collector.
2358         }
2359       }
2360     }
2361   }
2362 }
2363 
2364 // create the dynamic code event collector
2365 JvmtiDynamicCodeEventCollector::JvmtiDynamicCodeEventCollector() : _code_blobs(NULL) {
2366   if (JvmtiExport::should_post_dynamic_code_generated()) {
2367     setup_jvmti_thread_state();
2368   }
2369 }
2370 
2371 // iterate over any code blob descriptors collected and post a
2372 // DYNAMIC_CODE_GENERATED event to the profiler.
2373 JvmtiDynamicCodeEventCollector::~JvmtiDynamicCodeEventCollector() {
2374   assert(!JavaThread::current()->owns_locks(), "all locks must be released to post deferred events");
2375  // iterate over any code blob descriptors that we collected
2376  if (_code_blobs != NULL) {
2377    for (int i=0; i<_code_blobs->length(); i++) {
2378      JvmtiCodeBlobDesc* blob = _code_blobs->at(i);
2379      JvmtiExport::post_dynamic_code_generated(blob->name(), blob->code_begin(), blob->code_end());
2380      FreeHeap(blob);
2381    }
2382    delete _code_blobs;
2383  }
2384  unset_jvmti_thread_state();
2385 }
2386 
2387 // register a stub
2388 void JvmtiDynamicCodeEventCollector::register_stub(const char* name, address start, address end) {
2389  if (_code_blobs == NULL) {
2390    _code_blobs = new (ResourceObj::C_HEAP) GrowableArray<JvmtiCodeBlobDesc*>(1,true);
2391  }
2392  _code_blobs->append(new JvmtiCodeBlobDesc(name, start, end));
2393 }
2394 
2395 // Setup current thread to record vm allocated objects.
2396 JvmtiVMObjectAllocEventCollector::JvmtiVMObjectAllocEventCollector() : _allocated(NULL) {
2397   if (JvmtiExport::should_post_vm_object_alloc()) {
2398     _enable = true;
2399     setup_jvmti_thread_state();
2400   } else {
2401     _enable = false;
2402   }
2403 }
2404 
2405 // Post vm_object_alloc event for vm allocated objects visible to java
2406 // world.
2407 JvmtiVMObjectAllocEventCollector::~JvmtiVMObjectAllocEventCollector() {
2408   if (_allocated != NULL) {
2409     set_enabled(false);
2410     for (int i = 0; i < _allocated->length(); i++) {
2411       oop obj = _allocated->at(i);
2412       if (ServiceUtil::visible_oop(obj)) {
2413         JvmtiExport::post_vm_object_alloc(JavaThread::current(), obj);
2414       }
2415     }
2416     delete _allocated;
2417   }
2418   unset_jvmti_thread_state();
2419 }
2420 
2421 void JvmtiVMObjectAllocEventCollector::record_allocation(oop obj) {
2422   assert(is_enabled(), "VM object alloc event collector is not enabled");
2423   if (_allocated == NULL) {
2424     _allocated = new (ResourceObj::C_HEAP) GrowableArray<oop>(1, true);
2425   }
2426   _allocated->push(obj);
2427 }
2428 
2429 // GC support.
2430 void JvmtiVMObjectAllocEventCollector::oops_do(OopClosure* f) {
2431   if (_allocated != NULL) {
2432     for(int i=_allocated->length() - 1; i >= 0; i--) {
2433       if (_allocated->at(i) != NULL) {
2434         f->do_oop(_allocated->adr_at(i));
2435       }
2436     }
2437   }
2438 }
2439 
2440 void JvmtiVMObjectAllocEventCollector::oops_do_for_all_threads(OopClosure* f) {
2441   // no-op if jvmti not enabled
2442   if (!JvmtiEnv::environments_might_exist()) {
2443     return;
2444   }
2445 
2446   // Runs at safepoint. So no need to acquire Threads_lock.
2447   for (JavaThread *jthr = Threads::first(); jthr != NULL; jthr = jthr->next()) {
2448     JvmtiThreadState *state = jthr->jvmti_thread_state();
2449     if (state != NULL) {
2450       JvmtiVMObjectAllocEventCollector *collector;
2451       collector = state->get_vm_object_alloc_event_collector();
2452       while (collector != NULL) {
2453         collector->oops_do(f);
2454         collector = (JvmtiVMObjectAllocEventCollector *)collector->get_prev();
2455       }
2456     }
2457   }
2458 }
2459 
2460 
2461 // Disable collection of VMObjectAlloc events
2462 NoJvmtiVMObjectAllocMark::NoJvmtiVMObjectAllocMark() : _collector(NULL) {
2463   // a no-op if VMObjectAlloc event is not enabled
2464   if (!JvmtiExport::should_post_vm_object_alloc()) {
2465     return;
2466   }
2467   Thread* thread = ThreadLocalStorage::thread();
2468   if (thread != NULL && thread->is_Java_thread())  {
2469     JavaThread* current_thread = (JavaThread*)thread;
2470     JvmtiThreadState *state = current_thread->jvmti_thread_state();
2471     if (state != NULL) {
2472       JvmtiVMObjectAllocEventCollector *collector;
2473       collector = state->get_vm_object_alloc_event_collector();
2474       if (collector != NULL && collector->is_enabled()) {
2475         _collector = collector;
2476         _collector->set_enabled(false);
2477       }
2478     }
2479   }
2480 }
2481 
2482 // Re-Enable collection of VMObjectAlloc events (if previously enabled)
2483 NoJvmtiVMObjectAllocMark::~NoJvmtiVMObjectAllocMark() {
2484   if (was_enabled()) {
2485     _collector->set_enabled(true);
2486   }
2487 };
2488 
2489 JvmtiGCMarker::JvmtiGCMarker(bool full) : _full(full), _invocation_count(0) {
2490   assert(Thread::current()->is_VM_thread(), "wrong thread");
2491 
2492   // if there aren't any JVMTI environments then nothing to do
2493   if (!JvmtiEnv::environments_might_exist()) {
2494     return;
2495   }
2496 
2497   if (ForceFullGCJVMTIEpilogues) {
2498     // force 'Full GC' was done semantics for JVMTI GC epilogues
2499     _full = true;
2500   }
2501 
2502   // GarbageCollectionStart event posted from VM thread - okay because
2503   // JVMTI is clear that the "world is stopped" and callback shouldn't
2504   // try to call into the VM.
2505   if (JvmtiExport::should_post_garbage_collection_start()) {
2506     JvmtiExport::post_garbage_collection_start();
2507   }
2508 
2509   // if "full" is false it probably means this is a scavenge of the young
2510   // generation. However it could turn out that a "full" GC is required
2511   // so we record the number of collections so that it can be checked in
2512   // the destructor.
2513   if (!_full) {
2514     _invocation_count = Universe::heap()->total_full_collections();
2515   }
2516 
2517   // Do clean up tasks that need to be done at a safepoint
2518   JvmtiEnvBase::check_for_periodic_clean_up();
2519 }
2520 
2521 JvmtiGCMarker::~JvmtiGCMarker() {
2522   // if there aren't any JVMTI environments then nothing to do
2523   if (!JvmtiEnv::environments_might_exist()) {
2524     return;
2525   }
2526 
2527   // JVMTI notify gc finish
2528   if (JvmtiExport::should_post_garbage_collection_finish()) {
2529     JvmtiExport::post_garbage_collection_finish();
2530   }
2531 
2532   // we might have initially started out doing a scavenge of the young
2533   // generation but could have ended up doing a "full" GC - check the
2534   // GC count to see.
2535   if (!_full) {
2536     _full = (_invocation_count != Universe::heap()->total_full_collections());
2537   }
2538 
2539   // Full collection probably means the perm generation has been GC'ed
2540   // so we clear the breakpoint cache.
2541   if (_full) {
2542     JvmtiCurrentBreakpoints::gc_epilogue();
2543   }
2544 
2545   // Notify heap/object tagging support
2546   JvmtiTagMap::gc_epilogue(_full);
2547 }
2548 #endif // JVMTI_KERNEL