src/share/vm/prims/jvmtiImpl.cpp

Print this page




 902     const char *name   = JvmtiTrace::safe_get_thread_name(thread);
 903 #else
 904     const char *name   = "";
 905 #endif /*JVMTI_TRACE */
 906     tty->print("%s(%c ", name, thread->is_being_ext_suspended() ? 'S' : '_');
 907     if (!thread->has_last_Java_frame()) {
 908       tty->print("no stack");
 909     }
 910     tty->print(") ");
 911   }
 912   tty->print_cr("]");
 913 #endif
 914 }
 915 
 916 #ifndef KERNEL
 917 
 918 JvmtiDeferredEvent JvmtiDeferredEvent::compiled_method_load_event(
 919     nmethod* nm) {
 920   JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_LOAD);
 921   event._event_data.compiled_method_load = nm;
 922   nmethodLocker::lock_nmethod(nm); // will be unlocked when posted


 923   return event;
 924 }
 925 
 926 JvmtiDeferredEvent JvmtiDeferredEvent::compiled_method_unload_event(
 927     jmethodID id, const void* code) {
 928   JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_UNLOAD);

 929   event._event_data.compiled_method_unload.method_id = id;
 930   event._event_data.compiled_method_unload.code_begin = code;






 931   return event;
 932 }
 933 JvmtiDeferredEvent JvmtiDeferredEvent::dynamic_code_generated_event(
 934       const char* name, const void* code_begin, const void* code_end) {
 935   JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_DYNAMIC_CODE_GENERATED);
 936   event._event_data.dynamic_code_generated.name = name;
 937   event._event_data.dynamic_code_generated.code_begin = code_begin;
 938   event._event_data.dynamic_code_generated.code_end = code_end;
 939   return event;
 940 }
 941 
 942 void JvmtiDeferredEvent::post() {
 943   assert(ServiceThread::is_service_thread(Thread::current()),
 944          "Service thread must post enqueued events");
 945   switch(_type) {
 946     case TYPE_COMPILED_METHOD_LOAD: {
 947       nmethod* nm = _event_data.compiled_method_load;
 948       JvmtiExport::post_compiled_method_load(nm);

 949       nmethodLocker::unlock_nmethod(nm);
 950       break;
 951     }
 952     case TYPE_COMPILED_METHOD_UNLOAD:

 953       JvmtiExport::post_compiled_method_unload(
 954         _event_data.compiled_method_unload.method_id,
 955         _event_data.compiled_method_unload.code_begin);


 956       break;

 957     case TYPE_DYNAMIC_CODE_GENERATED:
 958       JvmtiExport::post_dynamic_code_generated_internal(
 959         _event_data.dynamic_code_generated.name,
 960         _event_data.dynamic_code_generated.code_begin,
 961         _event_data.dynamic_code_generated.code_end);
 962       break;
 963     default:
 964       ShouldNotReachHere();
 965   }
 966 }
 967 
 968 JvmtiDeferredEventQueue::QueueNode* JvmtiDeferredEventQueue::_queue_tail = NULL;
 969 JvmtiDeferredEventQueue::QueueNode* JvmtiDeferredEventQueue::_queue_head = NULL;
 970 
 971 volatile JvmtiDeferredEventQueue::QueueNode*
 972     JvmtiDeferredEventQueue::_pending_list = NULL;
 973 
 974 bool JvmtiDeferredEventQueue::has_events() {
 975   assert(Service_lock->owned_by_self(), "Must own Service_lock");
 976   return _queue_head != NULL || _pending_list != NULL;




 902     const char *name   = JvmtiTrace::safe_get_thread_name(thread);
 903 #else
 904     const char *name   = "";
 905 #endif /*JVMTI_TRACE */
 906     tty->print("%s(%c ", name, thread->is_being_ext_suspended() ? 'S' : '_');
 907     if (!thread->has_last_Java_frame()) {
 908       tty->print("no stack");
 909     }
 910     tty->print(") ");
 911   }
 912   tty->print_cr("]");
 913 #endif
 914 }
 915 
 916 #ifndef KERNEL
 917 
 918 JvmtiDeferredEvent JvmtiDeferredEvent::compiled_method_load_event(
 919     nmethod* nm) {
 920   JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_LOAD);
 921   event._event_data.compiled_method_load = nm;
 922   // Keep the nmethod alive until the ServiceThread can process
 923   // this deferred event.
 924   nmethodLocker::lock_nmethod(nm);
 925   return event;
 926 }
 927 
 928 JvmtiDeferredEvent JvmtiDeferredEvent::compiled_method_unload_event(
 929     nmethod* nm, jmethodID id, const void* code) {
 930   JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_UNLOAD);
 931   event._event_data.compiled_method_unload.nm = nm;
 932   event._event_data.compiled_method_unload.method_id = id;
 933   event._event_data.compiled_method_unload.code_begin = code;
 934   // Keep the nmethod alive until the ServiceThread can process
 935   // this deferred event. This will keep the memory for the
 936   // generated code from being reused too early. We pass
 937   // zombie_ok == true here so that our nmethod that was just
 938   // made into a zombie can be locked. 
 939   nmethodLocker::lock_nmethod(nm, true /* zombie_ok */);
 940   return event;
 941 }
 942 JvmtiDeferredEvent JvmtiDeferredEvent::dynamic_code_generated_event(
 943       const char* name, const void* code_begin, const void* code_end) {
 944   JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_DYNAMIC_CODE_GENERATED);
 945   event._event_data.dynamic_code_generated.name = name;
 946   event._event_data.dynamic_code_generated.code_begin = code_begin;
 947   event._event_data.dynamic_code_generated.code_end = code_end;
 948   return event;
 949 }
 950 
 951 void JvmtiDeferredEvent::post() {
 952   assert(ServiceThread::is_service_thread(Thread::current()),
 953          "Service thread must post enqueued events");
 954   switch(_type) {
 955     case TYPE_COMPILED_METHOD_LOAD: {
 956       nmethod* nm = _event_data.compiled_method_load;
 957       JvmtiExport::post_compiled_method_load(nm);
 958       // done with the deferred event so unlock the nmethod
 959       nmethodLocker::unlock_nmethod(nm);
 960       break;
 961     }
 962     case TYPE_COMPILED_METHOD_UNLOAD: {
 963       nmethod* nm = _event_data.compiled_method_unload.nm;
 964       JvmtiExport::post_compiled_method_unload(
 965         _event_data.compiled_method_unload.method_id,
 966         _event_data.compiled_method_unload.code_begin);
 967       // done with the deferred event so unlock the nmethod
 968       nmethodLocker::unlock_nmethod(nm);
 969       break;
 970     }
 971     case TYPE_DYNAMIC_CODE_GENERATED:
 972       JvmtiExport::post_dynamic_code_generated_internal(
 973         _event_data.dynamic_code_generated.name,
 974         _event_data.dynamic_code_generated.code_begin,
 975         _event_data.dynamic_code_generated.code_end);
 976       break;
 977     default:
 978       ShouldNotReachHere();
 979   }
 980 }
 981 
 982 JvmtiDeferredEventQueue::QueueNode* JvmtiDeferredEventQueue::_queue_tail = NULL;
 983 JvmtiDeferredEventQueue::QueueNode* JvmtiDeferredEventQueue::_queue_head = NULL;
 984 
 985 volatile JvmtiDeferredEventQueue::QueueNode*
 986     JvmtiDeferredEventQueue::_pending_list = NULL;
 987 
 988 bool JvmtiDeferredEventQueue::has_events() {
 989   assert(Service_lock->owned_by_self(), "Must own Service_lock");
 990   return _queue_head != NULL || _pending_list != NULL;