< prev index next >

src/hotspot/share/oops/klass.cpp

Print this page

        

*** 408,418 **** void Klass::set_next_sibling(Klass* s) { assert(s != this, "sanity check"); // Does not need release semantics. If used by cleanup, it will link to // already safely published data, and if used by inserts, will be published // safely using cmpxchg. ! Atomic::store(s, &_next_sibling); } void Klass::append_to_sibling_list() { assert_locked_or_safepoint(Compile_lock); debug_only(verify();) --- 408,418 ---- void Klass::set_next_sibling(Klass* s) { assert(s != this, "sanity check"); // Does not need release semantics. If used by cleanup, it will link to // already safely published data, and if used by inserts, will be published // safely using cmpxchg. ! Atomic::store(&_next_sibling, s); } void Klass::append_to_sibling_list() { assert_locked_or_safepoint(Compile_lock); debug_only(verify();)
*** 434,444 **** set_next_sibling(prev_first_subklass); } // Note that the prev_first_subklass is always alive, meaning no sibling_next links // are ever created to not alive klasses. This is an important invariant of the lock-free // cleaning protocol, that allows us to safely unlink dead klasses from the sibling list. ! if (Atomic::cmpxchg(this, &super->_subklass, prev_first_subklass) == prev_first_subklass) { return; } } debug_only(verify();) } --- 434,444 ---- set_next_sibling(prev_first_subklass); } // Note that the prev_first_subklass is always alive, meaning no sibling_next links // are ever created to not alive klasses. This is an important invariant of the lock-free // cleaning protocol, that allows us to safely unlink dead klasses from the sibling list. ! if (Atomic::cmpxchg(&super->_subklass, prev_first_subklass, this) == prev_first_subklass) { return; } } debug_only(verify();) }
*** 449,459 **** Klass* subklass = Atomic::load_acquire(&_subklass); if (subklass == NULL || subklass->is_loader_alive()) { return; } // Try to fix _subklass until it points at something not dead. ! Atomic::cmpxchg(subklass->next_sibling(), &_subklass, subklass); } } void Klass::clean_weak_klass_links(bool unloading_occurred, bool clean_alive_klasses) { if (!ClassUnloading || !unloading_occurred) { --- 449,459 ---- Klass* subklass = Atomic::load_acquire(&_subklass); if (subklass == NULL || subklass->is_loader_alive()) { return; } // Try to fix _subklass until it points at something not dead. ! Atomic::cmpxchg(&_subklass, subklass, subklass->next_sibling()); } } void Klass::clean_weak_klass_links(bool unloading_occurred, bool clean_alive_klasses) { if (!ClassUnloading || !unloading_occurred) {
*** 708,718 **** jint Klass::compute_modifier_flags(TRAPS) const { return 0; } int Klass::atomic_incr_biased_lock_revocation_count() { ! return (int) Atomic::add(1, &_biased_lock_revocation_count); } // Unless overridden, jvmti_class_status has no flags set. jint Klass::jvmti_class_status() const { return 0; --- 708,718 ---- jint Klass::compute_modifier_flags(TRAPS) const { return 0; } int Klass::atomic_incr_biased_lock_revocation_count() { ! return (int) Atomic::add(&_biased_lock_revocation_count, 1); } // Unless overridden, jvmti_class_status has no flags set. jint Klass::jvmti_class_status() const { return 0;
< prev index next >