|  | // workqueue-internal.h -- internal work queue header for gold   -*- C++ -*- | 
|  |  | 
|  | // Copyright (C) 2006-2023 Free Software Foundation, Inc. | 
|  | // Written by Ian Lance Taylor <iant@google.com>. | 
|  |  | 
|  | // This file is part of gold. | 
|  |  | 
|  | // This program is free software; you can redistribute it and/or modify | 
|  | // it under the terms of the GNU General Public License as published by | 
|  | // the Free Software Foundation; either version 3 of the License, or | 
|  | // (at your option) any later version. | 
|  |  | 
|  | // This program is distributed in the hope that it will be useful, | 
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | // GNU General Public License for more details. | 
|  |  | 
|  | // You should have received a copy of the GNU General Public License | 
|  | // along with this program; if not, write to the Free Software | 
|  | // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, | 
|  | // MA 02110-1301, USA. | 
|  |  | 
|  | #ifndef GOLD_WORKQUEUE_INTERNAL_H | 
|  | #define GOLD_WORKQUEUE_INTERNAL_H | 
|  |  | 
|  | #include <queue> | 
|  | #include <csignal> | 
|  |  | 
|  | #include "gold-threads.h" | 
|  | #include "workqueue.h" | 
|  |  | 
|  | // This is an internal header file for different gold workqueue | 
|  | // implementations. | 
|  |  | 
|  | namespace gold | 
|  | { | 
|  |  | 
|  | class Workqueue_thread; | 
|  |  | 
|  | // The Workqueue_threader abstract class.  This is the interface used | 
|  | // by the general workqueue code to manage threads. | 
|  |  | 
|  | class Workqueue_threader | 
|  | { | 
|  | public: | 
|  | Workqueue_threader(Workqueue* workqueue) | 
|  | : workqueue_(workqueue) | 
|  | { } | 
|  | virtual ~Workqueue_threader() | 
|  | { } | 
|  |  | 
|  | // Set the number of threads to use.  This is ignored when not using | 
|  | // threads. | 
|  | virtual void | 
|  | set_thread_count(int) = 0; | 
|  |  | 
|  | // Return whether to cancel the current thread. | 
|  | virtual bool | 
|  | should_cancel_thread(int thread_number) = 0; | 
|  |  | 
|  | protected: | 
|  | // Get the Workqueue. | 
|  | Workqueue* | 
|  | get_workqueue() | 
|  | { return this->workqueue_; } | 
|  |  | 
|  | private: | 
|  | // The Workqueue. | 
|  | Workqueue* workqueue_; | 
|  | }; | 
|  |  | 
|  | // The threaded instantiation of Workqueue_threader. | 
|  |  | 
|  | class Workqueue_threader_threadpool : public Workqueue_threader | 
|  | { | 
|  | public: | 
|  | Workqueue_threader_threadpool(Workqueue*); | 
|  |  | 
|  | ~Workqueue_threader_threadpool(); | 
|  |  | 
|  | // Set the thread count. | 
|  | void | 
|  | set_thread_count(int); | 
|  |  | 
|  | // Return whether to cancel a thread. | 
|  | bool | 
|  | should_cancel_thread(int thread_number); | 
|  |  | 
|  | // Process all tasks.  This keeps running until told to cancel. | 
|  | void | 
|  | process(int thread_number) | 
|  | { this->get_workqueue()->process(thread_number); } | 
|  |  | 
|  | private: | 
|  | // This is set if we need to check the thread count. | 
|  | volatile sig_atomic_t check_thread_count_; | 
|  |  | 
|  | // Lock for the remaining members. | 
|  | Lock lock_; | 
|  | // 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. | 
|  |  | 
|  | #endif // !defined(GOLD_WORKQUEUE_INTERNAL_H) |