< prev index next >

src/hotspot/share/prims/jvmtiImpl.cpp

Print this page




 926   // generated code from being reused too early. We pass
 927   // zombie_ok == true here so that our nmethod that was just
 928   // made into a zombie can be locked.
 929   nmethodLocker::lock_nmethod(nm, true /* zombie_ok */);
 930   return event;
 931 }
 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   // Need to make a copy of the name since we don't know how long
 937   // the event poster will keep it around after we enqueue the
 938   // deferred event and return. strdup() failure is handled in
 939   // the post() routine below.
 940   event._event_data.dynamic_code_generated.name = os::strdup(name);
 941   event._event_data.dynamic_code_generated.code_begin = code_begin;
 942   event._event_data.dynamic_code_generated.code_end = code_end;
 943   return event;
 944 }
 945 










 946 void JvmtiDeferredEvent::post() {
 947   assert(ServiceThread::is_service_thread(Thread::current()),
 948          "Service thread must post enqueued events");
 949   switch(_type) {
 950     case TYPE_COMPILED_METHOD_LOAD: {
 951       nmethod* nm = _event_data.compiled_method_load;
 952       JvmtiExport::post_compiled_method_load(nm);
 953       // done with the deferred event so unlock the nmethod
 954       nmethodLocker::unlock_nmethod(nm);
 955       break;
 956     }
 957     case TYPE_COMPILED_METHOD_UNLOAD: {
 958       nmethod* nm = _event_data.compiled_method_unload.nm;
 959       JvmtiExport::post_compiled_method_unload(
 960         _event_data.compiled_method_unload.method_id,
 961         _event_data.compiled_method_unload.code_begin);
 962       // done with the deferred event so unlock the nmethod
 963       nmethodLocker::unlock_nmethod(nm);
 964       break;
 965     }
 966     case TYPE_DYNAMIC_CODE_GENERATED: {
 967       JvmtiExport::post_dynamic_code_generated_internal(
 968         // if strdup failed give the event a default name
 969         (_event_data.dynamic_code_generated.name == NULL)
 970           ? "unknown_code" : _event_data.dynamic_code_generated.name,
 971         _event_data.dynamic_code_generated.code_begin,
 972         _event_data.dynamic_code_generated.code_end);
 973       if (_event_data.dynamic_code_generated.name != NULL) {
 974         // release our copy
 975         os::free((void *)_event_data.dynamic_code_generated.name);











 976       }
 977       break;
 978     }
 979     default:
 980       ShouldNotReachHere();
 981   }
 982 }
 983 
 984 JvmtiDeferredEventQueue::QueueNode* JvmtiDeferredEventQueue::_queue_tail = NULL;
 985 JvmtiDeferredEventQueue::QueueNode* JvmtiDeferredEventQueue::_queue_head = NULL;
 986 
 987 bool JvmtiDeferredEventQueue::has_events() {
 988   assert(Service_lock->owned_by_self(), "Must own Service_lock");
 989   return _queue_head != NULL;
 990 }
 991 
 992 void JvmtiDeferredEventQueue::enqueue(const JvmtiDeferredEvent& event) {
 993   assert(Service_lock->owned_by_self(), "Must own Service_lock");
 994 
 995   // Events get added to the end of the queue (and are pulled off the front).




 926   // generated code from being reused too early. We pass
 927   // zombie_ok == true here so that our nmethod that was just
 928   // made into a zombie can be locked.
 929   nmethodLocker::lock_nmethod(nm, true /* zombie_ok */);
 930   return event;
 931 }
 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   // Need to make a copy of the name since we don't know how long
 937   // the event poster will keep it around after we enqueue the
 938   // deferred event and return. strdup() failure is handled in
 939   // the post() routine below.
 940   event._event_data.dynamic_code_generated.name = os::strdup(name);
 941   event._event_data.dynamic_code_generated.code_begin = code_begin;
 942   event._event_data.dynamic_code_generated.code_end = code_end;
 943   return event;
 944 }
 945 
 946 JvmtiDeferredEvent JvmtiDeferredEvent::class_unload_event(const char* name) {
 947   JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_CLASS_UNLOADED);
 948   // Need to make a copy of the name since we don't know how long
 949   // the event poster will keep it around after we enqueue the
 950   // deferred event and return. strdup() failure is handled in
 951   // the post() routine below.
 952   event._event_data.class_unloaded.name = os::strdup(name);
 953   return event;
 954 }
 955 
 956 void JvmtiDeferredEvent::post() {
 957   assert(ServiceThread::is_service_thread(Thread::current()),
 958          "Service thread must post enqueued events");
 959   switch(_type) {
 960     case TYPE_COMPILED_METHOD_LOAD: {
 961       nmethod* nm = _event_data.compiled_method_load;
 962       JvmtiExport::post_compiled_method_load(nm);
 963       // done with the deferred event so unlock the nmethod
 964       nmethodLocker::unlock_nmethod(nm);
 965       break;
 966     }
 967     case TYPE_COMPILED_METHOD_UNLOAD: {
 968       nmethod* nm = _event_data.compiled_method_unload.nm;
 969       JvmtiExport::post_compiled_method_unload(
 970         _event_data.compiled_method_unload.method_id,
 971         _event_data.compiled_method_unload.code_begin);
 972       // done with the deferred event so unlock the nmethod
 973       nmethodLocker::unlock_nmethod(nm);
 974       break;
 975     }
 976     case TYPE_DYNAMIC_CODE_GENERATED: {
 977       JvmtiExport::post_dynamic_code_generated_internal(
 978         // if strdup failed give the event a default name
 979         (_event_data.dynamic_code_generated.name == NULL)
 980           ? "unknown_code" : _event_data.dynamic_code_generated.name,
 981         _event_data.dynamic_code_generated.code_begin,
 982         _event_data.dynamic_code_generated.code_end);
 983       if (_event_data.dynamic_code_generated.name != NULL) {
 984         // release our copy
 985         os::free((void *)_event_data.dynamic_code_generated.name);
 986       }
 987       break;
 988     }
 989     case TYPE_CLASS_UNLOADED: {
 990       JvmtiExport::post_class_unload_internal(
 991         // if strdup failed give the event a default name
 992         (_event_data.class_unloaded.name == NULL)
 993           ? "unknown_class" : _event_data.class_unloaded.name);
 994       if (_event_data.class_unloaded.name != NULL) {
 995         // release our copy
 996         os::free((void *)_event_data.class_unloaded.name);
 997       }
 998       break;
 999     }
1000     default:
1001       ShouldNotReachHere();
1002   }
1003 }
1004 
1005 JvmtiDeferredEventQueue::QueueNode* JvmtiDeferredEventQueue::_queue_tail = NULL;
1006 JvmtiDeferredEventQueue::QueueNode* JvmtiDeferredEventQueue::_queue_head = NULL;
1007 
1008 bool JvmtiDeferredEventQueue::has_events() {
1009   assert(Service_lock->owned_by_self(), "Must own Service_lock");
1010   return _queue_head != NULL;
1011 }
1012 
1013 void JvmtiDeferredEventQueue::enqueue(const JvmtiDeferredEvent& event) {
1014   assert(Service_lock->owned_by_self(), "Must own Service_lock");
1015 
1016   // Events get added to the end of the queue (and are pulled off the front).


< prev index next >