1.1 --- a/src/share/vm/runtime/thread.cpp Fri Sep 25 04:39:54 2009 -0700 1.2 +++ b/src/share/vm/runtime/thread.cpp Wed Sep 30 13:25:39 2009 -0700 1.3 @@ -683,14 +683,15 @@ 1.4 return false; 1.5 } 1.6 1.7 -void Thread::oops_do(OopClosure* f) { 1.8 +void Thread::oops_do(OopClosure* f, CodeBlobClosure* cf) { 1.9 active_handles()->oops_do(f); 1.10 // Do oop for ThreadShadow 1.11 f->do_oop((oop*)&_pending_exception); 1.12 handle_area()->oops_do(f); 1.13 } 1.14 1.15 -void Thread::nmethods_do() { 1.16 +void Thread::nmethods_do(CodeBlobClosure* cf) { 1.17 + // no nmethods in a generic thread... 1.18 } 1.19 1.20 void Thread::print_on(outputStream* st) const { 1.21 @@ -2316,12 +2317,12 @@ 1.22 } 1.23 1.24 1.25 -void JavaThread::oops_do(OopClosure* f) { 1.26 +void JavaThread::oops_do(OopClosure* f, CodeBlobClosure* cf) { 1.27 // The ThreadProfiler oops_do is done from FlatProfiler::oops_do 1.28 // since there may be more than one thread using each ThreadProfiler. 1.29 1.30 // Traverse the GCHandles 1.31 - Thread::oops_do(f); 1.32 + Thread::oops_do(f, cf); 1.33 1.34 assert( (!has_last_Java_frame() && java_call_counter() == 0) || 1.35 (has_last_Java_frame() && java_call_counter() > 0), "wrong java_sp info!"); 1.36 @@ -2347,7 +2348,7 @@ 1.37 1.38 // Traverse the execution stack 1.39 for(StackFrameStream fst(this); !fst.is_done(); fst.next()) { 1.40 - fst.current()->oops_do(f, fst.register_map()); 1.41 + fst.current()->oops_do(f, cf, fst.register_map()); 1.42 } 1.43 } 1.44 1.45 @@ -2379,9 +2380,8 @@ 1.46 } 1.47 } 1.48 1.49 -void JavaThread::nmethods_do() { 1.50 - // Traverse the GCHandles 1.51 - Thread::nmethods_do(); 1.52 +void JavaThread::nmethods_do(CodeBlobClosure* cf) { 1.53 + Thread::nmethods_do(cf); // (super method is a no-op) 1.54 1.55 assert( (!has_last_Java_frame() && java_call_counter() == 0) || 1.56 (has_last_Java_frame() && java_call_counter() > 0), "wrong java_sp info!"); 1.57 @@ -2389,7 +2389,7 @@ 1.58 if (has_last_Java_frame()) { 1.59 // Traverse the execution stack 1.60 for(StackFrameStream fst(this); !fst.is_done(); fst.next()) { 1.61 - fst.current()->nmethods_do(); 1.62 + fst.current()->nmethods_do(cf); 1.63 } 1.64 } 1.65 } 1.66 @@ -2463,7 +2463,7 @@ 1.67 1.68 void JavaThread::verify() { 1.69 // Verify oops in the thread. 1.70 - oops_do(&VerifyOopClosure::verify_oop); 1.71 + oops_do(&VerifyOopClosure::verify_oop, NULL); 1.72 1.73 // Verify the stack frames. 1.74 frames_do(frame_verify); 1.75 @@ -3602,14 +3602,14 @@ 1.76 // uses the Threads_lock to gurantee this property. It also makes sure that 1.77 // all threads gets blocked when exiting or starting). 1.78 1.79 -void Threads::oops_do(OopClosure* f) { 1.80 +void Threads::oops_do(OopClosure* f, CodeBlobClosure* cf) { 1.81 ALL_JAVA_THREADS(p) { 1.82 - p->oops_do(f); 1.83 + p->oops_do(f, cf); 1.84 } 1.85 - VMThread::vm_thread()->oops_do(f); 1.86 + VMThread::vm_thread()->oops_do(f, cf); 1.87 } 1.88 1.89 -void Threads::possibly_parallel_oops_do(OopClosure* f) { 1.90 +void Threads::possibly_parallel_oops_do(OopClosure* f, CodeBlobClosure* cf) { 1.91 // Introduce a mechanism allowing parallel threads to claim threads as 1.92 // root groups. Overhead should be small enough to use all the time, 1.93 // even in sequential code. 1.94 @@ -3618,12 +3618,12 @@ 1.95 int cp = SharedHeap::heap()->strong_roots_parity(); 1.96 ALL_JAVA_THREADS(p) { 1.97 if (p->claim_oops_do(is_par, cp)) { 1.98 - p->oops_do(f); 1.99 + p->oops_do(f, cf); 1.100 } 1.101 } 1.102 VMThread* vmt = VMThread::vm_thread(); 1.103 if (vmt->claim_oops_do(is_par, cp)) 1.104 - vmt->oops_do(f); 1.105 + vmt->oops_do(f, cf); 1.106 } 1.107 1.108 #ifndef SERIALGC 1.109 @@ -3644,11 +3644,11 @@ 1.110 } 1.111 #endif // SERIALGC 1.112 1.113 -void Threads::nmethods_do() { 1.114 +void Threads::nmethods_do(CodeBlobClosure* cf) { 1.115 ALL_JAVA_THREADS(p) { 1.116 - p->nmethods_do(); 1.117 + p->nmethods_do(cf); 1.118 } 1.119 - VMThread::vm_thread()->nmethods_do(); 1.120 + VMThread::vm_thread()->nmethods_do(cf); 1.121 } 1.122 1.123 void Threads::gc_epilogue() {