File indexing completed on 2024-04-21 04:01:28

0001 /* -*- C++ -*-
0002     The Queue class in ThreadWeaver.
0003 
0004     SPDX-FileCopyrightText: 2005-2013 Mirko Boehm <mirko@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 
0009 #ifndef THREADWEAVER_QUEUE_H
0010 #define THREADWEAVER_QUEUE_H
0011 
0012 #include <QObject>
0013 
0014 #include "queuesignals.h"
0015 #include "queuestream.h"
0016 
0017 namespace ThreadWeaver
0018 {
0019 class Job;
0020 class State;
0021 
0022 /** @brief Queue implements a ThreadWeaver job queue.
0023  *
0024  * Queues process jobs enqueued in them by automatically assigning them to worker threads they manage.
0025  * Applications using ThreadWeaver can make use of a global Queue which is instantiated on demand, or
0026  * create multiple queues as needed. A job assigned to a queue will be processed by that specific queue.
0027  *
0028  * Worker threads are created by the queues as needed. To create a customized global queue,
0029  * see GlobalQueueFactory.
0030  *
0031  * @see GlobalQueueFactory
0032  * @see Queue::enqueue()
0033  * @see Queue::instance()
0034  */
0035 class THREADWEAVER_EXPORT Queue : public QueueSignals
0036 {
0037     Q_OBJECT
0038 public:
0039     explicit Queue(QObject *parent = nullptr);
0040     /** @brief Construct a queue with a customized implementation
0041      * The queue takes ownership and will delete the implementation upon destruction. */
0042     explicit Queue(QueueSignals *implementation, QObject *parent = nullptr);
0043     ~Queue() override;
0044 
0045     QueueStream stream();
0046 
0047     const State *state() const override;
0048 
0049     void setMaximumNumberOfThreads(int cap) override;
0050     int maximumNumberOfThreads() const override;
0051     int currentNumberOfThreads() const override;
0052 
0053     static ThreadWeaver::Queue *instance();
0054     void enqueue(const QList<JobPointer> &jobs) override;
0055     void enqueue(const JobPointer &job);
0056     bool dequeue(const JobPointer &) override;
0057     void dequeue() override;
0058     void finish() override;
0059     void suspend() override;
0060     void resume() override;
0061     bool isEmpty() const override;
0062     bool isIdle() const override;
0063     int queueLength() const override;
0064     void requestAbort() override;
0065     void reschedule() override;
0066     void shutDown() override;
0067 
0068     /** @brief Interface for the global queue factory. */
0069     struct GlobalQueueFactory {
0070         virtual ~GlobalQueueFactory()
0071         {
0072         }
0073         virtual Queue *create(QObject *parent) = 0;
0074     };
0075     static void setGlobalQueueFactory(GlobalQueueFactory *factory);
0076 
0077 private:
0078     class Private;
0079     Private *const d;
0080 };
0081 
0082 }
0083 
0084 #endif // THREADWEAVER_QUEUE_H