8387404: Make ClassLoaderData::oops_do inlineable

Reviewed-by: coleenp, xpeng
This commit is contained in:
Aleksey Shipilev 2026-07-09 16:02:22 +00:00
parent ab116d00a8
commit 095cf06e73
3 changed files with 23 additions and 20 deletions

View File

@ -289,19 +289,6 @@ void ClassLoaderData::verify_not_claimed(int claim) {
}
#endif
bool ClassLoaderData::try_claim(int claim) {
for (;;) {
int old_claim = AtomicAccess::load(&_claim);
if ((old_claim & claim) == claim) {
return false;
}
int new_claim = old_claim | claim;
if (AtomicAccess::cmpxchg(&_claim, old_claim, new_claim) == old_claim) {
return true;
}
}
}
void ClassLoaderData::demote_strong_roots() {
// The oop handle area contains strong roots that the GC traces from. We are about
// to demote them to strong native oops that the GC does *not* trace from. Conceptually,
@ -369,11 +356,7 @@ void ClassLoaderData::dec_keep_alive_ref_count() {
}
}
void ClassLoaderData::oops_do(OopClosure* f, int claim_value, bool clear_mod_oops) {
if (claim_value != ClassLoaderData::_claim_none && !try_claim(claim_value)) {
return;
}
void ClassLoaderData::oops_do_slow(OopClosure* f, bool clear_mod_oops) {
// Only clear modified_oops after the ClassLoaderData is claimed.
if (clear_mod_oops) {
clear_modified_oops();

View File

@ -242,7 +242,7 @@ private:
void verify_not_claimed(int claim) NOT_DEBUG_RETURN;
bool claimed() const { return _claim != 0; }
bool claimed(int claim) const { return (_claim & claim) == claim; }
bool try_claim(int claim);
inline bool try_claim(int claim);
// Computes if the CLD is alive or not. This is safe to call in concurrent
// contexts.
@ -305,7 +305,8 @@ private:
void initialize_holder(Handle holder);
void oops_do(OopClosure* f, int claim_value, bool clear_modified_oops = false);
inline void oops_do(OopClosure* f, int claim_value, bool clear_modified_oops = false);
void oops_do_slow(OopClosure* f, bool clear_modified_oops);
void classes_do(KlassClosure* klass_closure);
Klass* klasses() { return _klasses; }

View File

@ -85,4 +85,23 @@ inline ClassLoaderData* ClassLoaderData::class_loader_data(oop loader) {
return loader_data;
}
inline bool ClassLoaderData::try_claim(int claim) {
for (;;) {
int old_claim = AtomicAccess::load(&_claim);
if ((old_claim & claim) == claim) {
return false;
}
int new_claim = old_claim | claim;
if (AtomicAccess::cmpxchg(&_claim, old_claim, new_claim) == old_claim) {
return true;
}
}
}
inline void ClassLoaderData::oops_do(OopClosure* f, int claim_value, bool clear_mod_oops) {
if (claim_value == _claim_none || try_claim(claim_value)) {
oops_do_slow(f, clear_mod_oops);
}
}
#endif // SHARE_CLASSFILE_CLASSLOADERDATA_INLINE_HPP