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();
|