# HG changeset patch # User asaha # Date 1405348907 25200 # Node ID 9826742fa96a09da4ddf76324c205961626a9510 # Parent 6366f612ac2c67f0b58abd92467a3da2668b970b# Parent ccfff14361eadd234483211dafbadc4a7f32d7a4 Merge diff -r 6366f612ac2c -r 9826742fa96a .hgtags --- a/.hgtags Wed Jul 09 12:07:18 2014 -0700 +++ b/.hgtags Mon Jul 14 07:41:47 2014 -0700 @@ -493,6 +493,8 @@ 4f18dea0312d601d0515976bc0c643ea7acc829d hs25.20-b20 9e4d27da4ac04c6e19291087f7c68a5c5803c7ca jdk8u20-b20 4828415ebbf11e205dcc08e97ad5ae7dd03522f9 jdk8u20-b21 +e4a6e7f1b90b85270aee1c54edaca3ef737082f1 hs25.20-b21 +f7429096a202cab5c36a0f20dea33c554026010f jdk8u20-b22 a4d44dfb7d30eea54bc172e4429a655454ae0bbf jdk8u25-b00 9a2152fbd929b0d8b2f5c326a5526214ae71731a jdk8u25-b01 d3d5604ea0dea3812e87ba76ac199d0a8be6f49f jdk8u25-b02 diff -r 6366f612ac2c -r 9826742fa96a make/hotspot_version diff -r 6366f612ac2c -r 9826742fa96a src/share/vm/classfile/classFileParser.cpp --- a/src/share/vm/classfile/classFileParser.cpp Wed Jul 09 12:07:18 2014 -0700 +++ b/src/share/vm/classfile/classFileParser.cpp Mon Jul 14 07:41:47 2014 -0700 @@ -4037,6 +4037,11 @@ this_klass->set_major_version(major_version); this_klass->set_has_default_methods(has_default_methods); + if (!host_klass.is_null()) { + assert (this_klass->is_anonymous(), "should be the same"); + this_klass->set_host_klass(host_klass()); + } + // Set up Method*::intrinsic_id as soon as we know the names of methods. // (We used to do this lazily, but now we query it in Rewriter, // which is eagerly done for every method, so we might as well do it now, diff -r 6366f612ac2c -r 9826742fa96a src/share/vm/classfile/classLoaderData.cpp --- a/src/share/vm/classfile/classLoaderData.cpp Wed Jul 09 12:07:18 2014 -0700 +++ b/src/share/vm/classfile/classLoaderData.cpp Mon Jul 14 07:41:47 2014 -0700 @@ -531,6 +531,7 @@ // GC root of class loader data created. ClassLoaderData* ClassLoaderDataGraph::_head = NULL; ClassLoaderData* ClassLoaderDataGraph::_unloading = NULL; +ClassLoaderData* ClassLoaderDataGraph::_saved_unloading = NULL; ClassLoaderData* ClassLoaderDataGraph::_saved_head = NULL; bool ClassLoaderDataGraph::_should_purge = false; @@ -628,7 +629,9 @@ void ClassLoaderDataGraph::classes_unloading_do(void f(Klass* const)) { assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!"); - for (ClassLoaderData* cld = _unloading; cld != NULL; cld = cld->next()) { + // Only walk the head until any clds not purged from prior unloading + // (CMS doesn't purge right away). + for (ClassLoaderData* cld = _unloading; cld != _saved_unloading; cld = cld->next()) { cld->classes_do(f); } } @@ -676,6 +679,11 @@ ClassLoaderData* data = _head; ClassLoaderData* prev = NULL; bool seen_dead_loader = false; + + // Save previous _unloading pointer for CMS which may add to unloading list before + // purging and we don't want to rewalk the previously unloaded class loader data. + _saved_unloading = _unloading; + // mark metadata seen on the stack and code cache so we can delete // unneeded entries. bool has_redefined_a_class = JvmtiExport::has_redefined_a_class(); diff -r 6366f612ac2c -r 9826742fa96a src/share/vm/classfile/classLoaderData.hpp --- a/src/share/vm/classfile/classLoaderData.hpp Wed Jul 09 12:07:18 2014 -0700 +++ b/src/share/vm/classfile/classLoaderData.hpp Mon Jul 14 07:41:47 2014 -0700 @@ -66,6 +66,7 @@ static ClassLoaderData* _unloading; // CMS support. static ClassLoaderData* _saved_head; + static ClassLoaderData* _saved_unloading; static bool _should_purge; static ClassLoaderData* add(Handle class_loader, bool anonymous, TRAPS); diff -r 6366f612ac2c -r 9826742fa96a src/share/vm/classfile/systemDictionary.cpp --- a/src/share/vm/classfile/systemDictionary.cpp Wed Jul 09 12:07:18 2014 -0700 +++ b/src/share/vm/classfile/systemDictionary.cpp Mon Jul 14 07:41:47 2014 -0700 @@ -997,7 +997,6 @@ if (host_klass.not_null() && k.not_null()) { assert(EnableInvokeDynamic, ""); - k->set_host_klass(host_klass()); // If it's anonymous, initialize it now, since nobody else will. {