MythTV
master
libs
libmythbase
programinfoupdater.cpp
Go to the documentation of this file.
1
// Posix headers
2
#include <unistd.h>
// for usleep()
3
4
// MythTV headers
5
#include "
libmythbase/mthreadpool.h
"
6
#include "
libmythbase/mythcorecontext.h
"
7
#include "
libmythbase/mythlogging.h
"
8
9
#include "
programinfoupdater.h
"
10
#include "
remoteutil.h
"
11
12
void
ProgramInfoUpdater::insert
(
13
uint
recordedid,
PIAction
action
, uint64_t filesize)
14
{
15
if
(recordedid == 0)
16
return
;
17
QMutexLocker locker(&
m_lock
);
18
if
(
kPIUpdate
==
action
||
kPIUpdateFileSize
==
action
)
19
{
20
QHash<uint,PIKeyData>::iterator it =
m_needsUpdate
.find(recordedid);
21
// If there is no action in the set we can insert
22
// If it is the same type of action we can overwrite,
23
// If it the new action is a full update we can overwrite
24
if
(it ==
m_needsUpdate
.end())
25
m_needsUpdate
.insert(recordedid,
PIKeyData
(
action
, filesize));
26
else
if
(((*it).m_action ==
action
) || (
kPIUpdate
==
action
))
27
(*it) =
PIKeyData
(
action
, filesize);
28
}
29
else
30
{
31
m_needsAddDelete
.emplace_back(recordedid,
action
);
32
}
33
34
// Start a new run() if one isn't already running..
35
// The lock prevents anything from getting stuck on a queue.
36
if
(!
m_isRunning
)
37
{
38
m_isRunning
=
true
;
39
MThreadPool::globalInstance
()->
start
(
this
,
"ProgramInfoUpdater"
);
40
}
41
else
42
m_moreWork
.wakeAll();
43
}
44
45
void
ProgramInfoUpdater::run
(
void
)
46
{
47
bool
workDone =
false
;
48
49
do
{
50
workDone =
false
;
51
52
// we don't need instant updates allow a few to queue up
53
// if they come in quick succession, this allows multiple
54
// updates to be consolidated into one update...
55
usleep(200 * 1000);
// 200ms
56
57
m_lock
.lock();
58
59
// send adds and deletes in the order they were queued
60
for
(
auto
& pi :
m_needsAddDelete
)
61
{
62
if
(
kPIAdd
!= pi.m_action &&
kPIDelete
!= pi.m_action)
63
continue
;
64
65
QString
type
= (
kPIAdd
== pi.m_action) ?
"ADD"
:
"DELETE"
;
66
QString msg = QString(
"RECORDING_LIST_CHANGE %1 %2"
)
67
.arg(
type
).arg(pi.m_recordedid);
68
69
workDone =
true
;
70
gCoreContext
->
SendMessage
(msg);
71
}
72
m_needsAddDelete
.clear();
73
74
// Send updates in any old order, we just need
75
// one per updated ProgramInfo.
76
// NOLINTNEXTLINE(modernize-loop-convert)
77
for
(
auto
itu =
m_needsUpdate
.begin(); itu !=
m_needsUpdate
.end(); ++itu)
78
{
79
QString msg;
80
81
if
(
kPIUpdateFileSize
== (*itu).m_action)
82
{
83
msg = QString(
"UPDATE_FILE_SIZE %1 %2"
)
84
.arg(itu.key())
85
.arg((*itu).m_filesize);
86
}
87
else
88
{
89
msg = QString(
"MASTER_UPDATE_REC_INFO %1"
)
90
.arg(itu.key());
91
}
92
93
workDone =
true
;
94
gCoreContext
->
SendMessage
(msg);
95
}
96
m_needsUpdate
.clear();
97
98
if
( workDone )
99
m_moreWork
.wait(&
m_lock
, 1000);
100
101
m_lock
.unlock();
102
}
while
( workDone );
103
104
m_isRunning
=
false
;
105
}
106
107
/*
108
* vim:ts=4:sw=4:ai:et:si:sts=4
109
*/
PIKeyData
Definition:
programinfoupdater.h:40
MythCoreContext::SendMessage
void SendMessage(const QString &message)
Definition:
mythcorecontext.cpp:1515
kPIDelete
@ kPIDelete
Definition:
programinfoupdater.h:20
ProgramInfoUpdater::run
void run(void) override
Definition:
programinfoupdater.cpp:45
kPIAdd
@ kPIAdd
Definition:
programinfoupdater.h:19
remoteutil.h
ProgramInfoUpdater::m_moreWork
QWaitCondition m_moreWork
Definition:
programinfoupdater.h:59
ProgramInfoUpdater::m_lock
QMutex m_lock
Definition:
programinfoupdater.h:58
ProgramInfoUpdater::m_needsUpdate
QHash< uint, PIKeyData > m_needsUpdate
Definition:
programinfoupdater.h:62
mythlogging.h
programinfoupdater.h
hardwareprofile.getLink.type
type
Definition:
getLink.py:57
PIAction
PIAction
Definition:
programinfoupdater.h:18
ProgramInfoUpdater::insert
void insert(uint recordedid, PIAction action, uint64_t filesize=0ULL)
Definition:
programinfoupdater.cpp:12
ProgramInfoUpdater::m_needsAddDelete
std::vector< PIKeyAction > m_needsAddDelete
Definition:
programinfoupdater.h:61
uint
unsigned int uint
Definition:
compat.h:81
gCoreContext
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
Definition:
mythcorecontext.cpp:54
mthreadpool.h
kPIUpdateFileSize
@ kPIUpdateFileSize
Definition:
programinfoupdater.h:22
mythcorecontext.h
ProgramInfoUpdater::m_isRunning
bool m_isRunning
Definition:
programinfoupdater.h:60
build_compdb.action
action
Definition:
build_compdb.py:9
kPIUpdate
@ kPIUpdate
Definition:
programinfoupdater.h:21
MThreadPool::globalInstance
static MThreadPool * globalInstance(void)
Definition:
mthreadpool.cpp:317
MThreadPool::start
void start(QRunnable *runnable, const QString &debugName, int priority=0)
Definition:
mthreadpool.cpp:352
Generated on Tue May 30 2023 03:19:33 for MythTV by
1.8.17