X-Git-Url: https://oss.titaniummirror.com/gitweb?p=msp430-binutils.git;a=blobdiff_plain;f=gold%2Fworkqueue-internal.h;fp=gold%2Fworkqueue-internal.h;h=684c65ba071c2866bb69c9cf213b550aaf8bc0d1;hp=0000000000000000000000000000000000000000;hb=d5da4f291af551c0b8b79e1d4a9b173d60e5c10e;hpb=7b5ea4fcdf2819e070665ab5610f8b48e3867c10 diff --git a/gold/workqueue-internal.h b/gold/workqueue-internal.h new file mode 100644 index 0000000..684c65b --- /dev/null +++ b/gold/workqueue-internal.h @@ -0,0 +1,109 @@ +// workqueue-internal.h -- internal work queue header for gold -*- C++ -*- + +// Copyright 2006, 2007, 2008 Free Software Foundation, Inc. +// Written by Ian Lance Taylor . + +// 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 +#include + +#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() = 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(); + + // 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)