mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 11:34:38 +02:00
7024970: 2/3 assert(ServiceThread::is_service_thread(Thread::current())) failed: Service thread must post enqueue
Change nmethod_lock() to also prevent zombification of the nmethod. CompiledMethodUnload events also need to lock the nmethod. Clean ups in nmethod::make_not_entrant_or_zombie() Reviewed-by: dholmes, kamg, never, dsamersoff, ysr, coleenp, acorn
This commit is contained in:
parent
0c3498d374
commit
c4e301bffa
4 changed files with 52 additions and 26 deletions
|
@ -919,15 +919,24 @@ JvmtiDeferredEvent JvmtiDeferredEvent::compiled_method_load_event(
|
|||
nmethod* nm) {
|
||||
JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_LOAD);
|
||||
event._event_data.compiled_method_load = nm;
|
||||
nmethodLocker::lock_nmethod(nm); // will be unlocked when posted
|
||||
// Keep the nmethod alive until the ServiceThread can process
|
||||
// this deferred event.
|
||||
nmethodLocker::lock_nmethod(nm);
|
||||
return event;
|
||||
}
|
||||
|
||||
JvmtiDeferredEvent JvmtiDeferredEvent::compiled_method_unload_event(
|
||||
jmethodID id, const void* code) {
|
||||
nmethod* nm, jmethodID id, const void* code) {
|
||||
JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_UNLOAD);
|
||||
event._event_data.compiled_method_unload.nm = nm;
|
||||
event._event_data.compiled_method_unload.method_id = id;
|
||||
event._event_data.compiled_method_unload.code_begin = code;
|
||||
// Keep the nmethod alive until the ServiceThread can process
|
||||
// this deferred event. This will keep the memory for the
|
||||
// generated code from being reused too early. We pass
|
||||
// zombie_ok == true here so that our nmethod that was just
|
||||
// made into a zombie can be locked.
|
||||
nmethodLocker::lock_nmethod(nm, true /* zombie_ok */);
|
||||
return event;
|
||||
}
|
||||
JvmtiDeferredEvent JvmtiDeferredEvent::dynamic_code_generated_event(
|
||||
|
@ -946,14 +955,19 @@ void JvmtiDeferredEvent::post() {
|
|||
case TYPE_COMPILED_METHOD_LOAD: {
|
||||
nmethod* nm = _event_data.compiled_method_load;
|
||||
JvmtiExport::post_compiled_method_load(nm);
|
||||
// done with the deferred event so unlock the nmethod
|
||||
nmethodLocker::unlock_nmethod(nm);
|
||||
break;
|
||||
}
|
||||
case TYPE_COMPILED_METHOD_UNLOAD:
|
||||
case TYPE_COMPILED_METHOD_UNLOAD: {
|
||||
nmethod* nm = _event_data.compiled_method_unload.nm;
|
||||
JvmtiExport::post_compiled_method_unload(
|
||||
_event_data.compiled_method_unload.method_id,
|
||||
_event_data.compiled_method_unload.code_begin);
|
||||
// done with the deferred event so unlock the nmethod
|
||||
nmethodLocker::unlock_nmethod(nm);
|
||||
break;
|
||||
}
|
||||
case TYPE_DYNAMIC_CODE_GENERATED:
|
||||
JvmtiExport::post_dynamic_code_generated_internal(
|
||||
_event_data.dynamic_code_generated.name,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue