< prev index next >
src/share/vm/oops/constantPool.cpp
Print this page
rev 6875 : 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
Reviewed-by: mgerdin, coleenp, bdelsart
*** 1815,1829 ****
#undef DBG
void ConstantPool::set_on_stack(const bool value) {
if (value) {
! _flags |= _on_stack;
} else {
_flags &= ~_on_stack;
}
- if (value) MetadataOnStackMark::record(this);
}
// JSR 292 support for patching constant pool oops after the class is linked and
// the oop array for resolved references are created.
// We can't do this during classfile parsing, which is how the other indexes are
--- 1815,1840 ----
#undef DBG
void ConstantPool::set_on_stack(const bool value) {
if (value) {
! int old_flags = *const_cast<volatile int *>(&_flags);
! while ((old_flags & _on_stack) == 0) {
! int new_flags = old_flags | _on_stack;
! int result = Atomic::cmpxchg(new_flags, &_flags, old_flags);
!
! if (result == old_flags) {
! // Succeeded.
! MetadataOnStackMark::record(this, Thread::current());
! return;
! }
! old_flags = result;
! }
} else {
+ // Clearing is done single-threadedly.
_flags &= ~_on_stack;
}
}
// JSR 292 support for patching constant pool oops after the class is linked and
// the oop array for resolved references are created.
// We can't do this during classfile parsing, which is how the other indexes are
< prev index next >