# HG changeset patch # User sspitsyn # Date 1482123624 0 # Node ID 32e49f36d795b6170533b35e3bf6f0124a57941f # Parent 9c9281518887f18258a4753deec2a95d5c121c56# Parent 5448e1bbe72abb59889d9358d8b87ee40107e4c7 Merge diff -r 9c9281518887 -r 32e49f36d795 hotspot/src/share/vm/classfile/moduleEntry.cpp --- a/hotspot/src/share/vm/classfile/moduleEntry.cpp Sun Dec 18 20:54:26 2016 -0800 +++ b/hotspot/src/share/vm/classfile/moduleEntry.cpp Mon Dec 19 05:00:24 2016 +0000 @@ -108,6 +108,18 @@ } MutexLocker m1(Module_lock); + // This is a guard against possible race between agent threads that redefine + // or retransform classes in this module. Only one of them is adding the + // default read edges to the unnamed modules of the boot and app class loaders + // with an upcall to jdk.internal.module.Modules.transformedByAgent. + // At the same time, another thread can instrument the module classes by + // injecting dependencies that require the default read edges for resolution. + if (this->has_default_read_edges() && !m->is_named()) { + ClassLoaderData* cld = m->loader_data(); + if (cld->is_the_null_class_loader_data() || cld->is_system_class_loader_data()) { + return true; // default read edge + } + } if (!has_reads()) { return false; } else {