< prev index next >

src/hotspot/share/gc/parallel/pcTasks.cpp

8211446_01: revision due to comments from StefanJ and Thomas

41 #include "oops/oop.inline.hpp"                                                                                             
42 #include "prims/jvmtiExport.hpp"                                                                                           
43 #include "runtime/jniHandles.hpp"                                                                                          
44 #include "runtime/thread.hpp"                                                                                              
45 #include "runtime/vmThread.hpp"                                                                                            
46 #include "services/management.hpp"                                                                                         
47 #include "utilities/stack.inline.hpp"                                                                                      
48 
49 //                                                                                                                         
50 // ThreadRootsMarkingTask                                                                                                  
51 //                                                                                                                         
52 
53 void ThreadRootsMarkingTask::do_it(GCTaskManager* manager, uint which) {                                                   
54   assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");                                               
55 
56   ResourceMark rm;                                                                                                         
57 
58   ParCompactionManager* cm =                                                                                               
59     ParCompactionManager::gc_thread_compaction_manager(which);                                                             
60 
61   PSMarkAndPushClosure mark_and_push_closure(cm);                                                                          
62   MarkingCodeBlobClosure mark_and_push_in_blobs(&mark_and_push_closure, !CodeBlobToOopClosure::FixRelocations);            
63 
64   _thread->oops_do(&mark_and_push_closure, &mark_and_push_in_blobs);                                                       
65 
66   // Do the real work                                                                                                      
67   cm->follow_marking_stacks();                                                                                             
68 }                                                                                                                          
69 
70 
71 void MarkFromRootsTask::do_it(GCTaskManager* manager, uint which) {                                                        
72   assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");                                               
73 
74   ParCompactionManager* cm =                                                                                               
75     ParCompactionManager::gc_thread_compaction_manager(which);                                                             
76   PSMarkAndPushClosure mark_and_push_closure(cm);                                                                          
77 
78   switch (_root_type) {                                                                                                    
79     case universe:                                                                                                         
80       Universe::oops_do(&mark_and_push_closure);                                                                           
81       break;                                                                                                               
82 
83     case jni_handles:                                                                                                      
84       JNIHandles::oops_do(&mark_and_push_closure);                                                                         
85       break;                                                                                                               
86 
87     case threads:                                                                                                          
88     {                                                                                                                      
89       ResourceMark rm;                                                                                                     
90       MarkingCodeBlobClosure each_active_code_blob(&mark_and_push_closure, !CodeBlobToOopClosure::FixRelocations);         
91       Threads::oops_do(&mark_and_push_closure, &each_active_code_blob);                                                    
92     }                                                                                                                      
93     break;                                                                                                                 
94 
95     case object_synchronizer:                                                                                              

41 #include "oops/oop.inline.hpp"
42 #include "prims/jvmtiExport.hpp"
43 #include "runtime/jniHandles.hpp"
44 #include "runtime/thread.hpp"
45 #include "runtime/vmThread.hpp"
46 #include "services/management.hpp"
47 #include "utilities/stack.inline.hpp"
48 
49 //
50 // ThreadRootsMarkingTask
51 //
52 
53 void ThreadRootsMarkingTask::do_it(GCTaskManager* manager, uint which) {
54   assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");
55 
56   ResourceMark rm;
57 
58   ParCompactionManager* cm =
59     ParCompactionManager::gc_thread_compaction_manager(which);
60 
61   PCMarkAndPushClosure mark_and_push_closure(cm);
62   MarkingCodeBlobClosure mark_and_push_in_blobs(&mark_and_push_closure, !CodeBlobToOopClosure::FixRelocations);
63 
64   _thread->oops_do(&mark_and_push_closure, &mark_and_push_in_blobs);
65 
66   // Do the real work
67   cm->follow_marking_stacks();
68 }
69 
70 
71 void MarkFromRootsTask::do_it(GCTaskManager* manager, uint which) {
72   assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");
73 
74   ParCompactionManager* cm =
75     ParCompactionManager::gc_thread_compaction_manager(which);
76   PCMarkAndPushClosure mark_and_push_closure(cm);
77 
78   switch (_root_type) {
79     case universe:
80       Universe::oops_do(&mark_and_push_closure);
81       break;
82 
83     case jni_handles:
84       JNIHandles::oops_do(&mark_and_push_closure);
85       break;
86 
87     case threads:
88     {
89       ResourceMark rm;
90       MarkingCodeBlobClosure each_active_code_blob(&mark_and_push_closure, !CodeBlobToOopClosure::FixRelocations);
91       Threads::oops_do(&mark_and_push_closure, &each_active_code_blob);
92     }
93     break;
94 
95     case object_synchronizer:

122 
123     default:                                                                                                               
124       fatal("Unknown root type");                                                                                          
125   }                                                                                                                        
126 
127   // Do the real work                                                                                                      
128   cm->follow_marking_stacks();                                                                                             
129 }                                                                                                                          
130 
131 
132 //                                                                                                                         
133 // RefProcTaskProxy                                                                                                        
134 //                                                                                                                         
135 
136 void RefProcTaskProxy::do_it(GCTaskManager* manager, uint which)                                                           
137 {                                                                                                                          
138   assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");                                               
139 
140   ParCompactionManager* cm =                                                                                               
141     ParCompactionManager::gc_thread_compaction_manager(which);                                                             
142   PSMarkAndPushClosure mark_and_push_closure(cm);                                                                          
143   ParCompactionManager::FollowStackClosure follow_stack_closure(cm);                                                       
144   _rp_task.work(_work_id, *PSParallelCompact::is_alive_closure(),                                                          
145                 mark_and_push_closure, follow_stack_closure);                                                              
146 }                                                                                                                          
147 
148 //                                                                                                                         
149 // RefProcTaskExecutor                                                                                                     
150 //                                                                                                                         
151 
152 void RefProcTaskExecutor::execute(ProcessTask& task, uint ergo_workers)                                                    
153 {                                                                                                                          
154   ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();                                                               
155   uint active_gc_threads = heap->gc_task_manager()->active_workers();                                                      
156   assert(active_gc_threads == ergo_workers,                                                                                
157          "Ergonomically chosen workers (%u) must be equal to active workers (%u)",                                         
158          ergo_workers, active_gc_threads);                                                                                 
159   OopTaskQueueSet* qset = ParCompactionManager::stack_array();                                                             
160   ParallelTaskTerminator terminator(active_gc_threads, qset);                                                              
161   GCTaskQueue* q = GCTaskQueue::create();                                                                                  

122 
123     default:
124       fatal("Unknown root type");
125   }
126 
127   // Do the real work
128   cm->follow_marking_stacks();
129 }
130 
131 
132 //
133 // RefProcTaskProxy
134 //
135 
136 void RefProcTaskProxy::do_it(GCTaskManager* manager, uint which)
137 {
138   assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");
139 
140   ParCompactionManager* cm =
141     ParCompactionManager::gc_thread_compaction_manager(which);
142   PCMarkAndPushClosure mark_and_push_closure(cm);
143   ParCompactionManager::FollowStackClosure follow_stack_closure(cm);
144   _rp_task.work(_work_id, *PSParallelCompact::is_alive_closure(),
145                 mark_and_push_closure, follow_stack_closure);
146 }
147 
148 //
149 // RefProcTaskExecutor
150 //
151 
152 void RefProcTaskExecutor::execute(ProcessTask& task, uint ergo_workers)
153 {
154   ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
155   uint active_gc_threads = heap->gc_task_manager()->active_workers();
156   assert(active_gc_threads == ergo_workers,
157          "Ergonomically chosen workers (%u) must be equal to active workers (%u)",
158          ergo_workers, active_gc_threads);
159   OopTaskQueueSet* qset = ParCompactionManager::stack_array();
160   ParallelTaskTerminator terminator(active_gc_threads, qset);
161   GCTaskQueue* q = GCTaskQueue::create();
< prev index next >