Tue, 22 Sep 2009 14:06:10 -0700
6884624: Update copyright year
Summary: Update copyright for files that have been modified in 2009 through Septermber
Reviewed-by: tbell, ohair
1 /*
2 * Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 *
23 */
25 # include "incls/_precompiled.incl"
26 # include "incls/_pcTasks.cpp.incl"
28 //
29 // ThreadRootsMarkingTask
30 //
32 void ThreadRootsMarkingTask::do_it(GCTaskManager* manager, uint which) {
33 assert(Universe::heap()->is_gc_active(), "called outside gc");
35 ResourceMark rm;
37 NOT_PRODUCT(TraceTime tm("ThreadRootsMarkingTask",
38 PrintGCDetails && TraceParallelOldGCTasks, true, gclog_or_tty));
39 ParCompactionManager* cm =
40 ParCompactionManager::gc_thread_compaction_manager(which);
41 PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm);
43 if (_java_thread != NULL)
44 _java_thread->oops_do(&mark_and_push_closure);
46 if (_vm_thread != NULL)
47 _vm_thread->oops_do(&mark_and_push_closure);
49 // Do the real work
50 cm->drain_marking_stacks(&mark_and_push_closure);
51 }
54 void MarkFromRootsTask::do_it(GCTaskManager* manager, uint which) {
55 assert(Universe::heap()->is_gc_active(), "called outside gc");
57 NOT_PRODUCT(TraceTime tm("MarkFromRootsTask",
58 PrintGCDetails && TraceParallelOldGCTasks, true, gclog_or_tty));
59 ParCompactionManager* cm =
60 ParCompactionManager::gc_thread_compaction_manager(which);
61 assert(cm->stacks_have_been_allocated(),
62 "Stack space has not been allocated");
63 PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm);
65 switch (_root_type) {
66 case universe:
67 Universe::oops_do(&mark_and_push_closure);
68 break;
70 case reference_processing:
71 ReferenceProcessor::oops_do(&mark_and_push_closure);
72 break;
74 case jni_handles:
75 JNIHandles::oops_do(&mark_and_push_closure);
76 break;
78 case threads:
79 {
80 ResourceMark rm;
81 Threads::oops_do(&mark_and_push_closure);
82 }
83 break;
85 case object_synchronizer:
86 ObjectSynchronizer::oops_do(&mark_and_push_closure);
87 break;
89 case flat_profiler:
90 FlatProfiler::oops_do(&mark_and_push_closure);
91 break;
93 case management:
94 Management::oops_do(&mark_and_push_closure);
95 break;
97 case jvmti:
98 JvmtiExport::oops_do(&mark_and_push_closure);
99 break;
101 case system_dictionary:
102 SystemDictionary::always_strong_oops_do(&mark_and_push_closure);
103 break;
105 case vm_symbols:
106 vmSymbols::oops_do(&mark_and_push_closure);
107 break;
109 default:
110 fatal("Unknown root type");
111 }
113 // Do the real work
114 cm->drain_marking_stacks(&mark_and_push_closure);
115 // cm->deallocate_stacks();
116 }
119 //
120 // RefProcTaskProxy
121 //
123 void RefProcTaskProxy::do_it(GCTaskManager* manager, uint which)
124 {
125 assert(Universe::heap()->is_gc_active(), "called outside gc");
127 NOT_PRODUCT(TraceTime tm("RefProcTask",
128 PrintGCDetails && TraceParallelOldGCTasks, true, gclog_or_tty));
129 ParCompactionManager* cm =
130 ParCompactionManager::gc_thread_compaction_manager(which);
131 assert(cm->stacks_have_been_allocated(),
132 "Stack space has not been allocated");
133 PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm);
134 PSParallelCompact::FollowStackClosure follow_stack_closure(cm);
135 _rp_task.work(_work_id, *PSParallelCompact::is_alive_closure(),
136 mark_and_push_closure, follow_stack_closure);
137 }
139 //
140 // RefProcTaskExecutor
141 //
143 void RefProcTaskExecutor::execute(ProcessTask& task)
144 {
145 ParallelScavengeHeap* heap = PSParallelCompact::gc_heap();
146 uint parallel_gc_threads = heap->gc_task_manager()->workers();
147 RegionTaskQueueSet* qset = ParCompactionManager::region_array();
148 ParallelTaskTerminator terminator(parallel_gc_threads, qset);
149 GCTaskQueue* q = GCTaskQueue::create();
150 for(uint i=0; i<parallel_gc_threads; i++) {
151 q->enqueue(new RefProcTaskProxy(task, i));
152 }
153 if (task.marks_oops_alive()) {
154 if (parallel_gc_threads>1) {
155 for (uint j=0; j<parallel_gc_threads; j++) {
156 q->enqueue(new StealMarkingTask(&terminator));
157 }
158 }
159 }
160 PSParallelCompact::gc_task_manager()->execute_and_wait(q);
161 }
163 void RefProcTaskExecutor::execute(EnqueueTask& task)
164 {
165 ParallelScavengeHeap* heap = PSParallelCompact::gc_heap();
166 uint parallel_gc_threads = heap->gc_task_manager()->workers();
167 GCTaskQueue* q = GCTaskQueue::create();
168 for(uint i=0; i<parallel_gc_threads; i++) {
169 q->enqueue(new RefEnqueueTaskProxy(task, i));
170 }
171 PSParallelCompact::gc_task_manager()->execute_and_wait(q);
172 }
174 //
175 // StealMarkingTask
176 //
178 StealMarkingTask::StealMarkingTask(ParallelTaskTerminator* t) :
179 _terminator(t) {}
181 void StealMarkingTask::do_it(GCTaskManager* manager, uint which) {
182 assert(Universe::heap()->is_gc_active(), "called outside gc");
184 NOT_PRODUCT(TraceTime tm("StealMarkingTask",
185 PrintGCDetails && TraceParallelOldGCTasks, true, gclog_or_tty));
187 ParCompactionManager* cm =
188 ParCompactionManager::gc_thread_compaction_manager(which);
189 PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm);
191 oop obj = NULL;
192 int random_seed = 17;
193 while(true) {
194 if (ParCompactionManager::steal(which, &random_seed, obj)) {
195 obj->follow_contents(cm);
196 cm->drain_marking_stacks(&mark_and_push_closure);
197 } else {
198 if (terminator()->offer_termination()) {
199 break;
200 }
201 }
202 }
203 }
205 //
206 // StealRegionCompactionTask
207 //
210 StealRegionCompactionTask::StealRegionCompactionTask(ParallelTaskTerminator* t):
211 _terminator(t) {}
213 void StealRegionCompactionTask::do_it(GCTaskManager* manager, uint which) {
214 assert(Universe::heap()->is_gc_active(), "called outside gc");
216 NOT_PRODUCT(TraceTime tm("StealRegionCompactionTask",
217 PrintGCDetails && TraceParallelOldGCTasks, true, gclog_or_tty));
219 ParCompactionManager* cm =
220 ParCompactionManager::gc_thread_compaction_manager(which);
222 // Has to drain stacks first because there may be regions on
223 // preloaded onto the stack and this thread may never have
224 // done a draining task. Are the draining tasks needed?
226 cm->drain_region_stacks();
228 size_t region_index = 0;
229 int random_seed = 17;
231 // If we're the termination task, try 10 rounds of stealing before
232 // setting the termination flag
234 while(true) {
235 if (ParCompactionManager::steal(which, &random_seed, region_index)) {
236 PSParallelCompact::fill_and_update_region(cm, region_index);
237 cm->drain_region_stacks();
238 } else {
239 if (terminator()->offer_termination()) {
240 break;
241 }
242 // Go around again.
243 }
244 }
245 return;
246 }
248 UpdateDensePrefixTask::UpdateDensePrefixTask(
249 PSParallelCompact::SpaceId space_id,
250 size_t region_index_start,
251 size_t region_index_end) :
252 _space_id(space_id), _region_index_start(region_index_start),
253 _region_index_end(region_index_end) {}
255 void UpdateDensePrefixTask::do_it(GCTaskManager* manager, uint which) {
257 NOT_PRODUCT(TraceTime tm("UpdateDensePrefixTask",
258 PrintGCDetails && TraceParallelOldGCTasks, true, gclog_or_tty));
260 ParCompactionManager* cm =
261 ParCompactionManager::gc_thread_compaction_manager(which);
263 PSParallelCompact::update_and_deadwood_in_dense_prefix(cm,
264 _space_id,
265 _region_index_start,
266 _region_index_end);
267 }
269 void DrainStacksCompactionTask::do_it(GCTaskManager* manager, uint which) {
270 assert(Universe::heap()->is_gc_active(), "called outside gc");
272 NOT_PRODUCT(TraceTime tm("DrainStacksCompactionTask",
273 PrintGCDetails && TraceParallelOldGCTasks, true, gclog_or_tty));
275 ParCompactionManager* cm =
276 ParCompactionManager::gc_thread_compaction_manager(which);
278 // Process any regions already in the compaction managers stacks.
279 cm->drain_region_stacks();
280 }