Mercurial > hg > graal-compiler
diff src/share/vm/classfile/classLoaderData.cpp @ 18027:9f169829d0e1
Merge
author | asaha |
---|---|
date | Tue, 08 Jul 2014 13:25:13 -0700 |
parents | e4a6e7f1b90b |
children | 52b4284cb496 556a06aec3fa |
line wrap: on
line diff
--- a/src/share/vm/classfile/classLoaderData.cpp Wed Jul 02 15:31:10 2014 -0700 +++ b/src/share/vm/classfile/classLoaderData.cpp Tue Jul 08 13:25:13 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();