From dcd8d12e1c020d87f7d3920438cf7327eb886008 Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Thu, 28 Jul 2011 23:25:06 +0000 Subject: [PATCH] * workqueue-internal.h (Workqueue_threader::should_cancel_thread): Add thread_number parameter. (Workqueue_threader_threadpool::should_cancel_thread): Likewise. * workqueue-threads.cc (Workqueue_threader_threadpool::should_cancel_thread): Cancel current thread if its thread number is greater than desired thread count. * workqueue.cc (Workqueue_threader_single::should_cancel_thread): Add thread_number parameter. (Workqueue::should_cancel_thread): Likewise. (Workqueue::find_runnable_or_wait): Pass thread_number to should_cancel_thread. * workqueue.h (Workqueue::should_cancel_thread): Add thread_number parameter. --- gold/ChangeLog | 17 +++++++++++++++++ gold/workqueue-internal.h | 4 ++-- gold/workqueue-threads.cc | 7 ++++--- gold/workqueue.cc | 8 ++++---- gold/workqueue.h | 2 +- 5 files changed, 28 insertions(+), 10 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index c894c710b7b..08fd41f93e8 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,20 @@ +2011-07-28 Cary Coutant + + * workqueue-internal.h (Workqueue_threader::should_cancel_thread): + Add thread_number parameter. + (Workqueue_threader_threadpool::should_cancel_thread): Likewise. + * workqueue-threads.cc + (Workqueue_threader_threadpool::should_cancel_thread): Cancel + current thread if its thread number is greater than desired thread + count. + * workqueue.cc (Workqueue_threader_single::should_cancel_thread): + Add thread_number parameter. + (Workqueue::should_cancel_thread): Likewise. + (Workqueue::find_runnable_or_wait): Pass thread_number to + should_cancel_thread. + * workqueue.h (Workqueue::should_cancel_thread): Add thread_number + parameter. + 2011-07-22 Sriraman Tallam * symtab.cc (Symbol_table::add_from_relobj): Mark symbol as referenced diff --git a/gold/workqueue-internal.h b/gold/workqueue-internal.h index 684c65ba071..764dc91b3d3 100644 --- a/gold/workqueue-internal.h +++ b/gold/workqueue-internal.h @@ -56,7 +56,7 @@ class Workqueue_threader // Return whether to cancel the current thread. virtual bool - should_cancel_thread() = 0; + should_cancel_thread(int thread_number) = 0; protected: // Get the Workqueue. @@ -84,7 +84,7 @@ class Workqueue_threader_threadpool : public Workqueue_threader // Return whether to cancel a thread. bool - should_cancel_thread(); + should_cancel_thread(int thread_number); // Process all tasks. This keeps running until told to cancel. void diff --git a/gold/workqueue-threads.cc b/gold/workqueue-threads.cc index 60d4adcbb3a..de2ce5bef50 100644 --- a/gold/workqueue-threads.cc +++ b/gold/workqueue-threads.cc @@ -174,7 +174,7 @@ Workqueue_threader_threadpool::set_thread_count(int thread_count) // Return whether the current thread should be cancelled. bool -Workqueue_threader_threadpool::should_cancel_thread() +Workqueue_threader_threadpool::should_cancel_thread(int thread_number) { // Fast exit without taking a lock. if (!this->check_thread_count_) @@ -182,12 +182,13 @@ Workqueue_threader_threadpool::should_cancel_thread() { Hold_lock hl(this->lock_); - if (this->threads_ > this->desired_thread_count_) + if (thread_number > this->desired_thread_count_) { --this->threads_; + if (this->threads_ <= this->desired_thread_count_) + this->check_thread_count_ = 0; return true; } - this->check_thread_count_ = 0; } return false; diff --git a/gold/workqueue.cc b/gold/workqueue.cc index 6449bbad846..e78e86b9ecc 100644 --- a/gold/workqueue.cc +++ b/gold/workqueue.cc @@ -110,7 +110,7 @@ class Workqueue_threader_single : public Workqueue_threader { gold_assert(thread_count > 0); } bool - should_cancel_thread() + should_cancel_thread(int) { return false; } }; @@ -202,9 +202,9 @@ Workqueue::queue_next(Task* t) // Return whether to cancel the current thread. inline bool -Workqueue::should_cancel_thread() +Workqueue::should_cancel_thread(int thread_number) { - return this->threader_->should_cancel_thread(); + return this->threader_->should_cancel_thread(thread_number); } // Find a runnable task in TASKS. Return NULL if none could be found. @@ -264,7 +264,7 @@ Workqueue::find_runnable_or_wait(int thread_number) return NULL; } - if (this->should_cancel_thread()) + if (this->should_cancel_thread(thread_number)) return NULL; gold_debug(DEBUG_TASK, "%3d sleeping", thread_number); diff --git a/gold/workqueue.h b/gold/workqueue.h index 9121e10e14f..424b5e78ca7 100644 --- a/gold/workqueue.h +++ b/gold/workqueue.h @@ -268,7 +268,7 @@ class Workqueue // Return whether to cancel this thread. bool - should_cancel_thread(); + should_cancel_thread(int thread_number); // Master Workqueue lock. This controls access to the following // member variables. -- 2.30.2