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