hotspot/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.hpp

Print this page
rev 611 : Merge

*** 1,10 **** #ifdef USE_PRAGMA_IDENT_HDR #pragma ident "@(#)psCompactionManager.hpp 1.17 07/05/05 17:05:29 JVM" #endif /* ! * Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,10 ---- #ifdef USE_PRAGMA_IDENT_HDR #pragma ident "@(#)psCompactionManager.hpp 1.17 07/05/05 17:05:29 JVM" #endif /* ! * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 53,63 **** class ParCompactionManager : public CHeapObj { friend class ParallelTaskTerminator; friend class ParMarkBitMap; friend class PSParallelCompact; ! friend class StealChunkCompactionTask; friend class UpdateAndFillClosure; friend class RefProcTaskExecutor; public: --- 53,63 ---- class ParCompactionManager : public CHeapObj { friend class ParallelTaskTerminator; friend class ParMarkBitMap; friend class PSParallelCompact; ! friend class StealRegionCompactionTask; friend class UpdateAndFillClosure; friend class RefProcTaskExecutor; public:
*** 76,99 **** private: static ParCompactionManager** _manager_array; static OopTaskQueueSet* _stack_array; static ObjectStartArray* _start_array; ! static ChunkTaskQueueSet* _chunk_array; static PSOldGen* _old_gen; OopTaskQueue _marking_stack; GrowableArray<oop>* _overflow_stack; // Is there a way to reuse the _marking_stack for the ! // saving empty chunks? For now just create a different // type of TaskQueue. ! #ifdef USE_ChunkTaskQueueWithOverflow ! ChunkTaskQueueWithOverflow _chunk_stack; #else ! ChunkTaskQueue _chunk_stack; ! GrowableArray<size_t>* _chunk_overflow_stack; #endif #if 1 // does this happen enough to need a per thread stack? GrowableArray<Klass*>* _revisit_klass_stack; #endif --- 76,99 ---- private: static ParCompactionManager** _manager_array; static OopTaskQueueSet* _stack_array; static ObjectStartArray* _start_array; ! static RegionTaskQueueSet* _region_array; static PSOldGen* _old_gen; OopTaskQueue _marking_stack; GrowableArray<oop>* _overflow_stack; // Is there a way to reuse the _marking_stack for the ! // saving empty regions? For now just create a different // type of TaskQueue. ! #ifdef USE_RegionTaskQueueWithOverflow ! RegionTaskQueueWithOverflow _region_stack; #else ! RegionTaskQueue _region_stack; ! GrowableArray<size_t>* _region_overflow_stack; #endif #if 1 // does this happen enough to need a per thread stack? GrowableArray<Klass*>* _revisit_klass_stack; #endif
*** 107,136 **** static void initialize(ParMarkBitMap* mbm); protected: // Array of tasks. Needed by the ParallelTaskTerminator. ! static ChunkTaskQueueSet* chunk_array() { return _chunk_array; } ! OopTaskQueue* marking_stack() { return &_marking_stack; } GrowableArray<oop>* overflow_stack() { return _overflow_stack; } ! #ifdef USE_ChunkTaskQueueWithOverflow ! ChunkTaskQueueWithOverflow* chunk_stack() { return &_chunk_stack; } #else ! ChunkTaskQueue* chunk_stack() { return &_chunk_stack; } ! GrowableArray<size_t>* chunk_overflow_stack() { return _chunk_overflow_stack; } #endif // Pushes onto the marking stack. If the marking stack is full, // pushes onto the overflow stack. void stack_push(oop obj); // Do not implement an equivalent stack_pop. Deal with the // marking stack and overflow stack directly. ! // Pushes onto the chunk stack. If the chunk stack is full, ! // pushes onto the chunk overflow stack. ! void chunk_stack_push(size_t chunk_index); public: Action action() { return _action; } void set_action(Action v) { _action = v; } --- 107,137 ---- static void initialize(ParMarkBitMap* mbm); protected: // Array of tasks. Needed by the ParallelTaskTerminator. ! static RegionTaskQueueSet* region_array() { return _region_array; } OopTaskQueue* marking_stack() { return &_marking_stack; } GrowableArray<oop>* overflow_stack() { return _overflow_stack; } ! #ifdef USE_RegionTaskQueueWithOverflow ! RegionTaskQueueWithOverflow* region_stack() { return &_region_stack; } #else ! RegionTaskQueue* region_stack() { return &_region_stack; } ! GrowableArray<size_t>* region_overflow_stack() { ! return _region_overflow_stack; ! } #endif // Pushes onto the marking stack. If the marking stack is full, // pushes onto the overflow stack. void stack_push(oop obj); // Do not implement an equivalent stack_pop. Deal with the // marking stack and overflow stack directly. ! // Pushes onto the region stack. If the region stack is full, ! // pushes onto the region overflow stack. ! void region_stack_push(size_t region_index); public: Action action() { return _action; } void set_action(Action v) { _action = v; }
*** 161,194 **** // Save oop for later processing. Must not fail. void save_for_scanning(oop m); // Get a oop for scanning. If returns null, no oop were found. oop retrieve_for_scanning(); ! // Save chunk for later processing. Must not fail. ! void save_for_processing(size_t chunk_index); ! // Get a chunk for processing. If returns null, no chunk were found. ! bool retrieve_for_processing(size_t& chunk_index); // Access function for compaction managers static ParCompactionManager* gc_thread_compaction_manager(int index); static bool steal(int queue_num, int* seed, Task& t) { return stack_array()->steal(queue_num, seed, t); } ! static bool steal(int queue_num, int* seed, ChunkTask& t) { ! return chunk_array()->steal(queue_num, seed, t); } // Process tasks remaining on any stack void drain_marking_stacks(OopClosure *blk); // Process tasks remaining on any stack ! void drain_chunk_stacks(); // Process tasks remaining on any stack ! void drain_chunk_overflow_stack(); // Debugging support #ifdef ASSERT bool stacks_have_been_allocated(); #endif --- 162,195 ---- // Save oop for later processing. Must not fail. void save_for_scanning(oop m); // Get a oop for scanning. If returns null, no oop were found. oop retrieve_for_scanning(); ! // Save region for later processing. Must not fail. ! void save_for_processing(size_t region_index); ! // Get a region for processing. If returns null, no region were found. ! bool retrieve_for_processing(size_t& region_index); // Access function for compaction managers static ParCompactionManager* gc_thread_compaction_manager(int index); static bool steal(int queue_num, int* seed, Task& t) { return stack_array()->steal(queue_num, seed, t); } ! static bool steal(int queue_num, int* seed, RegionTask& t) { ! return region_array()->steal(queue_num, seed, t); } // Process tasks remaining on any stack void drain_marking_stacks(OopClosure *blk); // Process tasks remaining on any stack ! void drain_region_stacks(); // Process tasks remaining on any stack ! void drain_region_overflow_stack(); // Debugging support #ifdef ASSERT bool stacks_have_been_allocated(); #endif