MythTV master
housekeeper.h
Go to the documentation of this file.
1#ifndef HOUSEKEEPER_H_
2#define HOUSEKEEPER_H_
3
4#include <QWaitCondition>
5#include <QDateTime>
6#include <QString>
7#include <QEvent>
8#include <QTimer>
9#include <QMutex>
10#include <QQueue>
11#include <QList>
12#include <QMap>
13#include <QPair>
14
15#include "mthread.h"
16#include "mythchrono.h"
17#include "mythdate.h"
18#include "mythevent.h"
19#include "mythbaseexp.h"
20#include "referencecounter.h"
21
22class Scheduler;
23class HouseKeeper;
24
25enum HouseKeeperScope : std::uint8_t {
26 kHKGlobal = 0,
28 kHKLocal,
30 kHKInst
32};
33
34enum HouseKeeperStartup : std::uint8_t {
38};
39
41{
42 public:
43 explicit HouseKeeperTask(const QString &dbTag, HouseKeeperScope scope=kHKGlobal,
45 ~HouseKeeperTask() override = default;
46
47 bool IsFinished(void) const { return m_finished; }
48 void SetFinished(bool fini) { m_finished = fini; }
49 bool CheckRun(const QDateTime& now);
50 bool Run(void);
51 bool ConfirmRun(void) const { return m_confirm; }
52 bool IsRunning(void) const { return m_running; }
53
54 bool CheckImmediate(void);
55 bool CheckStartup(void);
56
57 QString GetTag(void) { return m_dbTag; }
58 QDateTime GetLastRun(void) { return m_lastRun; }
59 QDateTime GetLastSuccess(void) { return m_lastSuccess; }
60 HouseKeeperScope GetScope(void) { return m_scope; }
61 QDateTime QueryLastRun(void);
62 QDateTime QueryLastSuccess(void);
63 QDateTime UpdateLastRun(bool successful=true)
64 { return UpdateLastRun(MythDate::current(), successful); }
65 virtual QDateTime UpdateLastRun(const QDateTime& last, bool successful=true);
66 virtual void SetLastRun(const QDateTime& last, bool successful=true);
67
68 virtual bool DoCheckRun(const QDateTime& /*now*/) { return false; }
69 virtual bool DoRun(void) { return false; }
70
71 virtual void Terminate(void) {}
72
73 private:
74 void QueryLast(void);
75
76 bool m_finished {false};
77 QString m_dbTag;
78 bool m_confirm {false};
81 bool m_running {false};
82
83 QDateTime m_lastRun;
84 QDateTime m_lastSuccess;
85 QDateTime m_lastUpdate;
86};
87
89{
90 public:
91 PeriodicHouseKeeperTask(const QString &dbTag, std::chrono::seconds period, float min=0.5,
92 float max=1.1, std::chrono::seconds retry=0s, HouseKeeperScope scope=kHKGlobal,
94 bool DoCheckRun(const QDateTime& now) override; // HouseKeeperTask
95 virtual bool InWindow(const QDateTime& now);
96 virtual bool PastWindow(const QDateTime& now);
97 QDateTime UpdateLastRun(const QDateTime& last, bool successful=true) override; // HouseKeeperTask
98 void SetLastRun(const QDateTime& last, bool successful=true) override; // HouseKeeperTask
99 virtual void SetWindow(float min, float max);
100
101 protected:
102 virtual void CalculateWindow(void);
103
104 std::chrono::seconds m_period;
105 std::chrono::seconds m_retry;
106 QPair<float,float> m_windowPercent;
107 QPair<std::chrono::seconds,std::chrono::seconds> m_windowElapsed;
108 double m_currentProb { 1.0 };
109};
110
112{
113 public:
114 explicit DailyHouseKeeperTask(const QString &dbTag,
117 DailyHouseKeeperTask(const QString &dbTag,
118 std::chrono::hours minhour, std::chrono::hours maxhour,
121 virtual void SetHourWindow(std::chrono::hours min, std::chrono::hours max);
122 bool InWindow(const QDateTime& now) override; // PeriodicHouseKeeperTask
123
124 protected:
125 void CalculateWindow(void) override; // PeriodicHouseKeeperTask
126
127 private:
128 QPair<std::chrono::hours, std::chrono::hours> m_windowHour;
129};
130
132{
133 public:
135 MThread("HouseKeeping"), m_parent(p) {}
136 ~HouseKeepingThread() override = default;
137 void run(void) override; // MThread
138 void Discard(void) { m_keepRunning = false; }
139 bool isIdle(void) const { return m_idle; }
140 void Wake(void) { m_waitCondition.wakeAll(); }
141
142 void Terminate(void);
143
144 private:
145 bool m_idle { true };
146 bool m_keepRunning { true };
147 HouseKeeper *m_parent { nullptr };
149 QWaitCondition m_waitCondition;
150};
151
152class MBASE_PUBLIC HouseKeeper : public QObject
153{
154 Q_OBJECT
155
156 public:
157 HouseKeeper(void);
158 ~HouseKeeper() override;
159
160 void RegisterTask(HouseKeeperTask *task);
161 void UnregisterTask(const QString& tag);
162 void Start(void);
163 void StartThread(void);
164 HouseKeeperTask* GetQueuedTask(void);
165
166 void customEvent(QEvent *e) override; // QObject
167
168 public slots:
169 void Run(void);
170
171 private:
172 QTimer *m_timer { nullptr };
173
174 QQueue<HouseKeeperTask*> m_taskQueue;
176
177 QMap<QString, HouseKeeperTask*> m_taskMap;
178 QMutex m_mapLock;
179
180 QList<HouseKeepingThread*> m_threadList;
182};
183
184#endif
Modified PeriodicHouseKeeperTask for tasks to be run once daily.
Definition: housekeeper.h:112
QPair< std::chrono::hours, std::chrono::hours > m_windowHour
Definition: housekeeper.h:128
Definition for a single task to be run by the HouseKeeper.
Definition: housekeeper.h:41
HouseKeeperScope GetScope(void)
Definition: housekeeper.h:60
bool IsRunning(void) const
Definition: housekeeper.h:52
virtual bool DoRun(void)
Definition: housekeeper.h:69
~HouseKeeperTask() override=default
HouseKeeperScope m_scope
Definition: housekeeper.h:79
virtual void Terminate(void)
Definition: housekeeper.h:71
QDateTime m_lastSuccess
Definition: housekeeper.h:84
QDateTime GetLastRun(void)
Definition: housekeeper.h:58
QDateTime UpdateLastRun(bool successful=true)
Definition: housekeeper.h:63
QString m_dbTag
Definition: housekeeper.h:77
QDateTime m_lastRun
Definition: housekeeper.h:83
virtual bool DoCheckRun(const QDateTime &)
Definition: housekeeper.h:68
bool IsFinished(void) const
Definition: housekeeper.h:47
HouseKeeperStartup m_startup
Definition: housekeeper.h:80
QString GetTag(void)
Definition: housekeeper.h:57
QDateTime GetLastSuccess(void)
Definition: housekeeper.h:59
bool ConfirmRun(void) const
Definition: housekeeper.h:51
void SetFinished(bool fini)
Definition: housekeeper.h:48
QDateTime m_lastUpdate
Definition: housekeeper.h:85
Manages registered HouseKeeperTasks and queues tasks for operation.
Definition: housekeeper.h:153
QMap< QString, HouseKeeperTask * > m_taskMap
Definition: housekeeper.h:177
QMutex m_mapLock
Definition: housekeeper.h:178
QQueue< HouseKeeperTask * > m_taskQueue
Definition: housekeeper.h:174
QList< HouseKeepingThread * > m_threadList
Definition: housekeeper.h:180
QMutex m_threadLock
Definition: housekeeper.h:181
QMutex m_queueLock
Definition: housekeeper.h:175
Thread used to perform queued HouseKeeper tasks.
Definition: housekeeper.h:132
void run(void) override
Runs the Qt event loop unless we have a QRunnable, in which case we run the runnable run instead.
void Discard(void)
Definition: housekeeper.h:138
HouseKeepingThread(HouseKeeper *p)
Definition: housekeeper.h:134
~HouseKeepingThread() override=default
bool isIdle(void) const
Definition: housekeeper.h:139
QWaitCondition m_waitCondition
Definition: housekeeper.h:149
void Terminate(void)
HouseKeeper * m_parent
Definition: housekeeper.h:147
This is a wrapper around QThread that does several additional things.
Definition: mthread.h:49
Modified HouseKeeperTask for tasks to be run at a regular interval.
Definition: housekeeper.h:89
QPair< float, float > m_windowPercent
Definition: housekeeper.h:106
std::chrono::seconds m_retry
Definition: housekeeper.h:105
std::chrono::seconds m_period
Definition: housekeeper.h:104
QPair< std::chrono::seconds, std::chrono::seconds > m_windowElapsed
Definition: housekeeper.h:107
General purpose reference counter.
HouseKeeperScope
Definition: housekeeper.h:25
@ kHKGlobal
task should only run once per cluster e.g.
Definition: housekeeper.h:26
@ kHKInst
task should run on every process e.g.
Definition: housekeeper.h:30
@ kHKLocal
task should only run once per machine e.g.
Definition: housekeeper.h:28
HouseKeeperStartup
Definition: housekeeper.h:34
@ kHKRunImmediateOnStartup
task is run during HouseKeeper startup
Definition: housekeeper.h:37
@ kHKRunOnStartup
task is queued when HouseKeeper is started
Definition: housekeeper.h:36
@ kHKNormal
task is checked normally
Definition: housekeeper.h:35
#define MBASE_PUBLIC
Definition: mythbaseexp.h:8
static int startup()
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
Definition: mythdate.cpp:15