< prev index next >
src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.hpp
Print this page
*** 168,181 ****
bool should_update();
bool should_copy();
// Save for later processing. Must not fail.
! inline void push(oop obj) { _marking_stack.push(obj); }
inline void push_objarray(oop objarray, size_t index);
inline void push_region(size_t index);
// Access function for compaction managers
static ParCompactionManager* gc_thread_compaction_manager(int index);
static bool steal(int queue_num, int* seed, oop& t) {
return stack_array()->steal(queue_num, seed, t);
--- 168,186 ----
bool should_update();
bool should_copy();
// Save for later processing. Must not fail.
! inline void push(oop obj);
inline void push_objarray(oop objarray, size_t index);
inline void push_region(size_t index);
+ template <typename T>
+ inline void mark_and_push(T* p);
+
+ inline void follow_klass(Klass* klass);
+
// Access function for compaction managers
static ParCompactionManager* gc_thread_compaction_manager(int index);
static bool steal(int queue_num, int* seed, oop& t) {
return stack_array()->steal(queue_num, seed, t);
*** 198,207 ****
--- 203,245 ----
void follow_contents(oop obj);
void follow_contents(objArrayOop array, int index);
void update_contents(oop obj);
+
+ class MarkAndPushClosure: public ExtendedOopClosure {
+ private:
+ ParCompactionManager* _compaction_manager;
+ public:
+ MarkAndPushClosure(ParCompactionManager* cm) : _compaction_manager(cm) { }
+
+ template <typename T> void do_oop_nv(T* p);
+ virtual void do_oop(oop* p);
+ virtual void do_oop(narrowOop* p);
+
+ // This closure provides its own oop verification code.
+ debug_only(virtual bool should_verify_oops() { return false; })
+ };
+
+ class FollowStackClosure: public VoidClosure {
+ private:
+ ParCompactionManager* _compaction_manager;
+ public:
+ FollowStackClosure(ParCompactionManager* cm) : _compaction_manager(cm) { }
+ virtual void do_void();
+ };
+
+ // The one and only place to start following the classes.
+ // Should only be applied to the ClassLoaderData klasses list.
+ class FollowKlassClosure : public KlassClosure {
+ private:
+ MarkAndPushClosure* _mark_and_push_closure;
+ public:
+ FollowKlassClosure(MarkAndPushClosure* mark_and_push_closure) :
+ _mark_and_push_closure(mark_and_push_closure) { }
+ void do_klass(Klass* klass);
+ };
};
inline ParCompactionManager* ParCompactionManager::manager_array(int index) {
assert(_manager_array != NULL, "access of NULL manager_array");
assert(index >= 0 && index <= (int)ParallelGCThreads,
< prev index next >