824 assert(SharedHeap::heap()->workers()->active_workers() > 0, |
824 assert(SharedHeap::heap()->workers()->active_workers() > 0, |
825 "Should only fail when parallel."); |
825 "Should only fail when parallel."); |
826 return false; |
826 return false; |
827 } |
827 } |
828 |
828 |
829 void Thread::oops_do(OopClosure* f, CodeBlobClosure* cf) { |
829 void Thread::oops_do(OopClosure* f, CLDToOopClosure* cld_f, CodeBlobClosure* cf) { |
830 active_handles()->oops_do(f); |
830 active_handles()->oops_do(f); |
831 // Do oop for ThreadShadow |
831 // Do oop for ThreadShadow |
832 f->do_oop((oop*)&_pending_exception); |
832 f->do_oop((oop*)&_pending_exception); |
833 handle_area()->oops_do(f); |
833 handle_area()->oops_do(f); |
834 } |
834 } |
2703 _cur_thr->set_processed_thread(NULL); |
2703 _cur_thr->set_processed_thread(NULL); |
2704 } |
2704 } |
2705 } |
2705 } |
2706 }; |
2706 }; |
2707 |
2707 |
2708 void JavaThread::oops_do(OopClosure* f, CodeBlobClosure* cf) { |
2708 void JavaThread::oops_do(OopClosure* f, CLDToOopClosure* cld_f, CodeBlobClosure* cf) { |
2709 // Verify that the deferred card marks have been flushed. |
2709 // Verify that the deferred card marks have been flushed. |
2710 assert(deferred_card_mark().is_empty(), "Should be empty during GC"); |
2710 assert(deferred_card_mark().is_empty(), "Should be empty during GC"); |
2711 |
2711 |
2712 // The ThreadProfiler oops_do is done from FlatProfiler::oops_do |
2712 // The ThreadProfiler oops_do is done from FlatProfiler::oops_do |
2713 // since there may be more than one thread using each ThreadProfiler. |
2713 // since there may be more than one thread using each ThreadProfiler. |
2714 |
2714 |
2715 // Traverse the GCHandles |
2715 // Traverse the GCHandles |
2716 Thread::oops_do(f, cf); |
2716 Thread::oops_do(f, cld_f, cf); |
2717 |
2717 |
2718 assert( (!has_last_Java_frame() && java_call_counter() == 0) || |
2718 assert( (!has_last_Java_frame() && java_call_counter() == 0) || |
2719 (has_last_Java_frame() && java_call_counter() > 0), "wrong java_sp info!"); |
2719 (has_last_Java_frame() && java_call_counter() > 0), "wrong java_sp info!"); |
2720 |
2720 |
2721 if (has_last_Java_frame()) { |
2721 if (has_last_Java_frame()) { |
2739 chunk->oops_do(f); |
2739 chunk->oops_do(f); |
2740 } |
2740 } |
2741 |
2741 |
2742 // Traverse the execution stack |
2742 // Traverse the execution stack |
2743 for(StackFrameStream fst(this); !fst.is_done(); fst.next()) { |
2743 for(StackFrameStream fst(this); !fst.is_done(); fst.next()) { |
2744 fst.current()->oops_do(f, cf, fst.register_map()); |
2744 fst.current()->oops_do(f, cld_f, cf, fst.register_map()); |
2745 } |
2745 } |
2746 } |
2746 } |
2747 |
2747 |
2748 // callee_target is never live across a gc point so NULL it here should |
2748 // callee_target is never live across a gc point so NULL it here should |
2749 // it still contain a methdOop. |
2749 // it still contain a methdOop. |
2873 |
2873 |
2874 static void frame_verify(frame* f, const RegisterMap *map) { f->verify(map); } |
2874 static void frame_verify(frame* f, const RegisterMap *map) { f->verify(map); } |
2875 |
2875 |
2876 void JavaThread::verify() { |
2876 void JavaThread::verify() { |
2877 // Verify oops in the thread. |
2877 // Verify oops in the thread. |
2878 oops_do(&VerifyOopClosure::verify_oop, NULL); |
2878 oops_do(&VerifyOopClosure::verify_oop, NULL, NULL); |
2879 |
2879 |
2880 // Verify the stack frames. |
2880 // Verify the stack frames. |
2881 frames_do(frame_verify); |
2881 frames_do(frame_verify); |
2882 } |
2882 } |
2883 |
2883 |
3123 |
3123 |
3124 |
3124 |
3125 static void oops_print(frame* f, const RegisterMap *map) { |
3125 static void oops_print(frame* f, const RegisterMap *map) { |
3126 PrintAndVerifyOopClosure print; |
3126 PrintAndVerifyOopClosure print; |
3127 f->print_value(); |
3127 f->print_value(); |
3128 f->oops_do(&print, NULL, (RegisterMap*)map); |
3128 f->oops_do(&print, NULL, NULL, (RegisterMap*)map); |
3129 } |
3129 } |
3130 |
3130 |
3131 // Print our all the locations that contain oops and whether they are |
3131 // Print our all the locations that contain oops and whether they are |
3132 // valid or not. This useful when trying to find the oldest frame |
3132 // valid or not. This useful when trying to find the oldest frame |
3133 // where an oop has gone bad since the frame walk is from youngest to |
3133 // where an oop has gone bad since the frame walk is from youngest to |
3225 #ifndef PRODUCT |
3225 #ifndef PRODUCT |
3226 _ideal_graph_printer = NULL; |
3226 _ideal_graph_printer = NULL; |
3227 #endif |
3227 #endif |
3228 } |
3228 } |
3229 |
3229 |
3230 void CompilerThread::oops_do(OopClosure* f, CodeBlobClosure* cf) { |
3230 void CompilerThread::oops_do(OopClosure* f, CLDToOopClosure* cld_f, CodeBlobClosure* cf) { |
3231 JavaThread::oops_do(f, cf); |
3231 JavaThread::oops_do(f, cld_f, cf); |
3232 if (_scanned_nmethod != NULL && cf != NULL) { |
3232 if (_scanned_nmethod != NULL && cf != NULL) { |
3233 // Safepoints can occur when the sweeper is scanning an nmethod so |
3233 // Safepoints can occur when the sweeper is scanning an nmethod so |
3234 // process it here to make sure it isn't unloaded in the middle of |
3234 // process it here to make sure it isn't unloaded in the middle of |
3235 // a scan. |
3235 // a scan. |
3236 cf->do_code_blob(_scanned_nmethod); |
3236 cf->do_code_blob(_scanned_nmethod); |
4199 // In particular, these things should never be called when the Threads_lock |
4199 // In particular, these things should never be called when the Threads_lock |
4200 // is held by some other thread. (Note: the Safepoint abstraction also |
4200 // is held by some other thread. (Note: the Safepoint abstraction also |
4201 // uses the Threads_lock to gurantee this property. It also makes sure that |
4201 // uses the Threads_lock to gurantee this property. It also makes sure that |
4202 // all threads gets blocked when exiting or starting). |
4202 // all threads gets blocked when exiting or starting). |
4203 |
4203 |
4204 void Threads::oops_do(OopClosure* f, CodeBlobClosure* cf) { |
4204 void Threads::oops_do(OopClosure* f, CLDToOopClosure* cld_f, CodeBlobClosure* cf) { |
4205 ALL_JAVA_THREADS(p) { |
4205 ALL_JAVA_THREADS(p) { |
4206 p->oops_do(f, cf); |
4206 p->oops_do(f, cld_f, cf); |
4207 } |
4207 } |
4208 VMThread::vm_thread()->oops_do(f, cf); |
4208 VMThread::vm_thread()->oops_do(f, cld_f, cf); |
4209 } |
4209 } |
4210 |
4210 |
4211 void Threads::possibly_parallel_oops_do(OopClosure* f, CodeBlobClosure* cf) { |
4211 void Threads::possibly_parallel_oops_do(OopClosure* f, CLDToOopClosure* cld_f, CodeBlobClosure* cf) { |
4212 // Introduce a mechanism allowing parallel threads to claim threads as |
4212 // Introduce a mechanism allowing parallel threads to claim threads as |
4213 // root groups. Overhead should be small enough to use all the time, |
4213 // root groups. Overhead should be small enough to use all the time, |
4214 // even in sequential code. |
4214 // even in sequential code. |
4215 SharedHeap* sh = SharedHeap::heap(); |
4215 SharedHeap* sh = SharedHeap::heap(); |
4216 // Cannot yet substitute active_workers for n_par_threads |
4216 // Cannot yet substitute active_workers for n_par_threads |
4223 (SharedHeap::heap()->n_par_threads() == |
4223 (SharedHeap::heap()->n_par_threads() == |
4224 SharedHeap::heap()->workers()->active_workers()), "Mismatch"); |
4224 SharedHeap::heap()->workers()->active_workers()), "Mismatch"); |
4225 int cp = SharedHeap::heap()->strong_roots_parity(); |
4225 int cp = SharedHeap::heap()->strong_roots_parity(); |
4226 ALL_JAVA_THREADS(p) { |
4226 ALL_JAVA_THREADS(p) { |
4227 if (p->claim_oops_do(is_par, cp)) { |
4227 if (p->claim_oops_do(is_par, cp)) { |
4228 p->oops_do(f, cf); |
4228 p->oops_do(f, cld_f, cf); |
4229 } |
4229 } |
4230 } |
4230 } |
4231 VMThread* vmt = VMThread::vm_thread(); |
4231 VMThread* vmt = VMThread::vm_thread(); |
4232 if (vmt->claim_oops_do(is_par, cp)) { |
4232 if (vmt->claim_oops_do(is_par, cp)) { |
4233 vmt->oops_do(f, cf); |
4233 vmt->oops_do(f, cld_f, cf); |
4234 } |
4234 } |
4235 } |
4235 } |
4236 |
4236 |
4237 #ifndef SERIALGC |
4237 #ifndef SERIALGC |
4238 // Used by ParallelScavenge |
4238 // Used by ParallelScavenge |