< prev index next >

src/share/vm/gc/parallel/psPromotionManager.cpp

Print this page

        

*** 21,30 **** --- 21,31 ---- * questions. * */ #include "precompiled.hpp" + #include "gc/parallel/gcTaskManager.hpp" #include "gc/parallel/mutableSpace.hpp" #include "gc/parallel/parallelScavengeHeap.hpp" #include "gc/parallel/psOldGen.hpp" #include "gc/parallel/psPromotionManager.inline.hpp" #include "gc/parallel/psScavenge.inline.hpp"
*** 235,246 **** void PSPromotionManager::register_preserved_marks(PreservedMarks* preserved_marks) { assert(_preserved_marks == NULL, "do not set it twice"); _preserved_marks = preserved_marks; } void PSPromotionManager::restore_preserved_marks() { ! _preserved_marks_set->restore(PSScavenge::gc_task_manager()); } void PSPromotionManager::drain_stacks_depth(bool totally_drain) { totally_drain = totally_drain || _totally_drain; --- 236,291 ---- void PSPromotionManager::register_preserved_marks(PreservedMarks* preserved_marks) { assert(_preserved_marks == NULL, "do not set it twice"); _preserved_marks = preserved_marks; } + class ParRestoreGCTask : public GCTask { + private: + const uint _id; + PreservedMarksSet* const _preserved_marks_set; + volatile size_t* const _total_size_addr; + + public: + virtual char* name() { + return (char*) "preserved mark restoration task"; + } + + virtual void do_it(GCTaskManager* manager, uint which){ + _preserved_marks_set->get(_id)->restore_and_increment(_total_size_addr); + } + + ParRestoreGCTask(uint id, + PreservedMarksSet* preserved_marks_set, + volatile size_t* total_size_addr) + : _id(id), + _preserved_marks_set(preserved_marks_set), + _total_size_addr(total_size_addr) { } + }; + + class PSPreservedMarksTaskExecutor : public RestorePreservedMarksTaskExecutor { + public: + GCTaskManager* _gc_task_manager; + + PSPreservedMarksTaskExecutor(GCTaskManager* gc_task_manager) + : _gc_task_manager(gc_task_manager) { } + + void restore(PreservedMarksSet* preserved_marks_set, + volatile size_t* total_size_addr) { + // GCTask / GCTaskQueue are ResourceObjs + ResourceMark rm; + + GCTaskQueue* q = GCTaskQueue::create(); + for (uint i = 0; i < preserved_marks_set->num(); i += 1) { + q->enqueue(new ParRestoreGCTask(i, preserved_marks_set, total_size_addr)); + } + _gc_task_manager->execute_and_wait(q); + } + }; + void PSPromotionManager::restore_preserved_marks() { ! PSPreservedMarksTaskExecutor task_executor(PSScavenge::gc_task_manager()); ! _preserved_marks_set->restore(&task_executor); } void PSPromotionManager::drain_stacks_depth(bool totally_drain) { totally_drain = totally_drain || _totally_drain;
< prev index next >