123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- // workqueue-internal.h -- internal work queue header for gold -*- C++ -*-
- // Copyright (C) 2006-2015 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)
|