Skip to content

Commit 47f233a

Browse files
committed
8292202: modules_do is called without Module_lock
Reviewed-by: iklam, coleenp
1 parent 742bc04 commit 47f233a

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

src/hotspot/share/classfile/classLoaderExt.cpp

+19-5
Original file line numberDiff line numberDiff line change
@@ -82,20 +82,34 @@ void ClassLoaderExt::setup_app_search_path(JavaThread* current) {
8282

8383
void ClassLoaderExt::process_module_table(JavaThread* current, ModuleEntryTable* met) {
8484
ResourceMark rm(current);
85-
class Process : public ModuleClosure {
85+
GrowableArray<char*>* module_paths = new GrowableArray<char*>(5);
86+
87+
class ModulePathsGatherer : public ModuleClosure {
8688
JavaThread* _current;
89+
GrowableArray<char*>* _module_paths;
8790
public:
88-
Process(JavaThread* current) : _current(current) {}
91+
ModulePathsGatherer(JavaThread* current, GrowableArray<char*>* module_paths) :
92+
_current(current), _module_paths(module_paths) {}
8993
void do_module(ModuleEntry* m) {
9094
char* path = m->location()->as_C_string();
9195
if (strncmp(path, "file:", 5) == 0) {
9296
path = ClassLoader::skip_uri_protocol(path);
93-
ClassLoader::setup_module_search_path(_current, path);
97+
char* path_copy = NEW_RESOURCE_ARRAY(char, strlen(path) + 1);
98+
strcpy(path_copy, path);
99+
_module_paths->append(path_copy);
94100
}
95101
}
96102
};
97-
Process process(current);
98-
met->modules_do(&process);
103+
104+
ModulePathsGatherer gatherer(current, module_paths);
105+
{
106+
MutexLocker ml(Module_lock);
107+
met->modules_do(&gatherer);
108+
}
109+
110+
for (int i = 0; i < module_paths->length(); i++) {
111+
ClassLoader::setup_module_search_path(current, module_paths->at(i));
112+
}
99113
}
100114

101115
void ClassLoaderExt::setup_module_paths(JavaThread* current) {

src/hotspot/share/classfile/moduleEntry.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -694,13 +694,15 @@ void ModuleEntryTable::modules_do(void f(ModuleEntry*)) {
694694
auto do_f = [&] (const SymbolHandle& key, ModuleEntry*& entry) {
695695
f(entry);
696696
};
697+
assert_lock_strong(Module_lock);
697698
_table.iterate_all(do_f);
698699
}
699700

700701
void ModuleEntryTable::modules_do(ModuleClosure* closure) {
701702
auto do_f = [&] (const SymbolHandle& key, ModuleEntry*& entry) {
702703
closure->do_module(entry);
703704
};
705+
assert_lock_strong(Module_lock);
704706
_table.iterate_all(do_f);
705707
}
706708

0 commit comments

Comments
 (0)