summaryrefslogtreecommitdiff
path: root/recording.c
diff options
context:
space:
mode:
authorTimo Eskola <timo@tolleri.net>2018-09-02 17:10:01 +0300
committerTimo Eskola <timo@tolleri.net>2018-09-02 17:10:01 +0300
commite793e61250bc01c5c8ab30c61ee88b38ffe56429 (patch)
tree9d691f168da468697bf4be68352c5fffdcfd2c5d /recording.c
parent7b26ed9bf03698505676c1667bf348daf41214d7 (diff)
downloadvdr-plugin-duplicates-e793e61250bc01c5c8ab30c61ee88b38ffe56429.tar.gz
vdr-plugin-duplicates-e793e61250bc01c5c8ab30c61ee88b38ffe56429.tar.bz2
Abort duplicate scanning if recordings state has changed.
Diffstat (limited to 'recording.c')
-rw-r--r--recording.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/recording.c b/recording.c
index 5b98e82..6dee18c 100644
--- a/recording.c
+++ b/recording.c
@@ -103,7 +103,7 @@ cDuplicateRecordingScannerThread::~cDuplicateRecordingScannerThread(){
Stop();
}
-void cDuplicateRecordingScannerThread::Stop() {
+void cDuplicateRecordingScannerThread::Stop(void) {
Cancel(3);
}
@@ -141,8 +141,10 @@ void cDuplicateRecordingScannerThread::Scan(void) {
recordingsStateKey.Remove(false); // sorting doesn't count as a real modification
cList<cDuplicateRecording> duplicates;
for (cDuplicateRecording *recording = recordings.First(); recording; recording = recordings.Next(recording)) {
- if (!Running())
+ if (!Running() || RecordingsStateChanged()) {
+ delete descriptionless;
return;
+ }
if (cIoThrottle::Engaged())
cCondWait::SleepMs(100);
if (!recording->Checked()) {
@@ -171,15 +173,28 @@ void cDuplicateRecordingScannerThread::Scan(void) {
delete descriptionless;
cStateKey duplicateRecordingsStateKey;
DuplicateRecordings.Lock(duplicateRecordingsStateKey, true);
- DuplicateRecordings.Clear();
- for (cDuplicateRecording *duplicate = duplicates.First(); duplicate; duplicate = duplicates.Next(duplicate)) {
- DuplicateRecordings.Add(new cDuplicateRecording(*duplicate));
- }
- duplicateRecordingsStateKey.Remove();
+ if (!RecordingsStateChanged()) {
+ DuplicateRecordings.Clear();
+ for (cDuplicateRecording *duplicate = duplicates.First(); duplicate; duplicate = duplicates.Next(duplicate)) {
+ DuplicateRecordings.Add(new cDuplicateRecording(*duplicate));
+ }
+ duplicateRecordingsStateKey.Remove();
+ } else
+ duplicateRecordingsStateKey.Remove(false);
gettimeofday(&stopTime, NULL);
double seconds = (((long long)stopTime.tv_sec * 1000000 + stopTime.tv_usec) - ((long long)startTime.tv_sec * 1000000 + startTime.tv_usec)) / 1000000.0;
dsyslog("duplicates: Scanning of duplicates took %.2f seconds.", seconds);
}
+bool cDuplicateRecordingScannerThread::RecordingsStateChanged(void) {
+ if (cRecordings::GetRecordingsRead(recordingsStateKey)) {
+ recordingsStateKey.Reset();
+ recordingsStateKey.Remove();
+ dsyslog("duplicates: Recordings state changed while scanning.");
+ return true;
+ }
+ return false;
+}
+
cDuplicateRecordingScannerThread DuplicateRecordingScanner;