73 int thread_num_, |
73 int thread_num_, |
74 ObjToScanQueueSet* work_queue_set_, |
74 ObjToScanQueueSet* work_queue_set_, |
75 Stack<oop, mtGC>* overflow_stacks_, |
75 Stack<oop, mtGC>* overflow_stacks_, |
76 PreservedMarks* preserved_marks_, |
76 PreservedMarks* preserved_marks_, |
77 size_t desired_plab_sz_, |
77 size_t desired_plab_sz_, |
78 ParallelTaskTerminator& term_) : |
78 TaskTerminator& term_) : |
79 _work_queue(work_queue_set_->queue(thread_num_)), |
79 _work_queue(work_queue_set_->queue(thread_num_)), |
80 _overflow_stack(overflow_stacks_ ? overflow_stacks_ + thread_num_ : NULL), |
80 _overflow_stack(overflow_stacks_ ? overflow_stacks_ + thread_num_ : NULL), |
81 _preserved_marks(preserved_marks_), |
81 _preserved_marks(preserved_marks_), |
82 _to_space_alloc_buffer(desired_plab_sz_), |
82 _to_space_alloc_buffer(desired_plab_sz_), |
83 _to_space_closure(young_gen_, this), |
83 _to_space_closure(young_gen_, this), |
85 _to_space_root_closure(young_gen_, this), |
85 _to_space_root_closure(young_gen_, this), |
86 _older_gen_closure(young_gen_, this), |
86 _older_gen_closure(young_gen_, this), |
87 _old_gen_root_closure(young_gen_, this), |
87 _old_gen_root_closure(young_gen_, this), |
88 _evacuate_followers(this, &_to_space_closure, &_old_gen_closure, |
88 _evacuate_followers(this, &_to_space_closure, &_old_gen_closure, |
89 &_to_space_root_closure, young_gen_, &_old_gen_root_closure, |
89 &_to_space_root_closure, young_gen_, &_old_gen_root_closure, |
90 work_queue_set_, &term_), |
90 work_queue_set_, term_.terminator()), |
91 _is_alive_closure(young_gen_), |
91 _is_alive_closure(young_gen_), |
92 _scan_weak_ref_closure(young_gen_, this), |
92 _scan_weak_ref_closure(young_gen_, this), |
93 _keep_alive_closure(&_scan_weak_ref_closure), |
93 _keep_alive_closure(&_scan_weak_ref_closure), |
94 _to_space(to_space_), |
94 _to_space(to_space_), |
95 _young_gen(young_gen_), |
95 _young_gen(young_gen_), |
304 Generation& old_gen, |
304 Generation& old_gen, |
305 ObjToScanQueueSet& queue_set, |
305 ObjToScanQueueSet& queue_set, |
306 Stack<oop, mtGC>* overflow_stacks_, |
306 Stack<oop, mtGC>* overflow_stacks_, |
307 PreservedMarksSet& preserved_marks_set, |
307 PreservedMarksSet& preserved_marks_set, |
308 size_t desired_plab_sz, |
308 size_t desired_plab_sz, |
309 ParallelTaskTerminator& term); |
309 TaskTerminator& term); |
310 |
310 |
311 ~ParScanThreadStateSet() { TASKQUEUE_STATS_ONLY(reset_stats()); } |
311 ~ParScanThreadStateSet() { TASKQUEUE_STATS_ONLY(reset_stats()); } |
312 |
312 |
313 inline ParScanThreadState& thread_state(int i); |
313 inline ParScanThreadState& thread_state(int i); |
314 |
314 |
325 void print_taskqueue_stats(); |
325 void print_taskqueue_stats(); |
326 void reset_stats(); |
326 void reset_stats(); |
327 #endif // TASKQUEUE_STATS |
327 #endif // TASKQUEUE_STATS |
328 |
328 |
329 private: |
329 private: |
330 ParallelTaskTerminator& _term; |
330 TaskTerminator& _term; |
331 ParNewGeneration& _young_gen; |
331 ParNewGeneration& _young_gen; |
332 Generation& _old_gen; |
332 Generation& _old_gen; |
333 ParScanThreadState* _per_thread_states; |
333 ParScanThreadState* _per_thread_states; |
334 const int _num_threads; |
334 const int _num_threads; |
335 public: |
335 public: |
336 bool is_valid(int id) const { return id < _num_threads; } |
336 bool is_valid(int id) const { return id < _num_threads; } |
337 ParallelTaskTerminator* terminator() { return &_term; } |
337 ParallelTaskTerminator* terminator() { return _term.terminator(); } |
338 }; |
338 }; |
339 |
339 |
340 ParScanThreadStateSet::ParScanThreadStateSet(int num_threads, |
340 ParScanThreadStateSet::ParScanThreadStateSet(int num_threads, |
341 Space& to_space, |
341 Space& to_space, |
342 ParNewGeneration& young_gen, |
342 ParNewGeneration& young_gen, |
343 Generation& old_gen, |
343 Generation& old_gen, |
344 ObjToScanQueueSet& queue_set, |
344 ObjToScanQueueSet& queue_set, |
345 Stack<oop, mtGC>* overflow_stacks, |
345 Stack<oop, mtGC>* overflow_stacks, |
346 PreservedMarksSet& preserved_marks_set, |
346 PreservedMarksSet& preserved_marks_set, |
347 size_t desired_plab_sz, |
347 size_t desired_plab_sz, |
348 ParallelTaskTerminator& term) |
348 TaskTerminator& term) |
349 : _term(term), |
349 : _term(term), |
350 _young_gen(young_gen), |
350 _young_gen(young_gen), |
351 _old_gen(old_gen), |
351 _old_gen(old_gen), |
352 _per_thread_states(NEW_RESOURCE_ARRAY(ParScanThreadState, num_threads)), |
352 _per_thread_states(NEW_RESOURCE_ARRAY(ParScanThreadState, num_threads)), |
353 _num_threads(num_threads) |
353 _num_threads(num_threads) |
377 } |
377 } |
378 } |
378 } |
379 } |
379 } |
380 |
380 |
381 void ParScanThreadStateSet::reset(uint active_threads, bool promotion_failed) { |
381 void ParScanThreadStateSet::reset(uint active_threads, bool promotion_failed) { |
382 _term.reset_for_reuse(active_threads); |
382 _term.terminator()->reset_for_reuse(active_threads); |
383 if (promotion_failed) { |
383 if (promotion_failed) { |
384 for (int i = 0; i < _num_threads; ++i) { |
384 for (int i = 0; i < _num_threads; ++i) { |
385 thread_state(i).print_promotion_failure_size(); |
385 thread_state(i).print_promotion_failure_size(); |
386 } |
386 } |
387 } |
387 } |
902 // Need to initialize the preserved marks before the ThreadStateSet c'tor. |
902 // Need to initialize the preserved marks before the ThreadStateSet c'tor. |
903 _preserved_marks_set.init(active_workers); |
903 _preserved_marks_set.init(active_workers); |
904 |
904 |
905 // Always set the terminator for the active number of workers |
905 // Always set the terminator for the active number of workers |
906 // because only those workers go through the termination protocol. |
906 // because only those workers go through the termination protocol. |
907 ParallelTaskTerminator _term(active_workers, task_queues()); |
907 TaskTerminator _term(active_workers, task_queues()); |
908 ParScanThreadStateSet thread_state_set(active_workers, |
908 ParScanThreadStateSet thread_state_set(active_workers, |
909 *to(), *this, *_old_gen, *task_queues(), |
909 *to(), *this, *_old_gen, *task_queues(), |
910 _overflow_stacks, _preserved_marks_set, |
910 _overflow_stacks, _preserved_marks_set, |
911 desired_plab_sz(), _term); |
911 desired_plab_sz(), _term); |
912 |
912 |