564 assert(Threads::number_of_threads() == 0 || JvmtiThreadState_lock->is_locked(), "sanity check");
565
566 // event enabled for any thread in any environment
567 julong was_any_env_thread_enabled = JvmtiEventController::_universal_global_event_enabled.get_bits();
568 julong any_env_thread_enabled = 0;
569
570 EC_TRACE(("[-] # recompute enabled - before " JULONG_FORMAT_X, was_any_env_thread_enabled));
571
572 // compute non-thread-filters events.
573 // This must be done separately from thread-filtered events, since some
574 // events can occur before any threads exist.
575 JvmtiEnvIterator it;
576 for (JvmtiEnvBase* env = it.first(); env != NULL; env = it.next(env)) {
577 any_env_thread_enabled |= recompute_env_enabled(env);
578 }
579
580 // We need to create any missing jvmti_thread_state if there are globally set thread
581 // filtered events and there weren't last time
582 if ( (any_env_thread_enabled & THREAD_FILTERED_EVENT_BITS) != 0 &&
583 (was_any_env_thread_enabled & THREAD_FILTERED_EVENT_BITS) == 0) {
584 ThreadsListHandle tlh;
585 JavaThreadIterator jti(tlh.list());
586 for (JavaThread *tp = jti.first(); tp != NULL; tp = jti.next()) {
587 // state_for_while_locked() makes tp->is_exiting() check
588 JvmtiThreadState::state_for_while_locked(tp); // create the thread state if missing
589 }
590 }
591
592 // compute and set thread-filtered events
593 for (JvmtiThreadState *state = JvmtiThreadState::first(); state != NULL; state = state->next()) {
594 any_env_thread_enabled |= recompute_thread_enabled(state);
595 }
596
597 // set universal state (across all envs and threads)
598 jlong delta = any_env_thread_enabled ^ was_any_env_thread_enabled;
599 if (delta != 0) {
600 JvmtiExport::set_should_post_field_access((any_env_thread_enabled & FIELD_ACCESS_BIT) != 0);
601 JvmtiExport::set_should_post_field_modification((any_env_thread_enabled & FIELD_MODIFICATION_BIT) != 0);
602 JvmtiExport::set_should_post_class_load((any_env_thread_enabled & CLASS_LOAD_BIT) != 0);
603 JvmtiExport::set_should_post_class_file_load_hook((any_env_thread_enabled & CLASS_FILE_LOAD_HOOK_BIT) != 0);
604 JvmtiExport::set_should_post_native_method_bind((any_env_thread_enabled & NATIVE_METHOD_BIND_BIT) != 0);
605 JvmtiExport::set_should_post_dynamic_code_generated((any_env_thread_enabled & DYNAMIC_CODE_GENERATED_BIT) != 0);
606 JvmtiExport::set_should_post_data_dump((any_env_thread_enabled & DATA_DUMP_BIT) != 0);
|
564 assert(Threads::number_of_threads() == 0 || JvmtiThreadState_lock->is_locked(), "sanity check");
565
566 // event enabled for any thread in any environment
567 julong was_any_env_thread_enabled = JvmtiEventController::_universal_global_event_enabled.get_bits();
568 julong any_env_thread_enabled = 0;
569
570 EC_TRACE(("[-] # recompute enabled - before " JULONG_FORMAT_X, was_any_env_thread_enabled));
571
572 // compute non-thread-filters events.
573 // This must be done separately from thread-filtered events, since some
574 // events can occur before any threads exist.
575 JvmtiEnvIterator it;
576 for (JvmtiEnvBase* env = it.first(); env != NULL; env = it.next(env)) {
577 any_env_thread_enabled |= recompute_env_enabled(env);
578 }
579
580 // We need to create any missing jvmti_thread_state if there are globally set thread
581 // filtered events and there weren't last time
582 if ( (any_env_thread_enabled & THREAD_FILTERED_EVENT_BITS) != 0 &&
583 (was_any_env_thread_enabled & THREAD_FILTERED_EVENT_BITS) == 0) {
584 for (JavaThreadIteratorWithHandle jtiwh; JavaThread *tp = jtiwh.next(); ) {
585 // state_for_while_locked() makes tp->is_exiting() check
586 JvmtiThreadState::state_for_while_locked(tp); // create the thread state if missing
587 }
588 }
589
590 // compute and set thread-filtered events
591 for (JvmtiThreadState *state = JvmtiThreadState::first(); state != NULL; state = state->next()) {
592 any_env_thread_enabled |= recompute_thread_enabled(state);
593 }
594
595 // set universal state (across all envs and threads)
596 jlong delta = any_env_thread_enabled ^ was_any_env_thread_enabled;
597 if (delta != 0) {
598 JvmtiExport::set_should_post_field_access((any_env_thread_enabled & FIELD_ACCESS_BIT) != 0);
599 JvmtiExport::set_should_post_field_modification((any_env_thread_enabled & FIELD_MODIFICATION_BIT) != 0);
600 JvmtiExport::set_should_post_class_load((any_env_thread_enabled & CLASS_LOAD_BIT) != 0);
601 JvmtiExport::set_should_post_class_file_load_hook((any_env_thread_enabled & CLASS_FILE_LOAD_HOOK_BIT) != 0);
602 JvmtiExport::set_should_post_native_method_bind((any_env_thread_enabled & NATIVE_METHOD_BIND_BIT) != 0);
603 JvmtiExport::set_should_post_dynamic_code_generated((any_env_thread_enabled & DYNAMIC_CODE_GENERATED_BIT) != 0);
604 JvmtiExport::set_should_post_data_dump((any_env_thread_enabled & DATA_DUMP_BIT) != 0);
|