< 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 >