8321033: Avoid casting Array to GrowableArray

Reviewed-by: kbarrett, iklam, ccheung
This commit is contained in:
Matias Saavedra Silva 2024-06-24 18:05:50 +00:00
parent 55c7969461
commit 71a692ab43
2 changed files with 39 additions and 17 deletions

View File

@ -149,7 +149,7 @@ bool ModuleEntry::can_read(ModuleEntry* m) const {
if (!has_reads_list()) { if (!has_reads_list()) {
return false; return false;
} else { } else {
return _reads->contains(m); return reads()->contains(m);
} }
} }
@ -164,9 +164,10 @@ void ModuleEntry::add_read(ModuleEntry* m) {
if (m == nullptr) { if (m == nullptr) {
set_can_read_all_unnamed(); set_can_read_all_unnamed();
} else { } else {
if (_reads == nullptr) { if (reads() == nullptr) {
// Lazily create a module's reads list // Lazily create a module's reads list
_reads = new (mtModule) GrowableArray<ModuleEntry*>(MODULE_READS_SIZE, mtModule); GrowableArray<ModuleEntry*>* new_reads = new (mtModule) GrowableArray<ModuleEntry*>(MODULE_READS_SIZE, mtModule);
set_reads(new_reads);
} }
// Determine, based on this newly established read edge to module m, // Determine, based on this newly established read edge to module m,
@ -174,7 +175,7 @@ void ModuleEntry::add_read(ModuleEntry* m) {
set_read_walk_required(m->loader_data()); set_read_walk_required(m->loader_data());
// Establish readability to module m // Establish readability to module m
_reads->append_if_missing(m); reads()->append_if_missing(m);
} }
} }
@ -208,7 +209,7 @@ void ModuleEntry::set_is_open(bool is_open) {
// module will return false. // module will return false.
bool ModuleEntry::has_reads_list() const { bool ModuleEntry::has_reads_list() const {
assert_locked_or_safepoint(Module_lock); assert_locked_or_safepoint(Module_lock);
return ((_reads != nullptr) && !_reads->is_empty()); return ((reads() != nullptr) && !reads()->is_empty());
} }
// Purge dead module entries out of reads list. // Purge dead module entries out of reads list.
@ -227,12 +228,12 @@ void ModuleEntry::purge_reads() {
} }
// Go backwards because this removes entries that are dead. // Go backwards because this removes entries that are dead.
int len = _reads->length(); int len = reads()->length();
for (int idx = len - 1; idx >= 0; idx--) { for (int idx = len - 1; idx >= 0; idx--) {
ModuleEntry* module_idx = _reads->at(idx); ModuleEntry* module_idx = reads()->at(idx);
ClassLoaderData* cld_idx = module_idx->loader_data(); ClassLoaderData* cld_idx = module_idx->loader_data();
if (cld_idx->is_unloading()) { if (cld_idx->is_unloading()) {
_reads->delete_at(idx); reads()->delete_at(idx);
} else { } else {
// Update the need to walk this module's reads based on live modules // Update the need to walk this module's reads based on live modules
set_read_walk_required(cld_idx); set_read_walk_required(cld_idx);
@ -246,15 +247,15 @@ void ModuleEntry::module_reads_do(ModuleClosure* f) {
assert(f != nullptr, "invariant"); assert(f != nullptr, "invariant");
if (has_reads_list()) { if (has_reads_list()) {
int reads_len = _reads->length(); int reads_len = reads()->length();
for (int i = 0; i < reads_len; ++i) { for (ModuleEntry* m : *reads()) {
f->do_module(_reads->at(i)); f->do_module(m);
} }
} }
} }
void ModuleEntry::delete_reads() { void ModuleEntry::delete_reads() {
delete _reads; delete reads();
_reads = nullptr; _reads = nullptr;
} }
@ -272,7 +273,8 @@ ModuleEntry::ModuleEntry(Handle module_handle,
_has_default_read_edges(false), _has_default_read_edges(false),
_must_walk_reads(false), _must_walk_reads(false),
_is_open(is_open), _is_open(is_open),
_is_patched(false) { _is_patched(false)
DEBUG_ONLY(COMMA _reads_is_archived(false)) {
// Initialize fields specific to a ModuleEntry // Initialize fields specific to a ModuleEntry
if (_name == nullptr) { if (_name == nullptr) {
@ -466,7 +468,7 @@ void ModuleEntry::iterate_symbols(MetaspaceClosure* closure) {
} }
void ModuleEntry::init_as_archived_entry() { void ModuleEntry::init_as_archived_entry() {
Array<ModuleEntry*>* archived_reads = write_growable_array(_reads); set_archived_reads(write_growable_array(reads()));
_loader_data = nullptr; // re-init at runtime _loader_data = nullptr; // re-init at runtime
_shared_path_index = FileMapInfo::get_module_shared_path_index(_location); _shared_path_index = FileMapInfo::get_module_shared_path_index(_location);
@ -474,7 +476,6 @@ void ModuleEntry::init_as_archived_entry() {
_name = ArchiveBuilder::get_buffered_symbol(_name); _name = ArchiveBuilder::get_buffered_symbol(_name);
ArchivePtrMarker::mark_pointer((address*)&_name); ArchivePtrMarker::mark_pointer((address*)&_name);
} }
_reads = (GrowableArray<ModuleEntry*>*)archived_reads;
if (_version != nullptr) { if (_version != nullptr) {
_version = ArchiveBuilder::get_buffered_symbol(_version); _version = ArchiveBuilder::get_buffered_symbol(_version);
} }
@ -515,7 +516,7 @@ void ModuleEntry::verify_archived_module_entries() {
void ModuleEntry::load_from_archive(ClassLoaderData* loader_data) { void ModuleEntry::load_from_archive(ClassLoaderData* loader_data) {
assert(CDSConfig::is_using_archive(), "runtime only"); assert(CDSConfig::is_using_archive(), "runtime only");
set_loader_data(loader_data); set_loader_data(loader_data);
_reads = restore_growable_array((Array<ModuleEntry*>*)_reads); set_reads(restore_growable_array(archived_reads()));
JFR_ONLY(INIT_ID(this);) JFR_ONLY(INIT_ID(this);)
} }

View File

@ -68,7 +68,11 @@ private:
// for shared classes from this module // for shared classes from this module
Symbol* _name; // name of this module Symbol* _name; // name of this module
ClassLoaderData* _loader_data; ClassLoaderData* _loader_data;
GrowableArray<ModuleEntry*>* _reads; // list of modules that are readable by this module
union {
GrowableArray<ModuleEntry*>* _reads; // list of modules that are readable by this module
Array<ModuleEntry*>* _archived_reads; // List of readable modules stored in the CDS archive
};
Symbol* _version; // module version number Symbol* _version; // module version number
Symbol* _location; // module location Symbol* _location; // module location
CDS_ONLY(int _shared_path_index;) // >=0 if classes in this module are in CDS archive CDS_ONLY(int _shared_path_index;) // >=0 if classes in this module are in CDS archive
@ -77,6 +81,7 @@ private:
bool _must_walk_reads; // walk module's reads list at GC safepoints to purge out dead modules bool _must_walk_reads; // walk module's reads list at GC safepoints to purge out dead modules
bool _is_open; // whether the packages in the module are all unqualifiedly exported bool _is_open; // whether the packages in the module are all unqualifiedly exported
bool _is_patched; // whether the module is patched via --patch-module bool _is_patched; // whether the module is patched via --patch-module
DEBUG_ONLY(bool _reads_is_archived);
CDS_JAVA_HEAP_ONLY(int _archived_module_index;) CDS_JAVA_HEAP_ONLY(int _archived_module_index;)
JFR_ONLY(DEFINE_TRACE_ID_FIELD;) JFR_ONLY(DEFINE_TRACE_ID_FIELD;)
@ -115,6 +120,22 @@ public:
bool can_read(ModuleEntry* m) const; bool can_read(ModuleEntry* m) const;
bool has_reads_list() const; bool has_reads_list() const;
GrowableArray<ModuleEntry*>* reads() const {
assert(!_reads_is_archived, "sanity");
return _reads;
}
void set_reads(GrowableArray<ModuleEntry*>* r) {
_reads = r;
DEBUG_ONLY(_reads_is_archived = false);
}
Array<ModuleEntry*>* archived_reads() const {
assert(_reads_is_archived, "sanity");
return _archived_reads;
}
void set_archived_reads(Array<ModuleEntry*>* r) {
_archived_reads = r;
DEBUG_ONLY(_reads_is_archived = true);
}
void add_read(ModuleEntry* m); void add_read(ModuleEntry* m);
void set_read_walk_required(ClassLoaderData* m_loader_data); void set_read_walk_required(ClassLoaderData* m_loader_data);