* 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.
This commit is contained in:
Cary Coutant 2011-07-28 23:25:06 +00:00
parent a27e437177
commit dcd8d12e1c
5 changed files with 28 additions and 10 deletions

View File

@ -1,3 +1,20 @@
2011-07-28 Cary Coutant <ccoutant@google.com>
* 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 <tmsriram@google.com>
* symtab.cc (Symbol_table::add_from_relobj): Mark symbol as referenced

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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.