Mercurial > hg > graal-compiler
comparison src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.hpp @ 1706:9d7a8ab3736b
6962589: remove breadth first scanning code from parallel gc
Summary: Remove the breadth-first copying order from ParallelScavenge and use depth-first by default.
Reviewed-by: jcoomes, ysr, johnc
author | tonyp |
---|---|
date | Thu, 22 Jul 2010 10:27:41 -0400 |
parents | a93a9eda13f7 |
children | f95d63e2154a |
comparison
equal
deleted
inserted
replaced
1705:2d160770d2e5 | 1706:9d7a8ab3736b |
---|---|
46 friend class PSScavenge; | 46 friend class PSScavenge; |
47 friend class PSRefProcTaskExecutor; | 47 friend class PSRefProcTaskExecutor; |
48 private: | 48 private: |
49 static PSPromotionManager** _manager_array; | 49 static PSPromotionManager** _manager_array; |
50 static OopStarTaskQueueSet* _stack_array_depth; | 50 static OopStarTaskQueueSet* _stack_array_depth; |
51 static OopTaskQueueSet* _stack_array_breadth; | |
52 static PSOldGen* _old_gen; | 51 static PSOldGen* _old_gen; |
53 static MutableSpace* _young_space; | 52 static MutableSpace* _young_space; |
54 | 53 |
55 #if TASKQUEUE_STATS | 54 #if TASKQUEUE_STATS |
56 size_t _masked_pushes; | 55 size_t _masked_pushes; |
67 | 66 |
68 PSYoungPromotionLAB _young_lab; | 67 PSYoungPromotionLAB _young_lab; |
69 PSOldPromotionLAB _old_lab; | 68 PSOldPromotionLAB _old_lab; |
70 bool _young_gen_is_full; | 69 bool _young_gen_is_full; |
71 bool _old_gen_is_full; | 70 bool _old_gen_is_full; |
72 PrefetchQueue _prefetch_queue; | |
73 | 71 |
74 OopStarTaskQueue _claimed_stack_depth; | 72 OopStarTaskQueue _claimed_stack_depth; |
75 OverflowTaskQueue<oop> _claimed_stack_breadth; | 73 OverflowTaskQueue<oop> _claimed_stack_breadth; |
76 | 74 |
77 bool _depth_first; | |
78 bool _totally_drain; | 75 bool _totally_drain; |
79 uint _target_stack_size; | 76 uint _target_stack_size; |
80 | 77 |
81 uint _array_chunk_size; | 78 uint _array_chunk_size; |
82 uint _min_array_size_for_chunking; | 79 uint _min_array_size_for_chunking; |
85 static PSOldGen* old_gen() { return _old_gen; } | 82 static PSOldGen* old_gen() { return _old_gen; } |
86 static MutableSpace* young_space() { return _young_space; } | 83 static MutableSpace* young_space() { return _young_space; } |
87 | 84 |
88 inline static PSPromotionManager* manager_array(int index); | 85 inline static PSPromotionManager* manager_array(int index); |
89 template <class T> inline void claim_or_forward_internal_depth(T* p); | 86 template <class T> inline void claim_or_forward_internal_depth(T* p); |
90 template <class T> inline void claim_or_forward_internal_breadth(T* p); | |
91 | 87 |
92 // On the task queues we push reference locations as well as | 88 // On the task queues we push reference locations as well as |
93 // partially-scanned arrays (in the latter case, we push an oop to | 89 // partially-scanned arrays (in the latter case, we push an oop to |
94 // the from-space image of the array and the length on the | 90 // the from-space image of the array and the length on the |
95 // from-space image indicates how many entries on the array we still | 91 // from-space image indicates how many entries on the array we still |
134 template <class T> void process_array_chunk_work(oop obj, | 130 template <class T> void process_array_chunk_work(oop obj, |
135 int start, int end); | 131 int start, int end); |
136 void process_array_chunk(oop old); | 132 void process_array_chunk(oop old); |
137 | 133 |
138 template <class T> void push_depth(T* p) { | 134 template <class T> void push_depth(T* p) { |
139 assert(depth_first(), "pre-condition"); | |
140 claimed_stack_depth()->push(p); | 135 claimed_stack_depth()->push(p); |
141 } | |
142 | |
143 void push_breadth(oop o) { | |
144 assert(!depth_first(), "pre-condition"); | |
145 claimed_stack_breadth()->push(o); | |
146 } | 136 } |
147 | 137 |
148 protected: | 138 protected: |
149 static OopStarTaskQueueSet* stack_array_depth() { return _stack_array_depth; } | 139 static OopStarTaskQueueSet* stack_array_depth() { return _stack_array_depth; } |
150 static OopTaskQueueSet* stack_array_breadth() { return _stack_array_breadth; } | |
151 | |
152 public: | 140 public: |
153 // Static | 141 // Static |
154 static void initialize(); | 142 static void initialize(); |
155 | 143 |
156 static void pre_scavenge(); | 144 static void pre_scavenge(); |
161 | 149 |
162 static bool steal_depth(int queue_num, int* seed, StarTask& t) { | 150 static bool steal_depth(int queue_num, int* seed, StarTask& t) { |
163 return stack_array_depth()->steal(queue_num, seed, t); | 151 return stack_array_depth()->steal(queue_num, seed, t); |
164 } | 152 } |
165 | 153 |
166 static bool steal_breadth(int queue_num, int* seed, oop& t) { | |
167 return stack_array_breadth()->steal(queue_num, seed, t); | |
168 } | |
169 | |
170 PSPromotionManager(); | 154 PSPromotionManager(); |
171 | 155 |
172 // Accessors | 156 // Accessors |
173 OopStarTaskQueue* claimed_stack_depth() { | 157 OopStarTaskQueue* claimed_stack_depth() { |
174 return &_claimed_stack_depth; | 158 return &_claimed_stack_depth; |
175 } | |
176 OverflowTaskQueue<oop>* claimed_stack_breadth() { | |
177 return &_claimed_stack_breadth; | |
178 } | 159 } |
179 | 160 |
180 bool young_gen_is_full() { return _young_gen_is_full; } | 161 bool young_gen_is_full() { return _young_gen_is_full; } |
181 | 162 |
182 bool old_gen_is_full() { return _old_gen_is_full; } | 163 bool old_gen_is_full() { return _old_gen_is_full; } |
183 void set_old_gen_is_full(bool state) { _old_gen_is_full = state; } | 164 void set_old_gen_is_full(bool state) { _old_gen_is_full = state; } |
184 | 165 |
185 // Promotion methods | 166 // Promotion methods |
186 oop copy_to_survivor_space(oop o, bool depth_first); | 167 oop copy_to_survivor_space(oop o); |
187 oop oop_promotion_failed(oop obj, markOop obj_mark); | 168 oop oop_promotion_failed(oop obj, markOop obj_mark); |
188 | 169 |
189 void reset(); | 170 void reset(); |
190 | 171 |
191 void flush_labs(); | 172 void flush_labs(); |
192 void drain_stacks(bool totally_drain) { | 173 void drain_stacks(bool totally_drain) { |
193 if (depth_first()) { | 174 drain_stacks_depth(totally_drain); |
194 drain_stacks_depth(totally_drain); | |
195 } else { | |
196 drain_stacks_breadth(totally_drain); | |
197 } | |
198 } | 175 } |
199 public: | 176 public: |
200 void drain_stacks_cond_depth() { | 177 void drain_stacks_cond_depth() { |
201 if (claimed_stack_depth()->size() > _target_stack_size) { | 178 if (claimed_stack_depth()->size() > _target_stack_size) { |
202 drain_stacks_depth(false); | 179 drain_stacks_depth(false); |
203 } | 180 } |
204 } | 181 } |
205 void drain_stacks_depth(bool totally_drain); | 182 void drain_stacks_depth(bool totally_drain); |
206 void drain_stacks_breadth(bool totally_drain); | |
207 | 183 |
208 bool depth_first() const { | |
209 return _depth_first; | |
210 } | |
211 bool stacks_empty() { | 184 bool stacks_empty() { |
212 return depth_first() ? | 185 return claimed_stack_depth()->is_empty(); |
213 claimed_stack_depth()->is_empty() : | |
214 claimed_stack_breadth()->is_empty(); | |
215 } | 186 } |
216 | 187 |
217 inline void process_popped_location_depth(StarTask p); | 188 inline void process_popped_location_depth(StarTask p); |
218 | 189 |
219 inline void flush_prefetch_queue(); | |
220 template <class T> inline void claim_or_forward_depth(T* p); | 190 template <class T> inline void claim_or_forward_depth(T* p); |
221 template <class T> inline void claim_or_forward_breadth(T* p); | |
222 | 191 |
223 TASKQUEUE_STATS_ONLY(inline void record_steal(StarTask& p);) | 192 TASKQUEUE_STATS_ONLY(inline void record_steal(StarTask& p);) |
224 }; | 193 }; |