Skip to content

Commit

Permalink
8323631: JfrTypeSet::write_klass can enqueue a CLD klass that is unlo…
Browse files Browse the repository at this point in the history
…ading

Reviewed-by: egahlin
  • Loading branch information
Markus Grönlund committed Jan 16, 2024
1 parent 2fd775f commit e2d6023
Showing 1 changed file with 32 additions and 26 deletions.
58 changes: 32 additions & 26 deletions src/hotspot/share/jfr/recorder/checkpoint/types/jfrTypeSet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -135,32 +135,6 @@ static traceid artifact_tag(const T* ptr, bool leakp) {
return artifact_id(ptr);
}

static inline bool should_do_cld_klass(const Klass* klass, bool leakp) {
return klass != nullptr && _artifacts->should_do_cld_klass(klass, leakp);
}

static inline KlassPtr get_cld_klass(CldPtr cld, bool leakp) {
if (cld == nullptr) {
return nullptr;
}
assert(leakp ? IS_LEAKP(cld) : used(cld), "invariant");
KlassPtr cld_klass = cld->class_loader_klass();
if (cld_klass == nullptr) {
return nullptr;
}
if (should_do_cld_klass(cld_klass, leakp)) {
if (current_epoch()) {
// This will enqueue the klass, which is important for
// reachability when doing clear and reset at rotation.
JfrTraceId::load(cld_klass);
} else {
artifact_tag(cld_klass, leakp);
}
return cld_klass;
}
return nullptr;
}

static inline CldPtr get_cld(ModPtr mod) {
return mod != nullptr ? mod->loader_data() : nullptr;
}
Expand All @@ -173,6 +147,38 @@ static ClassLoaderData* get_cld(const Klass* klass) {
return klass->is_non_strong_hidden() ? nullptr : klass->class_loader_data();
}

static inline bool should_do_cld_klass(const Klass* cld_klass, bool leakp) {
return cld_klass != nullptr && _artifacts->should_do_cld_klass(cld_klass, leakp);
}

static inline bool should_enqueue(const Klass* cld_klass) {
assert(cld_klass != nullptr, "invariant");
if (previous_epoch()) {
return false;
}
CldPtr cld = get_cld(cld_klass);
return cld != nullptr && !cld->is_unloading();
}

static inline KlassPtr get_cld_klass(CldPtr cld, bool leakp) {
if (cld == nullptr) {
return nullptr;
}
assert(leakp ? IS_LEAKP(cld) : used(cld), "invariant");
KlassPtr cld_klass = cld->class_loader_klass();
if (!should_do_cld_klass(cld_klass, leakp)) {
return nullptr;
}
if (should_enqueue(cld_klass)) {
// This will enqueue the klass, which is important for
// reachability when doing clear and reset at rotation.
JfrTraceId::load(cld_klass);
} else {
artifact_tag(cld_klass, leakp);
}
return cld_klass;
}

static inline ModPtr get_module(PkgPtr pkg) {
return pkg != nullptr ? pkg->module() : nullptr;
}
Expand Down

0 comments on commit e2d6023

Please sign in to comment.