ThreadWeaver

weaver.h
1/* -*- C++ -*-
2 This file implements the public interfaces of the WeaverImpl class.
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 WeaverImpl_H
10#define WeaverImpl_H
11
12#include "queueapi.h"
13#include <QObject>
14
15namespace ThreadWeaver
16{
17class State;
18class Job;
19class Thread;
20class WeaverImplState;
21class SuspendingState;
22
23namespace Private
24{
25class Weaver_Private;
26}
27
28/** @brief A Weaver manages worker threads.
29 *
30 * It creates an inventory of Thread objects to which it assigns jobs from its queue.
31 * It extends the API of Queue, hiding methods that need to be public to implement state handling, but
32 * should not be exposed in general.
33 */
34class THREADWEAVER_EXPORT Weaver : public QueueAPI
35{
36 Q_OBJECT
37public:
38 explicit Weaver(QObject *parent = nullptr);
39 ~Weaver() override;
40 void shutDown() override;
41 void shutDown_p() override;
42
43 const State *state() const override;
44 State *state() override;
45
46 void setMaximumNumberOfThreads(int cap) override;
47 int maximumNumberOfThreads() const override;
48 int currentNumberOfThreads() const override;
49
50 void setState(StateId);
51 void enqueue(const QList<JobPointer> &jobs) override;
52 bool dequeue(const JobPointer &job) override;
53 void dequeue() override;
54 void finish() override;
55 void suspend() override;
56 void resume() override;
57 bool isEmpty() const override;
58 bool isIdle() const override;
59 int queueLength() const override;
60 JobPointer applyForWork(Thread *thread, bool wasBusy) override;
61 void waitForAvailableJob(Thread *th) override;
62 void blockThreadUntilJobsAreBeingAssigned(Thread *th);
63 void blockThreadUntilJobsAreBeingAssigned_locked(Thread *th);
64 void incActiveThreadCount();
65 void decActiveThreadCount();
66 int activeThreadCount();
67
68 void threadEnteredRun(Thread *thread);
69 JobPointer takeFirstAvailableJobOrSuspendOrWait(Thread *th, bool threadWasBusy, bool suspendIfAllThreadsInactive, bool justReturning);
70 void requestAbort() override;
71 void reschedule() override;
72
73 // FIXME: rename _p to _locked:
74 friend class WeaverImplState;
75 friend class SuspendingState;
76 void setState_p(StateId);
77 void setMaximumNumberOfThreads_p(int cap) override;
78 int maximumNumberOfThreads_p() const override;
79 int currentNumberOfThreads_p() const override;
80 void enqueue_p(const QList<JobPointer> &jobs);
81 bool dequeue_p(JobPointer job) override;
82 void dequeue_p() override;
83 void finish_p() override;
84 void suspend_p() override;
85 void resume_p() override;
86 bool isEmpty_p() const override;
87 bool isIdle_p() const override;
88 int queueLength_p() const override;
89 void requestAbort_p() override;
90
91Q_SIGNALS:
92 /** @brief A Thread has been created. */
94 /** @brief A thread has exited. */
96 /** @brief A thread has been suspended. */
98
99protected:
100 void adjustActiveThreadCount(int diff);
101 virtual Thread *createThread();
102 void adjustInventory(int noOfNewJobs);
103
104private:
105 ThreadWeaver::Private::Weaver_Private *d();
106 const ThreadWeaver::Private::Weaver_Private *d() const;
107};
108
109} // namespace ThreadWeaver
110
111#endif // WeaverImpl_H
void requestAbort() override
Abort the execution of the job.
Definition job.cpp:118
Lambda is a template that takes any type on which operator() is available, and executes it in run().
Definition lambda.h:20
We use a State pattern to handle the system state in ThreadWeaver.
Definition state.h:56
SuspendingState is the state after suspend() has been called, but before all threads finished executi...
Thread represents a worker thread in a Queue's inventory.
Definition thread.h:28
Base class for all WeaverImpl states.
A Weaver manages worker threads.
Definition weaver.h:35
void threadSuspended(ThreadWeaver::Thread *)
A thread has been suspended.
void threadExited(ThreadWeaver::Thread *)
A thread has exited.
void threadStarted(ThreadWeaver::Thread *)
A Thread has been created.
void suspend()
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:14:31 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.