MythTV master
scheduler.h
Go to the documentation of this file.
1#ifndef SCHEDULER_H_
2#define SCHEDULER_H_
3
4// C++ headers
5#include <deque>
6#include <vector>
7
8// Qt headers
9#include <QWaitCondition>
10#include <QObject>
11#include <QString>
12#include <QMutex>
13#include <QMap>
14#include <QSet>
15
16// MythTV headers
18#include "libmythbase/mthread.h"
24
25class EncoderLink;
26class MainServer;
27class AutoExpire;
28
29class Scheduler;
30
32{
33 public:
34 SchedInputInfo(void) = default;;
35 ~SchedInputInfo(void) = default;
36
39 bool m_schedGroup {false};
40 std::vector<unsigned int> m_groupInputs;
41 std::vector<unsigned int> m_conflictingInputs;
43};
44
45class Scheduler : public MThread, public MythScheduler
46{
47 public:
48 Scheduler(bool runthread, QMap<int, EncoderLink *> *_tvList,
49 const QString& tmptable = "record", Scheduler *master_sched = nullptr);
50 ~Scheduler() override;
51
52 void Stop(void);
53 void Wait(void) { MThread::wait(); }
54
55 void SetExpirer(AutoExpire *autoExpirer) { m_expirer = autoExpirer; }
57
58 void Reschedule(const QStringList &request);
59 void RescheduleMatch(uint recordid, uint sourceid, uint mplexid,
60 const QDateTime &maxstarttime, const QString &why)
62 mplexid, maxstarttime, why)); };
63 void RescheduleCheck(const RecordingInfo &recinfo, const QString &why)
65 void ReschedulePlace(const QString &why)
67
68 void AddRecording(const RecordingInfo &pi);
69 void AddRecording(const ProgramInfo& prog)
70 { AddRecording(RecordingInfo(prog)); };
71 void FillRecordListFromDB(uint recordid = 0);
72 void FillRecordListFromMaster(void);
73
74 void UpdateRecStatus(RecordingInfo *pginfo);
75 void UpdateRecStatus(uint cardid, uint chanid,
76 const QDateTime &startts, RecStatus::Type recstatus,
77 const QDateTime &recendts);
78 // Returns a list of all pending recordings and returns
79 // true iff there are conflicts
80 bool GetAllPending(RecList &retList, int recRuleId = 0) const;
81 bool GetAllPending(ProgramList &retList, int recRuleId = 0) const;
82 void GetAllPending(QStringList &strList) const override; // MythScheduler
83 QMap<QString,ProgramInfo*> GetRecording(void) const override; // MythScheduler
84 virtual RecordingInfo* GetRecording(uint recordedid) const;
85
86 enum SchedSortColumn : std::uint8_t
89 static void GetAllScheduled(QStringList &strList,
91 bool ascending = true);
92 static void GetAllScheduled(RecList &proglist,
94 bool ascending = true);
95
96 void getConflicting(RecordingInfo *pginfo, QStringList &strlist);
97 void getConflicting(RecordingInfo *pginfo, RecList *retlist);
98
99 void PrintList(bool onlyFutureRecordings = false)
100 { PrintList(m_recList, onlyFutureRecordings); };
101 static void PrintList(const RecList &list, bool onlyFutureRecordings = false);
102 static void PrintRec(const RecordingInfo *p, const QString &prefix = "");
103
104 void SetMainServer(MainServer *ms);
106
107 void SlaveConnected(const RecordingList &slavelist);
108 void SlaveDisconnected(uint cardid);
109
112 bool QueryScheduling(void) const { return m_schedulingEnabled; }
113 void GetNextLiveTVDir(uint cardid);
114 void ResetIdleTime(void);
115
116 static bool WasStartedAutomatically();
117
119
120 int GetError(void) const { return m_error; }
121
122 void AddChildInput(uint parentid, uint childid);
123 void DelayShutdown();
124
125 protected:
126 void run(void) override; // MThread
127
128 private:
129 enum OpenEndType : std::uint8_t {
132 openEndAlways = 2
133 };
134
137
138 static bool VerifyCards(void);
139
140 bool InitInputInfoMap(void);
141 void CreateTempTables(void);
142 void DeleteTempTables(void);
143 void UpdateDuplicates(void);
144 bool FillRecordList(void);
145 void UpdateMatches(uint recordid, uint sourceid, uint mplexid,
146 const QDateTime &maxstarttime);
147 void UpdateManuals(uint recordid);
148 void BuildWorkList(void);
149 bool ClearWorkList(void);
150 void AddNewRecords(void);
151 void AddNotListed(void);
152 void BuildNewRecordsQueries(uint recordid, QStringList &from,
153 QStringList &where, MSqlBindings &bindings);
154 void PruneOverlaps(void);
155 void BuildListMaps(void);
156 void ClearListMaps(void);
157
158 bool IsBusyRecording(const RecordingInfo *rcinfo);
159
160 bool IsSameProgram(const RecordingInfo *a, const RecordingInfo *b) const;
161
162 bool FindNextConflict(const RecList &cardlist,
163 const RecordingInfo *p, RecConstIter &iter,
164 OpenEndType openEnd = openEndNever,
165 uint *paffinity = nullptr,
166 bool ignoreinput = false) const;
168 OpenEndType openEnd = openEndNever,
169 uint *affinity = nullptr,
170 bool checkAll = false)
171 const;
173 void MarkShowingsList(const RecList &showinglist, RecordingInfo *p);
174 void BackupRecStatus(void);
175 void RestoreRecStatus(void);
176 bool TryAnotherShowing(RecordingInfo *p, bool samePriority,
177 bool livetv = false);
178 void SchedNewRecords(void);
179 void SchedNewFirstPass(RecIter &start, const RecIter& end,
180 int recpriority, int recpriority2);
181 void SchedNewRetryPass(const RecIter& start, const RecIter& end,
182 bool samePriority, bool livetv = false);
183 void SchedLiveTV(void);
184 void PruneRedundants(void);
185 void UpdateNextRecord(void);
186
188
189 static bool CheckShutdownServer(std::chrono::seconds prerollseconds, QDateTime &idleSince,
190 bool &blockShutdown, uint logmask);
191 void ShutdownServer(std::chrono::seconds prerollseconds, QDateTime &idleSince);
192 void PutInactiveSlavesToSleep(void);
193 bool WakeUpSlave(const QString& slaveHostname, bool setWakingStatus = true);
194 void WakeUpSlaves(void);
195
196 int FillRecordingDir(const QString &title,
197 const QString &hostname,
198 const QString &storagegroup,
199 const QDateTime &recstartts,
200 const QDateTime &recendts,
201 uint cardid,
202 QString &recording_dir,
203 const RecList &reclist);
204 void FillDirectoryInfoCache(void);
205
206 void OldRecordedFixups(void);
207 void ResetDuplicates(uint recordid, uint findid, const QString &title,
208 const QString &subtitle, const QString &descrip,
209 const QString &programid);
210 bool HandleReschedule(void);
212 std::chrono::seconds prerollseconds, std::chrono::minutes idleWaitForRecordingTime);
213 void HandleWakeSlave(RecordingInfo &ri, std::chrono::seconds prerollseconds);
214 bool HandleRecording(RecordingInfo &ri, bool &statuschanged,
215 QDateTime &nextStartTime, QDateTime &nextWakeTime,
216 std::chrono::seconds prerollseconds);
218 RecordingInfo &ri, RecStatus::Type recStatus, const QString &details);
219 bool AssignGroupInput(RecordingInfo &ri, std::chrono::seconds prerollseconds);
221 bool &blockShutdown, QDateTime &idleSince, std::chrono::seconds prerollseconds,
222 std::chrono::seconds idleTimeoutSecs, std::chrono::minutes idleWaitForRecordingTime,
223 bool statuschanged);
224
225 void EnqueueMatch(uint recordid, uint sourceid, uint mplexid,
226 const QDateTime &maxstarttime, const QString &why)
228 sourceid, mplexid, maxstarttime, why)); };
229 void EnqueueCheck(const RecordingInfo &recinfo, const QString &why)
231 why)); };
232 void EnqueuePlace(const QString &why)
234
236 { return !m_reschedQueue.empty(); };
238 { m_reschedQueue.clear(); };
239
240 bool CreateConflictLists(void);
241
243 mutable QMutex m_schedLock;
245 QWaitCondition m_reschedWait;
249 QMap<uint, SchedInputInfo> m_sinputInfoMap;
250 std::vector<RecList *> m_conflictLists;
251 QMap<uint, RecList> m_recordIdListMap;
252 QMap<QString, RecList> m_titleListMap;
253
254 QDateTime m_schedTime;
255 bool m_recListChanged {false};
256
257 bool m_specSched {false};
259 QMap<int, bool> m_schedAfterStartMap;
260
261 QMap<int, EncoderLink *> *m_tvList {nullptr};
263
265
266 bool m_doRun {false};
267
269
271 bool m_resetIdleTime {false};
272
273 bool m_isShuttingDown {false};
275
276 QMap<QString, FileSystemInfo> m_fsInfoCache;
277
278 int m_error {0};
279
280 std::array<QSet<QString>,4> m_sysEvents;
281
282 // Try to avoid LiveTV sessions until this time
283 QDateTime m_livetvTime;
284
286 // Delay shutdown util this time (ms since epoch);
287 std::chrono::milliseconds m_delayShutdownTime {0ms};
288
290
291 // cache IsSameProgram()
292 using IsSameKey = std::pair<const RecordingInfo*,const RecordingInfo*>;
293 using IsSameCacheType = QMap<IsSameKey,bool>;
295 int m_tmLastLog {0};
296};
297
298#endif
static GlobalSpinBoxSetting * idleTimeoutSecs()
static GlobalSpinBoxSetting * idleWaitForRecordingTime()
Used to expire recordings to make space for new recordings.
Definition: autoexpire.h:60
This is a wrapper around QThread that does several additional things.
Definition: mthread.h:49
void start(QThread::Priority p=QThread::InheritPriority)
Tell MThread to start running the thread in the near future.
Definition: mthread.cpp:283
bool wait(std::chrono::milliseconds time=std::chrono::milliseconds::max())
Wait for the MThread to exit, with a maximum timeout.
Definition: mthread.cpp:300
void enqueue(const T &d)
Adds item to the back of the list. O(1).
Definition: mythdeque.h:41
This is an generic interface to a program scheduler.
Definition: mythscheduler.h:18
Holds information on recordings and videos.
Definition: programinfo.h:68
Holds information on a TV Program one might wish to record.
Definition: recordinginfo.h:36
std::vector< unsigned int > m_groupInputs
Definition: scheduler.h:40
std::vector< unsigned int > m_conflictingInputs
Definition: scheduler.h:41
bool m_schedGroup
Definition: scheduler.h:39
SchedInputInfo(void)=default
RecList * m_conflictList
Definition: scheduler.h:42
~SchedInputInfo(void)=default
uint m_inputId
Definition: scheduler.h:37
uint m_sgroupId
Definition: scheduler.h:38
static QStringList BuildPlaceRequest(const QString &why)
static QStringList BuildCheckRequest(const RecordingInfo &recinfo, const QString &why)
static QStringList BuildMatchRequest(uint recordid, uint sourceid, uint mplexid, const QDateTime &maxstarttime, const QString &why)
QWaitCondition m_reschedWait
Definition: scheduler.h:245
QMap< int, bool > m_schedAfterStartMap
Definition: scheduler.h:259
bool m_recListChanged
Definition: scheduler.h:255
const RecordingInfo * FindConflict(const RecordingInfo *p, OpenEndType openEnd=openEndNever, uint *affinity=nullptr, bool checkAll=false) const
Definition: scheduler.cpp:1183
QDateTime m_livetvTime
Definition: scheduler.h:283
QMap< int, EncoderLink * > * m_tvList
Definition: scheduler.h:261
void SchedLiveTV(void)
Definition: scheduler.cpp:5718
bool QueryScheduling(void) const
Definition: scheduler.h:112
bool WakeUpSlave(const QString &slaveHostname, bool setWakingStatus=true)
Definition: scheduler.cpp:3640
void SlaveConnected(const RecordingList &slavelist)
Definition: scheduler.cpp:832
void FillDirectoryInfoCache(void)
Definition: scheduler.cpp:5697
QMutex m_schedLock
Definition: scheduler.h:243
void BuildWorkList(void)
Definition: scheduler.cpp:937
static void PrintRec(const RecordingInfo *p, const QString &prefix="")
Definition: scheduler.cpp:612
bool m_resetIdleTime
Definition: scheduler.h:271
bool IsSameProgram(const RecordingInfo *a, const RecordingInfo *b) const
Definition: scheduler.cpp:1062
QMap< QString, FileSystemInfo > m_fsInfoCache
Definition: scheduler.h:276
bool AssignGroupInput(RecordingInfo &ri, std::chrono::seconds prerollseconds)
Definition: scheduler.cpp:2952
void DelayShutdown()
Definition: scheduler.cpp:3091
bool ClearWorkList(void)
Definition: scheduler.cpp:949
void BackupRecStatus(void)
Definition: scheduler.cpp:1247
bool IsBusyRecording(const RecordingInfo *rcinfo)
Definition: scheduler.cpp:1914
QString m_recordTable
Definition: scheduler.h:135
void AddNewRecords(void)
Definition: scheduler.cpp:4383
SchedSortColumn
Definition: scheduler.h:87
@ kSortNextRecording
Definition: scheduler.h:87
@ kSortType
Definition: scheduler.h:88
@ kSortTitle
Definition: scheduler.h:87
@ kSortPriority
Definition: scheduler.h:88
@ kSortLastRecorded
Definition: scheduler.h:87
bool m_doRun
Definition: scheduler.h:266
int m_tmLastLog
Definition: scheduler.h:295
bool m_specSched
Definition: scheduler.h:257
void Wait(void)
Definition: scheduler.h:53
void AddRecording(const ProgramInfo &prog)
Definition: scheduler.h:69
MythDeque< QStringList > m_reschedQueue
Definition: scheduler.h:242
void MarkOtherShowings(RecordingInfo *p)
Definition: scheduler.cpp:1203
void ResetIdleTime(void)
Definition: scheduler.cpp:151
bool HaveQueuedRequests(void)
Definition: scheduler.h:235
MainServer * GetMainServer()
Definition: scheduler.h:105
static bool VerifyCards(void)
Definition: scheduler.cpp:158
QDateTime m_lastPrepareTime
Definition: scheduler.h:285
bool GetAllPending(RecList &retList, int recRuleId=0) const
Definition: scheduler.cpp:1746
std::chrono::milliseconds m_delayShutdownTime
Definition: scheduler.h:287
void RestoreRecStatus(void)
Definition: scheduler.cpp:1255
bool CreateConflictLists(void)
Definition: scheduler.cpp:5818
void CreateTempTables(void)
Definition: scheduler.cpp:4211
void EnqueueCheck(const RecordingInfo &recinfo, const QString &why)
Definition: scheduler.h:229
std::pair< const RecordingInfo *, const RecordingInfo * > IsSameKey
Definition: scheduler.h:292
void AddChildInput(uint parentid, uint childid)
Definition: scheduler.cpp:5952
void FillRecordListFromDB(uint recordid=0)
Definition: scheduler.cpp:492
void UpdateMatches(uint recordid, uint sourceid, uint mplexid, const QDateTime &maxstarttime)
Definition: scheduler.cpp:4041
RecList m_livetvList
Definition: scheduler.h:248
void ShutdownServer(std::chrono::seconds prerollseconds, QDateTime &idleSince)
Definition: scheduler.cpp:3381
@ openEndAlways
Definition: scheduler.h:132
@ openEndNever
Definition: scheduler.h:130
@ openEndDiffChannel
Definition: scheduler.h:131
void SchedNewFirstPass(RecIter &start, const RecIter &end, int recpriority, int recpriority2)
Definition: scheduler.cpp:1440
void ReschedulePlace(const QString &why)
Definition: scheduler.h:65
QMutex m_resetIdleTimeLock
Definition: scheduler.h:270
bool HandleRecording(RecordingInfo &ri, bool &statuschanged, QDateTime &nextStartTime, QDateTime &nextWakeTime, std::chrono::seconds prerollseconds)
Definition: scheduler.cpp:2658
bool HandleRunSchedulerStartup(std::chrono::seconds prerollseconds, std::chrono::minutes idleWaitForRecordingTime)
Definition: scheduler.cpp:2503
void BuildNewRecordsQueries(uint recordid, QStringList &from, QStringList &where, MSqlBindings &bindings)
Definition: scheduler.cpp:3879
void UpdateNextRecord(void)
Definition: scheduler.cpp:1649
QSet< uint > m_schedOrderWarned
Definition: scheduler.h:264
void EnqueuePlace(const QString &why)
Definition: scheduler.h:232
Scheduler(bool runthread, QMap< int, EncoderLink * > *_tvList, const QString &tmptable="record", Scheduler *master_sched=nullptr)
Definition: scheduler.cpp:63
static bool WasStartedAutomatically()
Definition: scheduler.cpp:5770
bool FindNextConflict(const RecList &cardlist, const RecordingInfo *p, RecConstIter &iter, OpenEndType openEnd=openEndNever, uint *paffinity=nullptr, bool ignoreinput=false) const
Definition: scheduler.cpp:1078
void RescheduleCheck(const RecordingInfo &recinfo, const QString &why)
Definition: scheduler.h:63
int FillRecordingDir(const QString &title, const QString &hostname, const QString &storagegroup, const QDateTime &recstartts, const QDateTime &recendts, uint cardid, QString &recording_dir, const RecList &reclist)
Definition: scheduler.cpp:5196
void ResetDuplicates(uint recordid, uint findid, const QString &title, const QString &subtitle, const QString &descrip, const QString &programid)
Definition: scheduler.cpp:2256
void PrintList(bool onlyFutureRecordings=false)
Definition: scheduler.h:99
bool FillRecordList(void)
Definition: scheduler.cpp:441
static void GetAllScheduled(QStringList &strList, SchedSortColumn sortBy=kSortTitle, bool ascending=true)
Returns all scheduled programs serialized into a QStringList.
Definition: scheduler.cpp:1848
void WakeUpSlaves(void)
Definition: scheduler.cpp:3687
void SchedNewRetryPass(const RecIter &start, const RecIter &end, bool samePriority, bool livetv=false)
Definition: scheduler.cpp:1518
int GetError(void) const
Definition: scheduler.h:120
void HandleWakeSlave(RecordingInfo &ri, std::chrono::seconds prerollseconds)
Definition: scheduler.cpp:2555
QDateTime m_schedTime
Definition: scheduler.h:254
void getConflicting(RecordingInfo *pginfo, QStringList &strlist)
Definition: scheduler.cpp:1716
std::vector< RecList * > m_conflictLists
Definition: scheduler.h:250
OpenEndType m_openEnd
Definition: scheduler.h:289
RecList m_workList
Definition: scheduler.h:247
bool ChangeRecordingEnd(RecordingInfo *oldp, RecordingInfo *newp)
Definition: scheduler.cpp:755
RecStatus::Type GetRecStatus(const ProgramInfo &pginfo)
Definition: scheduler.cpp:1811
void run(void) override
Runs the Qt event loop unless we have a QRunnable, in which case we run the runnable run instead.
Definition: scheduler.cpp:2036
void DeleteTempTables(void)
Definition: scheduler.cpp:4259
void EnqueueMatch(uint recordid, uint sourceid, uint mplexid, const QDateTime &maxstarttime, const QString &why)
Definition: scheduler.h:225
void RescheduleMatch(uint recordid, uint sourceid, uint mplexid, const QDateTime &maxstarttime, const QString &why)
Definition: scheduler.h:59
void Reschedule(const QStringList &request)
Definition: scheduler.cpp:1866
bool InitInputInfoMap(void)
Definition: scheduler.cpp:5908
QMap< uint, RecList > m_recordIdListMap
Definition: scheduler.h:251
void PruneOverlaps(void)
Definition: scheduler.cpp:994
RecList m_recList
Definition: scheduler.h:246
void PruneRedundants(void)
Definition: scheduler.cpp:1568
void SlaveDisconnected(uint cardid)
Definition: scheduler.cpp:907
MainServer * m_mainServer
Definition: scheduler.h:268
void PutInactiveSlavesToSleep(void)
Definition: scheduler.cpp:3496
QMutex m_recordMatchLock
Definition: scheduler.h:244
QMap< QString, ProgramInfo * > GetRecording(void) const override
Definition: scheduler.cpp:1785
void OldRecordedFixups(void)
Definition: scheduler.cpp:1991
AutoExpire * GetExpirer()
Definition: scheduler.h:56
void DisableScheduling(void)
Definition: scheduler.h:110
bool TryAnotherShowing(RecordingInfo *p, bool samePriority, bool livetv=false)
Definition: scheduler.cpp:1263
void SetExpirer(AutoExpire *autoExpirer)
Definition: scheduler.h:55
void AddNotListed(void)
Definition: scheduler.cpp:4823
void GetNextLiveTVDir(uint cardid)
Definition: scheduler.cpp:5169
void ClearListMaps(void)
Definition: scheduler.cpp:1053
void FillRecordListFromMaster(void)
Definition: scheduler.cpp:575
void ClearRequestQueue(void)
Definition: scheduler.h:237
AutoExpire * m_expirer
Definition: scheduler.h:262
void UpdateManuals(uint recordid)
Definition: scheduler.cpp:3717
IsSameCacheType m_cacheIsSameProgram
Definition: scheduler.h:294
bool m_schedulingEnabled
Definition: scheduler.h:258
std::array< QSet< QString >, 4 > m_sysEvents
Definition: scheduler.h:280
void AddRecording(const RecordingInfo &pi)
Definition: scheduler.cpp:1873
bool HandleReschedule(void)
Definition: scheduler.cpp:2333
bool m_isShuttingDown
Definition: scheduler.h:273
void UpdateDuplicates(void)
Definition: scheduler.cpp:4275
void BuildListMaps(void)
Definition: scheduler.cpp:1018
QMap< IsSameKey, bool > IsSameCacheType
Definition: scheduler.h:293
void HandleIdleShutdown(bool &blockShutdown, QDateTime &idleSince, std::chrono::seconds prerollseconds, std::chrono::seconds idleTimeoutSecs, std::chrono::minutes idleWaitForRecordingTime, bool statuschanged)
Definition: scheduler.cpp:3096
QString m_priorityTable
Definition: scheduler.h:136
void MarkShowingsList(const RecList &showinglist, RecordingInfo *p)
Definition: scheduler.cpp:1222
QMap< uint, SchedInputInfo > m_sinputInfoMap
Definition: scheduler.h:249
void HandleRecordingStatusChange(RecordingInfo &ri, RecStatus::Type recStatus, const QString &details)
Definition: scheduler.cpp:2913
void EnableScheduling(void)
Definition: scheduler.h:111
void SetMainServer(MainServer *ms)
Definition: scheduler.cpp:146
void UpdateRecStatus(RecordingInfo *pginfo)
Definition: scheduler.cpp:650
int m_error
Definition: scheduler.h:278
QMap< QString, RecList > m_titleListMap
Definition: scheduler.h:252
void Stop(void)
Definition: scheduler.cpp:139
void SchedNewRecords(void)
Definition: scheduler.cpp:1371
~Scheduler() override
Definition: scheduler.cpp:103
static bool CheckShutdownServer(std::chrono::seconds prerollseconds, QDateTime &idleSince, bool &blockShutdown, uint logmask)
Definition: scheduler.cpp:3321
MSqlQueryInfo m_dbConn
Definition: scheduler.h:274
unsigned int uint
Definition: freesurround.h:24
QMap< QString, QVariant > MSqlBindings
typedef for a map of string -> string bindings for generic queries.
Definition: mythdbcon.h:100
RecList::const_iterator RecConstIter
Definition: mythscheduler.h:13
RecList::iterator RecIter
Definition: mythscheduler.h:14
std::deque< RecordingInfo * > RecList
Definition: mythscheduler.h:12
string hostname
Definition: caa.py:17
MSqlDatabase Info, used by MSqlQuery. Do not use directly.
Definition: mythdbcon.h:93