X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gold%2Fworkqueue-internal.h;h=db9b1aa38a333c505debb80375fa32c95189fef0;hb=c6ac893109fdc2c3fce2b7457adccdc10f235354;hp=d9fd1608502a2628c94b20e0d7898d84c04f9337;hpb=c79126688f8211ab17a893c5e80b09811d424fc1;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/workqueue-internal.h b/gold/workqueue-internal.h index d9fd160850..db9b1aa38a 100644 --- a/gold/workqueue-internal.h +++ b/gold/workqueue-internal.h @@ -1,6 +1,6 @@ // workqueue-internal.h -- internal work queue header for gold -*- C++ -*- -// Copyright 2006, 2007 Free Software Foundation, Inc. +// Copyright (C) 2006-2019 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -24,6 +24,7 @@ #define GOLD_WORKQUEUE_INTERNAL_H #include +#include #include "gold-threads.h" #include "workqueue.h" @@ -36,92 +37,71 @@ namespace gold class Workqueue_thread; -// The Workqueue_runner abstract class. This is the interface used by -// the general workqueue code to actually run a task. +// The Workqueue_threader abstract class. This is the interface used +// by the general workqueue code to manage threads. -class Workqueue_runner +class Workqueue_threader { public: - Workqueue_runner(Workqueue* workqueue) + Workqueue_threader(Workqueue* workqueue) : workqueue_(workqueue) { } - virtual ~Workqueue_runner() + virtual ~Workqueue_threader() { } - // Run a task. This is always called in the main thread. - virtual void - run(Task*, Task_locker*) = 0; - // Set the number of threads to use. This is ignored when not using // threads. virtual void set_thread_count(int) = 0; - protected: - // This is called by an implementation when a task is completed. - void completed(Task* t, Task_locker* tl) - { this->workqueue_->completed(t, tl); } + // Return whether to cancel the current thread. + virtual bool + should_cancel_thread(int thread_number) = 0; - Workqueue* get_workqueue() const + protected: + // Get the Workqueue. + Workqueue* + get_workqueue() { return this->workqueue_; } private: + // The Workqueue. Workqueue* workqueue_; }; -// The threaded instantiation of Workqueue_runner. +// The threaded instantiation of Workqueue_threader. -class Workqueue_runner_threadpool : public Workqueue_runner +class Workqueue_threader_threadpool : public Workqueue_threader { public: - Workqueue_runner_threadpool(Workqueue* workqueue); + Workqueue_threader_threadpool(Workqueue*); - ~Workqueue_runner_threadpool(); - - void - run(Task*, Task_locker*); + ~Workqueue_threader_threadpool(); + // Set the thread count. void set_thread_count(int); - private: - // This class can not be copied. - Workqueue_runner_threadpool(const Workqueue_runner_threadpool&); - Workqueue_runner_threadpool& operator=(const Workqueue_runner_threadpool&); - - // Return the next Task and Task_locker to run. This returns false - // if the calling thread should simply exit. + // Return whether to cancel a thread. bool - get_next(Task**, Task_locker**); + should_cancel_thread(int thread_number); - // This is called when the thread completes a task. + // Process all tasks. This keeps running until told to cancel. void - thread_completed(Task*, Task_locker*); - - // The Workqueue_thread class calls functions from this and from the - // parent Workqueue_runner. - friend class Workqueue_thread; - - // An entry on the queue of tasks to run. - typedef std::pair Task_queue_entry; + process(int thread_number) + { this->get_workqueue()->process(thread_number); } - // A queue of tasks to run. - typedef std::queue Task_queue; + private: + // This is set if we need to check the thread count. + volatile sig_atomic_t check_thread_count_; - // The number of threads we want to create. This is only changed in - // the main thread or when only one thread is running. This is set - // to zero when all threads should exit. - int desired_thread_count_; - // A lock controlling access to the remaining fields. + // Lock for the remaining members. Lock lock_; - // The number of threads we have created. - int actual_thread_count_; - // The number of threads which are running a task. - int running_thread_count_; - // A queue of tasks to run. - Task_queue task_queue_; - // A condition variable which signals when the task_queue_ changed. - Condvar task_queue_condvar_; + // The number of threads we want to create. This is set to zero + // when all threads should exit. + int desired_thread_count_; + // The number of threads currently running. + int threads_; }; } // End namespace gold.