Mercurial > hg > graal-compiler
diff src/share/vm/memory/sharedHeap.cpp @ 14909:4ca6dc0799b6
Backout jdk9 merge
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Tue, 01 Apr 2014 13:57:07 +0200 |
parents | 10c424c5a362 |
children | 52b4284cb496 |
line wrap: on
line diff
--- a/src/share/vm/memory/sharedHeap.cpp Tue Apr 01 14:09:03 2014 +0200 +++ b/src/share/vm/memory/sharedHeap.cpp Tue Apr 01 13:57:07 2014 +0200 @@ -137,8 +137,10 @@ } void SharedHeap::process_strong_roots(bool activate_scope, + bool is_scavenging, ScanningOption so, OopClosure* roots, + CodeBlobClosure* code_roots, KlassClosure* klass_closure) { StrongRootsScope srs(this, activate_scope); @@ -155,17 +157,13 @@ if (!_process_strong_tasks->is_task_claimed(SH_PS_JNIHandles_oops_do)) JNIHandles::oops_do(roots); - CodeBlobToOopClosure code_roots(roots, true); - + // All threads execute this; the individual threads are task groups. CLDToOopClosure roots_from_clds(roots); - // If we limit class scanning to SO_SystemClasses we need to apply a CLD closure to - // CLDs which are strongly reachable from the thread stacks. - CLDToOopClosure* roots_from_clds_p = ((so & SO_SystemClasses) ? &roots_from_clds : NULL); - // All threads execute this; the individual threads are task groups. + CLDToOopClosure* roots_from_clds_p = (is_scavenging ? NULL : &roots_from_clds); if (CollectedHeap::use_parallel_gc_threads()) { - Threads::possibly_parallel_oops_do(roots, roots_from_clds_p, &code_roots); + Threads::possibly_parallel_oops_do(roots, roots_from_clds_p, code_roots); } else { - Threads::oops_do(roots, roots_from_clds_p, &code_roots); + Threads::oops_do(roots, roots_from_clds_p, code_roots); } if (!_process_strong_tasks-> is_task_claimed(SH_PS_ObjectSynchronizer_oops_do)) @@ -189,9 +187,9 @@ if (!_process_strong_tasks->is_task_claimed(SH_PS_ClassLoaderDataGraph_oops_do)) { if (so & SO_AllClasses) { - ClassLoaderDataGraph::oops_do(roots, klass_closure, /* must_claim */ false); + ClassLoaderDataGraph::oops_do(roots, klass_closure, !is_scavenging); } else if (so & SO_SystemClasses) { - ClassLoaderDataGraph::always_strong_oops_do(roots, klass_closure, /* must_claim */ true); + ClassLoaderDataGraph::always_strong_oops_do(roots, klass_closure, !is_scavenging); } } @@ -206,18 +204,17 @@ } if (!_process_strong_tasks->is_task_claimed(SH_PS_CodeCache_oops_do)) { - if (so & SO_ScavengeCodeCache) { - assert(&code_roots != NULL, "must supply closure for code cache"); + if (so & SO_CodeCache) { + assert(code_roots != NULL, "must supply closure for code cache"); - // We only visit parts of the CodeCache when scavenging. - CodeCache::scavenge_root_nmethods_do(&code_roots); - } - if (so & SO_AllCodeCache) { - assert(&code_roots != NULL, "must supply closure for code cache"); - - // CMSCollector uses this to do intermediate-strength collections. - // We scan the entire code cache, since CodeCache::do_unloading is not called. - CodeCache::blobs_do(&code_roots); + if (is_scavenging) { + // We only visit parts of the CodeCache when scavenging. + CodeCache::scavenge_root_nmethods_do(code_roots); + } else { + // CMSCollector uses this to do intermediate-strength collections. + // We scan the entire code cache, since CodeCache::do_unloading is not called. + CodeCache::blobs_do(code_roots); + } } // Verify that the code cache contents are not subject to // movement by a scavenging collection. @@ -234,9 +231,13 @@ }; static AlwaysTrueClosure always_true; -void SharedHeap::process_weak_roots(OopClosure* root_closure) { +void SharedHeap::process_weak_roots(OopClosure* root_closure, + CodeBlobClosure* code_roots) { // Global (weak) JNI handles JNIHandles::weak_oops_do(&always_true, root_closure); + + CodeCache::blobs_do(code_roots); + StringTable::oops_do(root_closure); } void SharedHeap::set_barrier_set(BarrierSet* bs) {