File indexing completed on 2024-04-28 15:29:44
0001 /* 0002 SPDX-FileCopyrightText: 2007, 2009 Ryan P. Bitanga <ryan.bitanga@gmail.com> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #ifndef PLASMA_RUNNERJOBS_P_H 0008 #define PLASMA_RUNNERJOBS_P_H 0009 0010 #include <QHash> 0011 #include <QMutex> 0012 #include <QSet> 0013 0014 #include <ThreadWeaver/Job> 0015 #include <ThreadWeaver/Queue> 0016 #include <ThreadWeaver/QueuePolicy> 0017 0018 #include "abstractrunner.h" 0019 0020 using ThreadWeaver::Job; 0021 0022 class QTimer; 0023 0024 namespace Plasma 0025 { 0026 #if KRUNNER_BUILD_DEPRECATED_SINCE(5, 81) 0027 // Queue policies 0028 0029 // QueuePolicy that only allows a job to be executed after 0030 // waiting in the queue for the specified timeout 0031 class DelayedRunnerPolicy : public ThreadWeaver::QueuePolicy 0032 { 0033 public: 0034 ~DelayedRunnerPolicy() override; 0035 0036 static DelayedRunnerPolicy &instance(); 0037 0038 bool canRun(ThreadWeaver::JobPointer job) override; 0039 void free(ThreadWeaver::JobPointer job) override; 0040 void release(ThreadWeaver::JobPointer job) override; 0041 void destructed(ThreadWeaver::JobInterface *job) override; 0042 0043 private: 0044 DelayedRunnerPolicy(); 0045 QMutex m_mutex; 0046 }; 0047 #endif 0048 0049 // QueuePolicy that limits the instances of a particular runner 0050 class DefaultRunnerPolicy : public ThreadWeaver::QueuePolicy 0051 { 0052 public: 0053 ~DefaultRunnerPolicy() override; 0054 0055 static DefaultRunnerPolicy &instance(); 0056 0057 void setCap(int cap) 0058 { 0059 m_cap = cap; 0060 } 0061 int cap() const 0062 { 0063 return m_cap; 0064 } 0065 0066 bool canRun(ThreadWeaver::JobPointer job) override; 0067 void free(ThreadWeaver::JobPointer job) override; 0068 void release(ThreadWeaver::JobPointer job) override; 0069 void destructed(ThreadWeaver::JobInterface *job) override; 0070 0071 private: 0072 DefaultRunnerPolicy(); 0073 0074 int m_cap; 0075 QHash<QString, int> m_runCounts; 0076 QMutex m_mutex; 0077 }; 0078 0079 /* 0080 * FindMatchesJob class 0081 * Class to run queries in different threads 0082 */ 0083 class FindMatchesJob : public QObject, public Job 0084 { 0085 Q_OBJECT 0086 public: 0087 FindMatchesJob(Plasma::AbstractRunner *runner, Plasma::RunnerContext *context, QObject *parent = nullptr); 0088 ~FindMatchesJob() override; 0089 0090 int priority() const override; 0091 Plasma::AbstractRunner *runner() const; 0092 0093 #if KRUNNER_BUILD_DEPRECATED_SINCE(5, 81) 0094 QTimer *delayTimer() const 0095 { 0096 return m_timer; 0097 } 0098 void setDelayTimer(QTimer *timer) 0099 { 0100 m_timer = timer; 0101 } 0102 #endif 0103 0104 Q_SIGNALS: 0105 void done(ThreadWeaver::JobPointer self); 0106 0107 protected: 0108 void run(ThreadWeaver::JobPointer self, ThreadWeaver::Thread *thread) override; 0109 0110 private: 0111 Plasma::RunnerContext m_context; 0112 Plasma::AbstractRunner *m_runner; 0113 #if KRUNNER_BUILD_DEPRECATED_SINCE(5, 81) 0114 QTimer *m_timer = nullptr; 0115 #endif 0116 }; 0117 0118 class DelayedJobCleaner : public QObject 0119 { 0120 Q_OBJECT 0121 public: 0122 explicit DelayedJobCleaner(const QSet<QSharedPointer<FindMatchesJob>> &jobs, const QSet<AbstractRunner *> &runners = QSet<AbstractRunner *>()); 0123 ~DelayedJobCleaner() override; 0124 0125 private Q_SLOTS: 0126 void jobDone(ThreadWeaver::JobPointer); 0127 void checkIfFinished(); 0128 0129 private: 0130 ThreadWeaver::Queue *m_weaver; 0131 QSet<QSharedPointer<FindMatchesJob>> m_jobs; 0132 QSet<AbstractRunner *> m_runners; 0133 }; 0134 0135 } 0136 0137 #endif // PLASMA_RUNNERJOBS_P_H