< prev index next >
src/share/vm/gc/parallel/psParallelCompact.cpp
Print this page
rev 11778 : [mq]: service.patch
@@ -2057,10 +2057,30 @@
assert(ParallelScavengeHeap::gc_task_manager() != NULL,
"shouldn't return NULL");
return ParallelScavengeHeap::gc_task_manager();
}
+class CreateThreadRootsMarkingTasksClosure : public ThreadClosure {
+
+private:
+ GCTaskQueue* _queue;
+
+public:
+
+ CreateThreadRootsMarkingTasksClosure(GCTaskQueue* q) : _queue(q) {
+ }
+
+ void do_thread(Thread* thread) {
+ if (thread->is_Java_thread()) {
+ _queue->enqueue(new ThreadRootsMarkingTask((JavaThread*) thread));
+ } else if (thread->is_VM_thread()) {
+ _queue->enqueue(new ThreadRootsMarkingTask((VMThread*) thread));
+ }
+ }
+
+};
+
void PSParallelCompact::marking_phase(ParCompactionManager* cm,
bool maximum_heap_compaction,
ParallelOldTracer *gc_tracer) {
// Recursively traverse all live objects and mark them
GCTraceTime(Info, gc, phases) tm("Marking Phase", &_gc_timer);
@@ -2085,11 +2105,12 @@
GCTaskQueue* q = GCTaskQueue::create();
q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::universe));
q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::jni_handles));
// We scan the thread roots in parallel
- Threads::create_thread_roots_marking_tasks(q);
+ CreateThreadRootsMarkingTasksClosure cl(q);
+ Threads::threads_do(&cl);
q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::object_synchronizer));
q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::flat_profiler));
q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::management));
q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::system_dictionary));
q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::class_loader_data));
< prev index next >