src/share/vm/prims/jvmtiImpl.cpp

changeset 2624
46a56fac55c7
parent 2583
f91db74a6810
child 2836
0cddebc420d8
     1.1 --- a/src/share/vm/prims/jvmtiImpl.cpp	Tue Mar 15 06:35:10 2011 -0700
     1.2 +++ b/src/share/vm/prims/jvmtiImpl.cpp	Tue Mar 15 06:37:31 2011 -0700
     1.3 @@ -919,15 +919,24 @@
     1.4      nmethod* nm) {
     1.5    JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_LOAD);
     1.6    event._event_data.compiled_method_load = nm;
     1.7 -  nmethodLocker::lock_nmethod(nm); // will be unlocked when posted
     1.8 +  // Keep the nmethod alive until the ServiceThread can process
     1.9 +  // this deferred event.
    1.10 +  nmethodLocker::lock_nmethod(nm);
    1.11    return event;
    1.12  }
    1.13  
    1.14  JvmtiDeferredEvent JvmtiDeferredEvent::compiled_method_unload_event(
    1.15 -    jmethodID id, const void* code) {
    1.16 +    nmethod* nm, jmethodID id, const void* code) {
    1.17    JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_UNLOAD);
    1.18 +  event._event_data.compiled_method_unload.nm = nm;
    1.19    event._event_data.compiled_method_unload.method_id = id;
    1.20    event._event_data.compiled_method_unload.code_begin = code;
    1.21 +  // Keep the nmethod alive until the ServiceThread can process
    1.22 +  // this deferred event. This will keep the memory for the
    1.23 +  // generated code from being reused too early. We pass
    1.24 +  // zombie_ok == true here so that our nmethod that was just
    1.25 +  // made into a zombie can be locked.
    1.26 +  nmethodLocker::lock_nmethod(nm, true /* zombie_ok */);
    1.27    return event;
    1.28  }
    1.29  JvmtiDeferredEvent JvmtiDeferredEvent::dynamic_code_generated_event(
    1.30 @@ -946,14 +955,19 @@
    1.31      case TYPE_COMPILED_METHOD_LOAD: {
    1.32        nmethod* nm = _event_data.compiled_method_load;
    1.33        JvmtiExport::post_compiled_method_load(nm);
    1.34 +      // done with the deferred event so unlock the nmethod
    1.35        nmethodLocker::unlock_nmethod(nm);
    1.36        break;
    1.37      }
    1.38 -    case TYPE_COMPILED_METHOD_UNLOAD:
    1.39 +    case TYPE_COMPILED_METHOD_UNLOAD: {
    1.40 +      nmethod* nm = _event_data.compiled_method_unload.nm;
    1.41        JvmtiExport::post_compiled_method_unload(
    1.42          _event_data.compiled_method_unload.method_id,
    1.43          _event_data.compiled_method_unload.code_begin);
    1.44 +      // done with the deferred event so unlock the nmethod
    1.45 +      nmethodLocker::unlock_nmethod(nm);
    1.46        break;
    1.47 +    }
    1.48      case TYPE_DYNAMIC_CODE_GENERATED:
    1.49        JvmtiExport::post_dynamic_code_generated_internal(
    1.50          _event_data.dynamic_code_generated.name,

mercurial