1 | /* -*- C++ -*- |
2 | The Queue class in ThreadWeaver. |
3 | |
4 | SPDX-FileCopyrightText: 2005-2013 Mirko Boehm <mirko@kde.org> |
5 | |
6 | SPDX-License-Identifier: LGPL-2.0-or-later |
7 | */ |
8 | |
9 | #ifndef THREADWEAVER_QUEUE_H |
10 | #define THREADWEAVER_QUEUE_H |
11 | |
12 | #include <QObject> |
13 | |
14 | #include "queuesignals.h" |
15 | #include "queuestream.h" |
16 | |
17 | namespace ThreadWeaver |
18 | { |
19 | class Job; |
20 | class State; |
21 | |
22 | /*! |
23 | * \class ThreadWeaver::Queue |
24 | * \inheaderfile ThreadWeaver/Queue |
25 | * \inmodule ThreadWeaver |
26 | * |
27 | * \brief Queue implements a ThreadWeaver job queue. |
28 | * |
29 | * Queues process jobs enqueued in them by automatically assigning them to worker threads they manage. |
30 | * Applications using ThreadWeaver can make use of a global Queue which is instantiated on demand, or |
31 | * create multiple queues as needed. A job assigned to a queue will be processed by that specific queue. |
32 | * |
33 | * Worker threads are created by the queues as needed. To create a customized global queue, |
34 | * see GlobalQueueFactory. |
35 | * |
36 | * \sa GlobalQueueFactory |
37 | * \sa Queue::enqueue() |
38 | * \sa Queue::instance() |
39 | */ |
40 | class THREADWEAVER_EXPORT Queue : public QueueSignals |
41 | { |
42 | Q_OBJECT |
43 | public: |
44 | /*! |
45 | */ |
46 | explicit Queue(QObject *parent = nullptr); |
47 | /*! \brief Construct a queue with a customized implementation. |
48 | * The queue takes ownership and will delete the implementation upon destruction. */ |
49 | explicit Queue(QueueSignals *implementation, QObject *parent = nullptr); |
50 | ~Queue() override; |
51 | |
52 | /*! |
53 | */ |
54 | QueueStream stream(); |
55 | |
56 | const State *state() const override; |
57 | |
58 | void setMaximumNumberOfThreads(int cap) override; |
59 | int maximumNumberOfThreads() const override; |
60 | int currentNumberOfThreads() const override; |
61 | |
62 | /*! |
63 | */ |
64 | static ThreadWeaver::Queue *instance(); |
65 | void enqueue(const QList<JobPointer> &jobs) override; |
66 | /*! |
67 | */ |
68 | void enqueue(const JobPointer &job); |
69 | bool dequeue(const JobPointer &) override; |
70 | void dequeue() override; |
71 | void finish() override; |
72 | void suspend() override; |
73 | void resume() override; |
74 | bool isEmpty() const override; |
75 | bool isIdle() const override; |
76 | int queueLength() const override; |
77 | void requestAbort() override; |
78 | void reschedule() override; |
79 | void shutDown() override; |
80 | |
81 | /*! |
82 | * \inmodule ThreadWeaver |
83 | * \brief Interface for the global queue factory. |
84 | */ |
85 | struct GlobalQueueFactory { |
86 | virtual ~GlobalQueueFactory() |
87 | { |
88 | } |
89 | virtual Queue *create(QObject *parent) = 0; |
90 | }; |
91 | /*! |
92 | */ |
93 | static void setGlobalQueueFactory(GlobalQueueFactory *factory); |
94 | |
95 | private: |
96 | class Private; |
97 | Private *const d; |
98 | }; |
99 | |
100 | } |
101 | |
102 | #endif // THREADWEAVER_QUEUE_H |
103 | |