comparison src/share/vm/runtime/thread.cpp @ 3979:4dfb2df418f2

6484982: G1: process references during evacuation pauses Summary: G1 now uses two reference processors - one is used by concurrent marking and the other is used by STW GCs (both full and incremental evacuation pauses). In an evacuation pause, the reference processor is embedded into the closures used to scan objects. Doing so causes causes reference objects to be 'discovered' by the reference processor. At the end of the evacuation pause, these discovered reference objects are processed - preserving (and copying) referent objects (and their reachable graphs) as appropriate. Reviewed-by: ysr, jwilhelm, brutisso, stefank, tonyp
author johnc
date Thu, 22 Sep 2011 10:57:37 -0700
parents e6b1331a51d2
children fd65bc7c09b6
comparison
equal deleted inserted replaced
3978:f0ecbe78fc7b 3979:4dfb2df418f2
747 // GC Support 747 // GC Support
748 bool Thread::claim_oops_do_par_case(int strong_roots_parity) { 748 bool Thread::claim_oops_do_par_case(int strong_roots_parity) {
749 jint thread_parity = _oops_do_parity; 749 jint thread_parity = _oops_do_parity;
750 if (thread_parity != strong_roots_parity) { 750 if (thread_parity != strong_roots_parity) {
751 jint res = Atomic::cmpxchg(strong_roots_parity, &_oops_do_parity, thread_parity); 751 jint res = Atomic::cmpxchg(strong_roots_parity, &_oops_do_parity, thread_parity);
752 if (res == thread_parity) return true; 752 if (res == thread_parity) {
753 else { 753 return true;
754 } else {
754 guarantee(res == strong_roots_parity, "Or else what?"); 755 guarantee(res == strong_roots_parity, "Or else what?");
755 assert(SharedHeap::heap()->n_par_threads() > 0, 756 assert(SharedHeap::heap()->n_par_threads() > 0,
756 "Should only fail when parallel."); 757 "Should only fail when parallel.");
757 return false; 758 return false;
758 } 759 }
3903 if (p->claim_oops_do(is_par, cp)) { 3904 if (p->claim_oops_do(is_par, cp)) {
3904 p->oops_do(f, cf); 3905 p->oops_do(f, cf);
3905 } 3906 }
3906 } 3907 }
3907 VMThread* vmt = VMThread::vm_thread(); 3908 VMThread* vmt = VMThread::vm_thread();
3908 if (vmt->claim_oops_do(is_par, cp)) 3909 if (vmt->claim_oops_do(is_par, cp)) {
3909 vmt->oops_do(f, cf); 3910 vmt->oops_do(f, cf);
3911 }
3910 } 3912 }
3911 3913
3912 #ifndef SERIALGC 3914 #ifndef SERIALGC
3913 // Used by ParallelScavenge 3915 // Used by ParallelScavenge
3914 void Threads::create_thread_roots_tasks(GCTaskQueue* q) { 3916 void Threads::create_thread_roots_tasks(GCTaskQueue* q) {