1 /*
   2  * Copyright 2003-2009 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)
 690           : JvmtiMethodEventMark(thread,methodHandle(thread, nm->method())) {
 691     _code_data = nm->code_begin();
 692     _code_size = nm->code_size();
 693     _compile_info = NULL; /* no info for our VM. */
 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 
1756 void JvmtiExport::post_compiled_method_load(nmethod *nm) {
1757   // If there are pending CompiledMethodUnload events then these are
1758   // posted before this CompiledMethodLoad event. We "lock" the nmethod and
1759   // maintain a handle to the methodOop to ensure that the nmethod isn't
1760   // flushed or unloaded while posting the events.
1761   JavaThread* thread = JavaThread::current();
1762   if (have_pending_compiled_method_unload_events()) {
1763     methodHandle mh(thread, nm->method());
1764     nmethodLocker nml(nm);
1765     post_pending_compiled_method_unload_events();
1766   }
1767 
1768   EVT_TRIG_TRACE(JVMTI_EVENT_COMPILED_METHOD_LOAD,
1769                  ("JVMTI [%s] method compile load event triggered",
1770                  JvmtiTrace::safe_get_thread_name(thread)));
1771 
1772   JvmtiEnvIterator it;
1773   for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
1774     if (env->is_enabled(JVMTI_EVENT_COMPILED_METHOD_LOAD)) {
1775 
1776       EVT_TRACE(JVMTI_EVENT_COMPILED_METHOD_LOAD,
1777                 ("JVMTI [%s] class compile method load event sent %s.%s  ",
1778                 JvmtiTrace::safe_get_thread_name(thread),
1779                 (nm->method() == NULL) ? "NULL" : nm->method()->klass_name()->as_C_string(),
1780                 (nm->method() == NULL) ? "NULL" : nm->method()->name()->as_C_string()));
1781 
1782       ResourceMark rm(thread);
1783       JvmtiCompiledMethodLoadEventMark jem(thread, nm);
1784       JvmtiJavaThreadEventTransition jet(thread);
1785       jvmtiEventCompiledMethodLoad callback = env->callbacks()->CompiledMethodLoad;
1786       if (callback != NULL) {
1787         (*callback)(env->jvmti_external(), jem.jni_methodID(),
1788                     jem.code_size(), jem.code_data(), jem.map_length(),
1789                     jem.map(), jem.compile_info());
1790       }
1791     }
1792   }
1793 }
1794 
1795 
1796 // post a COMPILED_METHOD_LOAD event for a given environment
1797 void JvmtiExport::post_compiled_method_load(JvmtiEnv* env, const jmethodID method, const jint length,
1798                                             const void *code_begin, const jint map_length,
1799                                             const jvmtiAddrLocationMap* map)
1800 {
1801   JavaThread* thread = JavaThread::current();
1802   EVT_TRIG_TRACE(JVMTI_EVENT_COMPILED_METHOD_LOAD,
1803                  ("JVMTI [%s] method compile load event triggered (by GenerateEvents)",
1804                  JvmtiTrace::safe_get_thread_name(thread)));
1805   if (env->is_enabled(JVMTI_EVENT_COMPILED_METHOD_LOAD)) {
1806 
1807     EVT_TRACE(JVMTI_EVENT_COMPILED_METHOD_LOAD,
1808               ("JVMTI [%s] class compile method load event sent (by GenerateEvents), jmethodID=" PTR_FORMAT,
1809               JvmtiTrace::safe_get_thread_name(thread), method));
1810 
1811     JvmtiEventMark jem(thread);
1812     JvmtiJavaThreadEventTransition jet(thread);
1813     jvmtiEventCompiledMethodLoad callback = env->callbacks()->CompiledMethodLoad;
1814     if (callback != NULL) {
1815       (*callback)(env->jvmti_external(), method,
1816                   length, code_begin, map_length,
1817                   map, NULL);
1818     }
1819   }
1820 }
1821 
1822 // used at a safepoint to post a CompiledMethodUnload event
1823 void JvmtiExport::post_compiled_method_unload_at_safepoint(jmethodID mid, const void *code_begin) {
1824   assert(SafepointSynchronize::is_at_safepoint(), "must be executed at a safepoint");
1825 
1826   // create list lazily
1827   if (_pending_compiled_method_unload_method_ids == NULL) {
1828     _pending_compiled_method_unload_method_ids = new (ResourceObj::C_HEAP) GrowableArray<jmethodID>(10,true);
1829     _pending_compiled_method_unload_code_begins = new (ResourceObj::C_HEAP) GrowableArray<const void *>(10,true);
1830   }
1831   _pending_compiled_method_unload_method_ids->append(mid);
1832   _pending_compiled_method_unload_code_begins->append(code_begin);
1833   _have_pending_compiled_method_unload_events = true;
1834 }
1835 
1836 void JvmtiExport::post_dynamic_code_generated_internal(const char *name, const void *code_begin, const void *code_end) {
1837   JavaThread* thread = JavaThread::current();
1838   EVT_TRIG_TRACE(JVMTI_EVENT_DYNAMIC_CODE_GENERATED,
1839                  ("JVMTI [%s] method dynamic code generated event triggered",
1840                  JvmtiTrace::safe_get_thread_name(thread)));
1841   JvmtiEnvIterator it;
1842   for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
1843     if (env->is_enabled(JVMTI_EVENT_DYNAMIC_CODE_GENERATED)) {
1844       EVT_TRACE(JVMTI_EVENT_DYNAMIC_CODE_GENERATED,
1845                 ("JVMTI [%s] dynamic code generated event sent for %s",
1846                 JvmtiTrace::safe_get_thread_name(thread), name));
1847       JvmtiEventMark jem(thread);
1848       JvmtiJavaThreadEventTransition jet(thread);
1849       jint length = (jint)pointer_delta(code_end, code_begin, sizeof(char));
1850       jvmtiEventDynamicCodeGenerated callback = env->callbacks()->DynamicCodeGenerated;
1851       if (callback != NULL) {
1852         (*callback)(env->jvmti_external(), name, (void*)code_begin, length);
1853       }
1854     }
1855   }
1856 }
1857 
1858 void JvmtiExport::post_dynamic_code_generated(const char *name, const void *code_begin, const void *code_end) {
1859   // In theory everyone coming thru here is in_vm but we need to be certain
1860   // because a callee will do a vm->native transition
1861   ThreadInVMfromUnknown __tiv;
1862   jvmtiPhase phase = JvmtiEnv::get_phase();
1863   if (phase == JVMTI_PHASE_PRIMORDIAL || phase == JVMTI_PHASE_START) {
1864     post_dynamic_code_generated_internal(name, code_begin, code_end);
1865     return;
1866   }
1867 
1868   if (have_pending_compiled_method_unload_events()) {
1869     post_pending_compiled_method_unload_events();
1870   }
1871   post_dynamic_code_generated_internal(name, code_begin, code_end);
1872 }
1873 
1874 
1875 // post a DYNAMIC_CODE_GENERATED event for a given environment
1876 // used by GenerateEvents
1877 void JvmtiExport::post_dynamic_code_generated(JvmtiEnv* env, const char *name,
1878                                               const void *code_begin, const void *code_end)
1879 {
1880   JavaThread* thread = JavaThread::current();
1881   EVT_TRIG_TRACE(JVMTI_EVENT_DYNAMIC_CODE_GENERATED,
1882                  ("JVMTI [%s] dynamic code generated event triggered (by GenerateEvents)",
1883                   JvmtiTrace::safe_get_thread_name(thread)));
1884   if (env->is_enabled(JVMTI_EVENT_DYNAMIC_CODE_GENERATED)) {
1885     EVT_TRACE(JVMTI_EVENT_DYNAMIC_CODE_GENERATED,
1886               ("JVMTI [%s] dynamic code generated event sent for %s",
1887                JvmtiTrace::safe_get_thread_name(thread), name));
1888     JvmtiEventMark jem(thread);
1889     JvmtiJavaThreadEventTransition jet(thread);
1890     jint length = (jint)pointer_delta(code_end, code_begin, sizeof(char));
1891     jvmtiEventDynamicCodeGenerated callback = env->callbacks()->DynamicCodeGenerated;
1892     if (callback != NULL) {
1893       (*callback)(env->jvmti_external(), name, (void*)code_begin, length);
1894     }
1895   }
1896 }
1897 
1898 // post a DynamicCodeGenerated event while holding locks in the VM.
1899 void JvmtiExport::post_dynamic_code_generated_while_holding_locks(const char* name,
1900                                                                   address code_begin, address code_end)
1901 {
1902   // register the stub with the current dynamic code event collector
1903   JvmtiThreadState* state = JvmtiThreadState::state_for(JavaThread::current());
1904   JvmtiDynamicCodeEventCollector* collector = state->get_dynamic_code_event_collector();
1905   guarantee(collector != NULL, "attempt to register stub without event collector");
1906   collector->register_stub(name, code_begin, code_end);
1907 }
1908 
1909 // Collect all the vm internally allocated objects which are visible to java world
1910 void JvmtiExport::record_vm_internal_object_allocation(oop obj) {
1911   Thread* thread = ThreadLocalStorage::thread();
1912   if (thread != NULL && thread->is_Java_thread())  {
1913     // Can not take safepoint here.
1914     No_Safepoint_Verifier no_sfpt;
1915     // Can not take safepoint here so can not use state_for to get
1916     // jvmti thread state.
1917     JvmtiThreadState *state = ((JavaThread*)thread)->jvmti_thread_state();
1918     if (state != NULL ) {
1919       // state is non NULL when VMObjectAllocEventCollector is enabled.
1920       JvmtiVMObjectAllocEventCollector *collector;
1921       collector = state->get_vm_object_alloc_event_collector();
1922       if (collector != NULL && collector->is_enabled()) {
1923         // Don't record classes as these will be notified via the ClassLoad
1924         // event.
1925         if (obj->klass() != SystemDictionary::class_klass()) {
1926           collector->record_allocation(obj);
1927         }
1928       }
1929     }
1930   }
1931 }
1932 
1933 void JvmtiExport::post_garbage_collection_finish() {
1934   Thread *thread = Thread::current(); // this event is posted from VM-Thread.
1935   EVT_TRIG_TRACE(JVMTI_EVENT_GARBAGE_COLLECTION_FINISH,
1936                  ("JVMTI [%s] garbage collection finish event triggered",
1937                   JvmtiTrace::safe_get_thread_name(thread)));
1938   JvmtiEnvIterator it;
1939   for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
1940     if (env->is_enabled(JVMTI_EVENT_GARBAGE_COLLECTION_FINISH)) {
1941       EVT_TRACE(JVMTI_EVENT_GARBAGE_COLLECTION_FINISH,
1942                 ("JVMTI [%s] garbage collection finish event sent ",
1943                  JvmtiTrace::safe_get_thread_name(thread)));
1944       JvmtiThreadEventTransition jet(thread);
1945       // JNIEnv is NULL here because this event is posted from VM Thread
1946       jvmtiEventGarbageCollectionFinish callback = env->callbacks()->GarbageCollectionFinish;
1947       if (callback != NULL) {
1948         (*callback)(env->jvmti_external());
1949       }
1950     }
1951   }
1952 }
1953 
1954 void JvmtiExport::post_garbage_collection_start() {
1955   Thread* thread = Thread::current(); // this event is posted from vm-thread.
1956   EVT_TRIG_TRACE(JVMTI_EVENT_GARBAGE_COLLECTION_START,
1957                  ("JVMTI [%s] garbage collection start event triggered",
1958                   JvmtiTrace::safe_get_thread_name(thread)));
1959   JvmtiEnvIterator it;
1960   for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
1961     if (env->is_enabled(JVMTI_EVENT_GARBAGE_COLLECTION_START)) {
1962       EVT_TRACE(JVMTI_EVENT_GARBAGE_COLLECTION_START,
1963                 ("JVMTI [%s] garbage collection start event sent ",
1964                  JvmtiTrace::safe_get_thread_name(thread)));
1965       JvmtiThreadEventTransition jet(thread);
1966       // JNIEnv is NULL here because this event is posted from VM Thread
1967       jvmtiEventGarbageCollectionStart callback = env->callbacks()->GarbageCollectionStart;
1968       if (callback != NULL) {
1969         (*callback)(env->jvmti_external());
1970       }
1971     }
1972   }
1973 }
1974 
1975 void JvmtiExport::post_data_dump() {
1976   Thread *thread = Thread::current();
1977   EVT_TRIG_TRACE(JVMTI_EVENT_DATA_DUMP_REQUEST,
1978                  ("JVMTI [%s] data dump request event triggered",
1979                   JvmtiTrace::safe_get_thread_name(thread)));
1980   JvmtiEnvIterator it;
1981   for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
1982     if (env->is_enabled(JVMTI_EVENT_DATA_DUMP_REQUEST)) {
1983       EVT_TRACE(JVMTI_EVENT_DATA_DUMP_REQUEST,
1984                 ("JVMTI [%s] data dump request event sent ",
1985                  JvmtiTrace::safe_get_thread_name(thread)));
1986      JvmtiThreadEventTransition jet(thread);
1987      // JNIEnv is NULL here because this event is posted from VM Thread
1988      jvmtiEventDataDumpRequest callback = env->callbacks()->DataDumpRequest;
1989      if (callback != NULL) {
1990        (*callback)(env->jvmti_external());
1991      }
1992     }
1993   }
1994 }
1995 
1996 void JvmtiExport::post_monitor_contended_enter(JavaThread *thread, ObjectMonitor *obj_mntr) {
1997   oop object = (oop)obj_mntr->object();
1998   if (!ServiceUtil::visible_oop(object)) {
1999     // Ignore monitor contended enter for vm internal object.
2000     return;
2001   }
2002   JvmtiThreadState *state = thread->jvmti_thread_state();
2003   if (state == NULL) {
2004     return;
2005   }
2006 
2007   HandleMark hm(thread);
2008   Handle h(thread, object);
2009 
2010   EVT_TRIG_TRACE(JVMTI_EVENT_MONITOR_CONTENDED_ENTER,
2011                      ("JVMTI [%s] montior contended enter event triggered",
2012                       JvmtiTrace::safe_get_thread_name(thread)));
2013 
2014   JvmtiEnvThreadStateIterator it(state);
2015   for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
2016     if (ets->is_enabled(JVMTI_EVENT_MONITOR_CONTENDED_ENTER)) {
2017       EVT_TRACE(JVMTI_EVENT_MONITOR_CONTENDED_ENTER,
2018                    ("JVMTI [%s] monitor contended enter event sent",
2019                     JvmtiTrace::safe_get_thread_name(thread)));
2020       JvmtiMonitorEventMark  jem(thread, h());
2021       JvmtiEnv *env = ets->get_env();
2022       JvmtiThreadEventTransition jet(thread);
2023       jvmtiEventMonitorContendedEnter callback = env->callbacks()->MonitorContendedEnter;
2024       if (callback != NULL) {
2025         (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), jem.jni_object());
2026       }
2027     }
2028   }
2029 }
2030 
2031 void JvmtiExport::post_monitor_contended_entered(JavaThread *thread, ObjectMonitor *obj_mntr) {
2032   oop object = (oop)obj_mntr->object();
2033   if (!ServiceUtil::visible_oop(object)) {
2034     // Ignore monitor contended entered for vm internal object.
2035     return;
2036   }
2037   JvmtiThreadState *state = thread->jvmti_thread_state();
2038   if (state == NULL) {
2039     return;
2040   }
2041 
2042   HandleMark hm(thread);
2043   Handle h(thread, object);
2044 
2045   EVT_TRIG_TRACE(JVMTI_EVENT_MONITOR_CONTENDED_ENTERED,
2046                      ("JVMTI [%s] montior contended entered event triggered",
2047                       JvmtiTrace::safe_get_thread_name(thread)));
2048 
2049   JvmtiEnvThreadStateIterator it(state);
2050   for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
2051     if (ets->is_enabled(JVMTI_EVENT_MONITOR_CONTENDED_ENTERED)) {
2052       EVT_TRACE(JVMTI_EVENT_MONITOR_CONTENDED_ENTERED,
2053                    ("JVMTI [%s] monitor contended enter event sent",
2054                     JvmtiTrace::safe_get_thread_name(thread)));
2055       JvmtiMonitorEventMark  jem(thread, h());
2056       JvmtiEnv *env = ets->get_env();
2057       JvmtiThreadEventTransition jet(thread);
2058       jvmtiEventMonitorContendedEntered callback = env->callbacks()->MonitorContendedEntered;
2059       if (callback != NULL) {
2060         (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), jem.jni_object());
2061       }
2062     }
2063   }
2064 }
2065 
2066 void JvmtiExport::post_monitor_wait(JavaThread *thread, oop object,
2067                                           jlong timeout) {
2068   JvmtiThreadState *state = thread->jvmti_thread_state();
2069   if (state == NULL) {
2070     return;
2071   }
2072 
2073   HandleMark hm(thread);
2074   Handle h(thread, object);
2075 
2076   EVT_TRIG_TRACE(JVMTI_EVENT_MONITOR_WAIT,
2077                      ("JVMTI [%s] montior wait event triggered",
2078                       JvmtiTrace::safe_get_thread_name(thread)));
2079 
2080   JvmtiEnvThreadStateIterator it(state);
2081   for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
2082     if (ets->is_enabled(JVMTI_EVENT_MONITOR_WAIT)) {
2083       EVT_TRACE(JVMTI_EVENT_MONITOR_WAIT,
2084                    ("JVMTI [%s] monitor wait event sent ",
2085                     JvmtiTrace::safe_get_thread_name(thread)));
2086       JvmtiMonitorEventMark  jem(thread, h());
2087       JvmtiEnv *env = ets->get_env();
2088       JvmtiThreadEventTransition jet(thread);
2089       jvmtiEventMonitorWait callback = env->callbacks()->MonitorWait;
2090       if (callback != NULL) {
2091         (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(),
2092                     jem.jni_object(), timeout);
2093       }
2094     }
2095   }
2096 }
2097 
2098 void JvmtiExport::post_monitor_waited(JavaThread *thread, ObjectMonitor *obj_mntr, jboolean timed_out) {
2099   oop object = (oop)obj_mntr->object();
2100   if (!ServiceUtil::visible_oop(object)) {
2101     // Ignore monitor waited for vm internal object.
2102     return;
2103   }
2104   JvmtiThreadState *state = thread->jvmti_thread_state();
2105   if (state == NULL) {
2106     return;
2107   }
2108 
2109   HandleMark hm(thread);
2110   Handle h(thread, object);
2111 
2112   EVT_TRIG_TRACE(JVMTI_EVENT_MONITOR_WAITED,
2113                      ("JVMTI [%s] montior waited event triggered",
2114                       JvmtiTrace::safe_get_thread_name(thread)));
2115 
2116   JvmtiEnvThreadStateIterator it(state);
2117   for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
2118     if (ets->is_enabled(JVMTI_EVENT_MONITOR_WAITED)) {
2119       EVT_TRACE(JVMTI_EVENT_MONITOR_WAITED,
2120                    ("JVMTI [%s] monitor waited event sent ",
2121                     JvmtiTrace::safe_get_thread_name(thread)));
2122       JvmtiMonitorEventMark  jem(thread, h());
2123       JvmtiEnv *env = ets->get_env();
2124       JvmtiThreadEventTransition jet(thread);
2125       jvmtiEventMonitorWaited callback = env->callbacks()->MonitorWaited;
2126       if (callback != NULL) {
2127         (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(),
2128                     jem.jni_object(), timed_out);
2129       }
2130     }
2131   }
2132 }
2133 
2134 
2135 void JvmtiExport::post_vm_object_alloc(JavaThread *thread,  oop object) {
2136   EVT_TRIG_TRACE(JVMTI_EVENT_VM_OBJECT_ALLOC, ("JVMTI [%s] Trg vm object alloc triggered",
2137                       JvmtiTrace::safe_get_thread_name(thread)));
2138   if (object == NULL) {
2139     return;
2140   }
2141   HandleMark hm(thread);
2142   Handle h(thread, object);
2143   JvmtiEnvIterator it;
2144   for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
2145     if (env->is_enabled(JVMTI_EVENT_VM_OBJECT_ALLOC)) {
2146       EVT_TRACE(JVMTI_EVENT_VM_OBJECT_ALLOC, ("JVMTI [%s] Evt vmobject alloc sent %s",
2147                                          JvmtiTrace::safe_get_thread_name(thread),
2148                                          object==NULL? "NULL" : Klass::cast(java_lang_Class::as_klassOop(object))->external_name()));
2149 
2150       JvmtiVMObjectAllocEventMark jem(thread, h());
2151       JvmtiJavaThreadEventTransition jet(thread);
2152       jvmtiEventVMObjectAlloc callback = env->callbacks()->VMObjectAlloc;
2153       if (callback != NULL) {
2154         (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(),
2155                     jem.jni_jobject(), jem.jni_class(), jem.size());
2156       }
2157     }
2158   }
2159 }
2160 
2161 ////////////////////////////////////////////////////////////////////////////////////////////////
2162 
2163 void JvmtiExport::cleanup_thread(JavaThread* thread) {
2164   assert(JavaThread::current() == thread, "thread is not current");
2165 
2166 
2167   // This has to happen after the thread state is removed, which is
2168   // why it is not in post_thread_end_event like its complement
2169   // Maybe both these functions should be rolled into the posts?
2170   JvmtiEventController::thread_ended(thread);
2171 }
2172 
2173 void JvmtiExport::oops_do(OopClosure* f) {
2174   JvmtiCurrentBreakpoints::oops_do(f);
2175   JvmtiVMObjectAllocEventCollector::oops_do_for_all_threads(f);
2176 }
2177 
2178 // Onload raw monitor transition.
2179 void JvmtiExport::transition_pending_onload_raw_monitors() {
2180   JvmtiPendingMonitors::transition_raw_monitors();
2181 }
2182 
2183 ////////////////////////////////////////////////////////////////////////////////////////////////
2184 
2185 // type for the Agent_OnAttach entry point
2186 extern "C" {
2187   typedef jint (JNICALL *OnAttachEntry_t)(JavaVM*, char *, void *);
2188 }
2189 
2190 #ifndef SERVICES_KERNEL
2191 jint JvmtiExport::load_agent_library(AttachOperation* op, outputStream* st) {
2192   char ebuf[1024];
2193   char buffer[JVM_MAXPATHLEN];
2194   void* library;
2195   jint result = JNI_ERR;
2196 
2197   // get agent name and options
2198   const char* agent = op->arg(0);
2199   const char* absParam = op->arg(1);
2200   const char* options = op->arg(2);
2201 
2202   // The abs paramter should be "true" or "false"
2203   bool is_absolute_path = (absParam != NULL) && (strcmp(absParam,"true")==0);
2204 
2205 
2206   // If the path is absolute we attempt to load the library. Otherwise we try to
2207   // load it from the standard dll directory.
2208 
2209   if (is_absolute_path) {
2210     library = hpi::dll_load(agent, ebuf, sizeof ebuf);
2211   } else {
2212     // Try to load the agent from the standard dll directory
2213     hpi::dll_build_name(buffer, sizeof(buffer), Arguments::get_dll_dir(), agent);
2214     library = hpi::dll_load(buffer, ebuf, sizeof ebuf);
2215     if (library == NULL) {
2216       // not found - try local path
2217       char ns[1] = {0};
2218       hpi::dll_build_name(buffer, sizeof(buffer), ns, agent);
2219       library = hpi::dll_load(buffer, ebuf, sizeof ebuf);
2220     }
2221   }
2222 
2223   // If the library was loaded then we attempt to invoke the Agent_OnAttach
2224   // function
2225   if (library != NULL) {
2226 
2227     // Lookup the Agent_OnAttach function
2228     OnAttachEntry_t on_attach_entry = NULL;
2229     const char *on_attach_symbols[] = AGENT_ONATTACH_SYMBOLS;
2230     for (uint symbol_index = 0; symbol_index < ARRAY_SIZE(on_attach_symbols); symbol_index++) {
2231       on_attach_entry =
2232         CAST_TO_FN_PTR(OnAttachEntry_t, hpi::dll_lookup(library, on_attach_symbols[symbol_index]));
2233       if (on_attach_entry != NULL) break;
2234     }
2235 
2236     if (on_attach_entry == NULL) {
2237       // Agent_OnAttach missing - unload library
2238       hpi::dll_unload(library);
2239     } else {
2240       // Invoke the Agent_OnAttach function
2241       JavaThread* THREAD = JavaThread::current();
2242       {
2243         extern struct JavaVM_ main_vm;
2244         JvmtiThreadEventMark jem(THREAD);
2245         JvmtiJavaThreadEventTransition jet(THREAD);
2246 
2247         result = (*on_attach_entry)(&main_vm, (char*)options, NULL);
2248       }
2249 
2250       // Agent_OnAttach may have used JNI
2251       if (HAS_PENDING_EXCEPTION) {
2252         CLEAR_PENDING_EXCEPTION;
2253       }
2254 
2255       // If OnAttach returns JNI_OK then we add it to the list of
2256       // agent libraries so that we can call Agent_OnUnload later.
2257       if (result == JNI_OK) {
2258         Arguments::add_loaded_agent(agent, (char*)options, is_absolute_path, library);
2259       }
2260 
2261       // Agent_OnAttach executed so completion status is JNI_OK
2262       st->print_cr("%d", result);
2263       result = JNI_OK;
2264     }
2265   }
2266   return result;
2267 }
2268 #endif // SERVICES_KERNEL
2269 
2270 // CMS has completed referencing processing so may need to update
2271 // tag maps.
2272 void JvmtiExport::cms_ref_processing_epilogue() {
2273   if (JvmtiEnv::environments_might_exist()) {
2274     JvmtiTagMap::cms_ref_processing_epilogue();
2275   }
2276 }
2277 
2278 
2279 ////////////////////////////////////////////////////////////////////////////////////////////////
2280 
2281 // Setup current current thread for event collection.
2282 void JvmtiEventCollector::setup_jvmti_thread_state() {
2283   // set this event collector to be the current one.
2284   JvmtiThreadState* state = JvmtiThreadState::state_for(JavaThread::current());
2285   if (is_vm_object_alloc_event()) {
2286     _prev = state->get_vm_object_alloc_event_collector();
2287     state->set_vm_object_alloc_event_collector((JvmtiVMObjectAllocEventCollector *)this);
2288   } else if (is_dynamic_code_event()) {
2289     _prev = state->get_dynamic_code_event_collector();
2290     state->set_dynamic_code_event_collector((JvmtiDynamicCodeEventCollector *)this);
2291   }
2292 }
2293 
2294 // Unset current event collection in this thread and reset it with previous
2295 // collector.
2296 void JvmtiEventCollector::unset_jvmti_thread_state() {
2297   JvmtiThreadState* state = JavaThread::current()->jvmti_thread_state();
2298   if (state != NULL) {
2299     // restore the previous event collector (if any)
2300     if (is_vm_object_alloc_event()) {
2301       if (state->get_vm_object_alloc_event_collector() == this) {
2302         state->set_vm_object_alloc_event_collector((JvmtiVMObjectAllocEventCollector *)_prev);
2303       } else {
2304         // this thread's jvmti state was created during the scope of
2305         // the event collector.
2306       }
2307     } else {
2308       if (is_dynamic_code_event()) {
2309         if (state->get_dynamic_code_event_collector() == this) {
2310           state->set_dynamic_code_event_collector((JvmtiDynamicCodeEventCollector *)_prev);
2311         } else {
2312           // this thread's jvmti state was created during the scope of
2313           // the event collector.
2314         }
2315       }
2316     }
2317   }
2318 }
2319 
2320 // create the dynamic code event collector
2321 JvmtiDynamicCodeEventCollector::JvmtiDynamicCodeEventCollector() : _code_blobs(NULL) {
2322   if (JvmtiExport::should_post_dynamic_code_generated()) {
2323     setup_jvmti_thread_state();
2324   }
2325 }
2326 
2327 // iterate over any code blob descriptors collected and post a
2328 // DYNAMIC_CODE_GENERATED event to the profiler.
2329 JvmtiDynamicCodeEventCollector::~JvmtiDynamicCodeEventCollector() {
2330   assert(!JavaThread::current()->owns_locks(), "all locks must be released to post deferred events");
2331  // iterate over any code blob descriptors that we collected
2332  if (_code_blobs != NULL) {
2333    for (int i=0; i<_code_blobs->length(); i++) {
2334      JvmtiCodeBlobDesc* blob = _code_blobs->at(i);
2335      JvmtiExport::post_dynamic_code_generated(blob->name(), blob->code_begin(), blob->code_end());
2336      FreeHeap(blob);
2337    }
2338    delete _code_blobs;
2339  }
2340  unset_jvmti_thread_state();
2341 }
2342 
2343 // register a stub
2344 void JvmtiDynamicCodeEventCollector::register_stub(const char* name, address start, address end) {
2345  if (_code_blobs == NULL) {
2346    _code_blobs = new (ResourceObj::C_HEAP) GrowableArray<JvmtiCodeBlobDesc*>(1,true);
2347  }
2348  _code_blobs->append(new JvmtiCodeBlobDesc(name, start, end));
2349 }
2350 
2351 // Setup current thread to record vm allocated objects.
2352 JvmtiVMObjectAllocEventCollector::JvmtiVMObjectAllocEventCollector() : _allocated(NULL) {
2353   if (JvmtiExport::should_post_vm_object_alloc()) {
2354     _enable = true;
2355     setup_jvmti_thread_state();
2356   } else {
2357     _enable = false;
2358   }
2359 }
2360 
2361 // Post vm_object_alloc event for vm allocated objects visible to java
2362 // world.
2363 JvmtiVMObjectAllocEventCollector::~JvmtiVMObjectAllocEventCollector() {
2364   if (_allocated != NULL) {
2365     set_enabled(false);
2366     for (int i = 0; i < _allocated->length(); i++) {
2367       oop obj = _allocated->at(i);
2368       if (ServiceUtil::visible_oop(obj)) {
2369         JvmtiExport::post_vm_object_alloc(JavaThread::current(), obj);
2370       }
2371     }
2372     delete _allocated;
2373   }
2374   unset_jvmti_thread_state();
2375 }
2376 
2377 void JvmtiVMObjectAllocEventCollector::record_allocation(oop obj) {
2378   assert(is_enabled(), "VM object alloc event collector is not enabled");
2379   if (_allocated == NULL) {
2380     _allocated = new (ResourceObj::C_HEAP) GrowableArray<oop>(1, true);
2381   }
2382   _allocated->push(obj);
2383 }
2384 
2385 // GC support.
2386 void JvmtiVMObjectAllocEventCollector::oops_do(OopClosure* f) {
2387   if (_allocated != NULL) {
2388     for(int i=_allocated->length() - 1; i >= 0; i--) {
2389       if (_allocated->at(i) != NULL) {
2390         f->do_oop(_allocated->adr_at(i));
2391       }
2392     }
2393   }
2394 }
2395 
2396 void JvmtiVMObjectAllocEventCollector::oops_do_for_all_threads(OopClosure* f) {
2397   // no-op if jvmti not enabled
2398   if (!JvmtiEnv::environments_might_exist()) {
2399     return;
2400   }
2401 
2402   // Runs at safepoint. So no need to acquire Threads_lock.
2403   for (JavaThread *jthr = Threads::first(); jthr != NULL; jthr = jthr->next()) {
2404     JvmtiThreadState *state = jthr->jvmti_thread_state();
2405     if (state != NULL) {
2406       JvmtiVMObjectAllocEventCollector *collector;
2407       collector = state->get_vm_object_alloc_event_collector();
2408       while (collector != NULL) {
2409         collector->oops_do(f);
2410         collector = (JvmtiVMObjectAllocEventCollector *)collector->get_prev();
2411       }
2412     }
2413   }
2414 }
2415 
2416 
2417 // Disable collection of VMObjectAlloc events
2418 NoJvmtiVMObjectAllocMark::NoJvmtiVMObjectAllocMark() : _collector(NULL) {
2419   // a no-op if VMObjectAlloc event is not enabled
2420   if (!JvmtiExport::should_post_vm_object_alloc()) {
2421     return;
2422   }
2423   Thread* thread = ThreadLocalStorage::thread();
2424   if (thread != NULL && thread->is_Java_thread())  {
2425     JavaThread* current_thread = (JavaThread*)thread;
2426     JvmtiThreadState *state = current_thread->jvmti_thread_state();
2427     if (state != NULL) {
2428       JvmtiVMObjectAllocEventCollector *collector;
2429       collector = state->get_vm_object_alloc_event_collector();
2430       if (collector != NULL && collector->is_enabled()) {
2431         _collector = collector;
2432         _collector->set_enabled(false);
2433       }
2434     }
2435   }
2436 }
2437 
2438 // Re-Enable collection of VMObjectAlloc events (if previously enabled)
2439 NoJvmtiVMObjectAllocMark::~NoJvmtiVMObjectAllocMark() {
2440   if (was_enabled()) {
2441     _collector->set_enabled(true);
2442   }
2443 };
2444 
2445 JvmtiGCMarker::JvmtiGCMarker(bool full) : _full(full), _invocation_count(0) {
2446   assert(Thread::current()->is_VM_thread(), "wrong thread");
2447 
2448   // if there aren't any JVMTI environments then nothing to do
2449   if (!JvmtiEnv::environments_might_exist()) {
2450     return;
2451   }
2452 
2453   if (ForceFullGCJVMTIEpilogues) {
2454     // force 'Full GC' was done semantics for JVMTI GC epilogues
2455     _full = true;
2456   }
2457 
2458   // GarbageCollectionStart event posted from VM thread - okay because
2459   // JVMTI is clear that the "world is stopped" and callback shouldn't
2460   // try to call into the VM.
2461   if (JvmtiExport::should_post_garbage_collection_start()) {
2462     JvmtiExport::post_garbage_collection_start();
2463   }
2464 
2465   // if "full" is false it probably means this is a scavenge of the young
2466   // generation. However it could turn out that a "full" GC is required
2467   // so we record the number of collections so that it can be checked in
2468   // the destructor.
2469   if (!_full) {
2470     _invocation_count = Universe::heap()->total_full_collections();
2471   }
2472 
2473   // Do clean up tasks that need to be done at a safepoint
2474   JvmtiEnvBase::check_for_periodic_clean_up();
2475 }
2476 
2477 JvmtiGCMarker::~JvmtiGCMarker() {
2478   // if there aren't any JVMTI environments then nothing to do
2479   if (!JvmtiEnv::environments_might_exist()) {
2480     return;
2481   }
2482 
2483   // JVMTI notify gc finish
2484   if (JvmtiExport::should_post_garbage_collection_finish()) {
2485     JvmtiExport::post_garbage_collection_finish();
2486   }
2487 
2488   // we might have initially started out doing a scavenge of the young
2489   // generation but could have ended up doing a "full" GC - check the
2490   // GC count to see.
2491   if (!_full) {
2492     _full = (_invocation_count != Universe::heap()->total_full_collections());
2493   }
2494 
2495   // Full collection probably means the perm generation has been GC'ed
2496   // so we clear the breakpoint cache.
2497   if (_full) {
2498     JvmtiCurrentBreakpoints::gc_epilogue();
2499   }
2500 
2501   // Notify heap/object tagging support
2502   JvmtiTagMap::gc_epilogue(_full);
2503 }
2504 #endif // JVMTI_KERNEL