# HG changeset patch # User stefank # Date 1432546894 -7200 # Node ID 7a3899d7cea061dfb56b3885c7e91d5f4e943e61 # Parent efe35e08179f19df12df84b286f80ddefe54bb96 8080879: Remove FlexibleWorkGang::set_for_termination Reviewed-by: brutisso, kbarrett, pliden diff -r efe35e08179f -r 7a3899d7cea0 hotspot/src/share/vm/gc/cms/concurrentMarkSweepGeneration.cpp --- a/hotspot/src/share/vm/gc/cms/concurrentMarkSweepGeneration.cpp Mon May 25 11:39:43 2015 +0200 +++ b/hotspot/src/share/vm/gc/cms/concurrentMarkSweepGeneration.cpp Mon May 25 11:41:34 2015 +0200 @@ -5258,18 +5258,14 @@ CMSBitMap* mark_bit_map, AbstractWorkGang* workers, OopTaskQueueSet* task_queues): - // XXX Should superclass AGTWOQ also know about AWG since it knows - // about the task_queues used by the AWG? Then it could initialize - // the terminator() object. See 6984287. The set_for_termination() - // below is a temporary band-aid for the regression in 6984287. AbstractGangTaskWOopQueues("Process referents by policy in parallel", - task_queues), + task_queues, + workers->active_workers()), _task(task), _collector(collector), _span(span), _mark_bit_map(mark_bit_map) { assert(_collector->_span.equals(_span) && !_span.is_empty(), "Inconsistency in _span"); - set_for_termination(workers->active_workers()); } OopTaskQueueSet* task_queues() { return queues(); } diff -r efe35e08179f -r 7a3899d7cea0 hotspot/src/share/vm/gc/cms/parNewGeneration.cpp --- a/hotspot/src/share/vm/gc/cms/parNewGeneration.cpp Mon May 25 11:39:43 2015 +0200 +++ b/hotspot/src/share/vm/gc/cms/parNewGeneration.cpp Mon May 25 11:41:34 2015 +0200 @@ -576,12 +576,6 @@ _strong_roots_scope(strong_roots_scope) {} -// Reset the terminator for the given number of -// active threads. -void ParNewGenTask::set_for_termination(uint active_workers) { - _state_set->reset(active_workers, _gen->promotion_failed()); -} - void ParNewGenTask::work(uint worker_id) { GenCollectedHeap* gch = GenCollectedHeap::heap(); // Since this is being done in a separate thread, need new resource @@ -757,9 +751,6 @@ private: virtual void work(uint worker_id); - virtual void set_for_termination(uint active_workers) { - _state_set.terminator()->reset_for_reuse(active_workers); - } private: ParNewGeneration& _gen; ProcessTask& _task; @@ -949,6 +940,8 @@ *to(), *this, *_old_gen, *task_queues(), _overflow_stacks, desired_plab_sz(), _term); + thread_state_set.reset(n_workers, promotion_failed()); + { StrongRootsScope srs(n_workers); diff -r efe35e08179f -r 7a3899d7cea0 hotspot/src/share/vm/gc/cms/parNewGeneration.hpp --- a/hotspot/src/share/vm/gc/cms/parNewGeneration.hpp Mon May 25 11:39:43 2015 +0200 +++ b/hotspot/src/share/vm/gc/cms/parNewGeneration.hpp Mon May 25 11:41:34 2015 +0200 @@ -250,10 +250,6 @@ HeapWord* young_old_boundary() { return _young_old_boundary; } void work(uint worker_id); - - // Reset the terminator in ParScanThreadStateSet for - // "active_workers" threads. - virtual void set_for_termination(uint active_workers); }; class KeepAliveClosure: public DefNewGeneration::KeepAliveClosure { diff -r efe35e08179f -r 7a3899d7cea0 hotspot/src/share/vm/gc/cms/yieldingWorkgroup.hpp --- a/hotspot/src/share/vm/gc/cms/yieldingWorkgroup.hpp Mon May 25 11:39:43 2015 +0200 +++ b/hotspot/src/share/vm/gc/cms/yieldingWorkgroup.hpp Mon May 25 11:41:34 2015 +0200 @@ -147,6 +147,13 @@ bool completed() const { return _status == COMPLETED; } bool aborted() const { return _status == ABORTED; } bool active() const { return _status == ACTIVE; } + + // This method configures the task for proper termination. + // Some tasks do not have any requirements on termination + // and may inherit this method that does nothing. Some + // tasks do some coordination on termination and override + // this method to implement that coordination. + virtual void set_for_termination(uint active_workers) {} }; // Class YieldingWorkGang: A subclass of WorkGang. // In particular, a YieldingWorkGang is made up of diff -r efe35e08179f -r 7a3899d7cea0 hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp --- a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Mon May 25 11:39:43 2015 +0200 +++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Mon May 25 11:41:34 2015 +0200 @@ -4279,12 +4279,13 @@ Mutex* stats_lock() { return &_stats_lock; } public: - G1ParTask(G1CollectedHeap* g1h, RefToScanQueueSet *task_queues, G1RootProcessor* root_processor) + G1ParTask(G1CollectedHeap* g1h, RefToScanQueueSet *task_queues, G1RootProcessor* root_processor, uint n_workers) : AbstractGangTask("G1 collection"), _g1h(g1h), _queues(task_queues), _root_processor(root_processor), - _terminator(0, _queues), + _terminator(n_workers, _queues), + _n_workers(n_workers), _stats_lock(Mutex::leaf, "parallel G1 stats lock", true) {} @@ -4296,11 +4297,6 @@ ParallelTaskTerminator* terminator() { return &_terminator; } - virtual void set_for_termination(uint active_workers) { - terminator()->reset_for_reuse(active_workers); - _n_workers = active_workers; - } - // Helps out with CLD processing. // // During InitialMark we need to: @@ -5343,7 +5339,7 @@ { G1RootProcessor root_processor(this, n_workers); - G1ParTask g1_par_task(this, _task_queues, &root_processor); + G1ParTask g1_par_task(this, _task_queues, &root_processor, n_workers); // InitialMark needs claim bits to keep track of the marked-through CLDs. if (g1_policy()->during_initial_mark_pause()) { ClassLoaderDataGraph::clear_claimed_marks(); diff -r efe35e08179f -r 7a3899d7cea0 hotspot/src/share/vm/gc/shared/workgroup.cpp --- a/hotspot/src/share/vm/gc/shared/workgroup.cpp Mon May 25 11:39:43 2015 +0200 +++ b/hotspot/src/share/vm/gc/shared/workgroup.cpp Mon May 25 11:41:34 2015 +0200 @@ -133,8 +133,6 @@ } void WorkGang::run_task(AbstractGangTask* task, uint no_of_parallel_workers) { - task->set_for_termination(no_of_parallel_workers); - // This thread is executed by the VM thread which does not block // on ordinary MutexLocker's. MutexLockerEx ml(monitor(), Mutex::_no_safepoint_check_flag); diff -r efe35e08179f -r 7a3899d7cea0 hotspot/src/share/vm/gc/shared/workgroup.hpp --- a/hotspot/src/share/vm/gc/shared/workgroup.hpp Mon May 25 11:39:43 2015 +0200 +++ b/hotspot/src/share/vm/gc/shared/workgroup.hpp Mon May 25 11:41:34 2015 +0200 @@ -59,13 +59,6 @@ // The argument tells you which member of the gang you are. virtual void work(uint worker_id) = 0; - // This method configures the task for proper termination. - // Some tasks do not have any requirements on termination - // and may inherit this method that does nothing. Some - // tasks do some coordination on termination and override - // this method to implement that coordination. - virtual void set_for_termination(uint active_workers) {}; - // Debugging accessor for the name. const char* name() const PRODUCT_RETURN_(return NULL;); int counter() { return _counter; } @@ -99,12 +92,9 @@ OopTaskQueueSet* _queues; ParallelTaskTerminator _terminator; public: - AbstractGangTaskWOopQueues(const char* name, OopTaskQueueSet* queues) : - AbstractGangTask(name), _queues(queues), _terminator(0, _queues) {} + AbstractGangTaskWOopQueues(const char* name, OopTaskQueueSet* queues, uint n_threads) : + AbstractGangTask(name), _queues(queues), _terminator(n_threads, _queues) {} ParallelTaskTerminator* terminator() { return &_terminator; } - virtual void set_for_termination(uint active_workers) { - terminator()->reset_for_reuse(active_workers); - } OopTaskQueueSet* queues() { return _queues; } };