@@ -307,6 +307,7 @@ class JvmtiEventControllerPrivate : public AllStatic {
307307 static void trace_changed (jlong now_enabled, jlong changed);
308308
309309 static void flush_object_free_events (JvmtiEnvBase *env);
310+ static void set_enabled_events_with_lock (JvmtiEnvBase *env, jlong now_enabled);
310311};
311312
312313bool JvmtiEventControllerPrivate::_initialized = false ;
@@ -409,6 +410,19 @@ JvmtiEventControllerPrivate::flush_object_free_events(JvmtiEnvBase* env) {
409410 }
410411}
411412
413+ void
414+ JvmtiEventControllerPrivate::set_enabled_events_with_lock (JvmtiEnvBase* env, jlong now_enabled) {
415+ // The state for ObjectFree events must be enabled or disabled
416+ // under the TagMap lock, to allow pending object posting events to complete.
417+ JvmtiTagMap* tag_map = env->tag_map_acquire ();
418+ if (tag_map != NULL ) {
419+ MutexLocker ml (tag_map->lock (), Mutex::_no_safepoint_check_flag);
420+ env->env_event_enable ()->_event_enabled .set_bits (now_enabled);
421+ } else {
422+ env->env_event_enable ()->_event_enabled .set_bits (now_enabled);
423+ }
424+ }
425+
412426// For the specified env: compute the currently truly enabled events
413427// set external state accordingly.
414428// Return value and set value must include all events.
@@ -442,8 +456,8 @@ JvmtiEventControllerPrivate::recompute_env_enabled(JvmtiEnvBase* env) {
442456 break ;
443457 }
444458
445- // will we really send these events to this env
446- env-> env_event_enable ()-> _event_enabled . set_bits ( now_enabled);
459+ // Set/reset the event enabled under the tagmap lock.
460+ set_enabled_events_with_lock (env, now_enabled);
447461
448462 trace_changed (now_enabled, (now_enabled ^ was_enabled) & ~THREAD_FILTERED_EVENT_BITS);
449463
0 commit comments