summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimo Eskola <timo@tolleri.net>2018-09-02 09:05:22 +0300
committerTimo Eskola <timo@tolleri.net>2018-09-02 09:05:22 +0300
commite12245cacc509ca76a9e2192a3c9c42be0a52861 (patch)
tree1e8bbbee0baf5517e63397cf214c65b7097356db
parent08f0cb51279c0ba868b2543e1447c2ab4123a433 (diff)
downloadvdr-plugin-duplicates-e12245cacc509ca76a9e2192a3c9c42be0a52861.tar.gz
vdr-plugin-duplicates-e12245cacc509ca76a9e2192a3c9c42be0a52861.tar.bz2
Use temporary list when scanning duplicate recordings.
-rw-r--r--menu.c2
-rw-r--r--recording.c49
2 files changed, 27 insertions, 24 deletions
diff --git a/menu.c b/menu.c
index 341355d..6160e96 100644
--- a/menu.c
+++ b/menu.c
@@ -286,7 +286,7 @@ eOSState cMenuDuplicates::Delete(void) {
RecordingsHandler.Del(FileName); // must do this w/o holding a lock, because the cleanup section in cDirCopier::Action() might request one!
if (cReplayControl::NowReplaying() && strcmp(cReplayControl::NowReplaying(), FileName) == 0)
cControl::Shutdown();
- cStateKey recordingsStateKey;
+ cStateKey recordingsStateKey;
cRecordings *Recordings = cRecordings::GetRecordingsWrite(recordingsStateKey);
Recordings->SetExplicitModify();
cRecording *recording = Recordings->GetByName(FileName);
diff --git a/recording.c b/recording.c
index 1555640..5b98e82 100644
--- a/recording.c
+++ b/recording.c
@@ -96,7 +96,7 @@ cDuplicateRecordings DuplicateRecordings;
cDuplicateRecordingScannerThread::cDuplicateRecordingScannerThread() : cThread("duplicate recording scanner", true) {
title = dc.title;
- hidden = dc.hidden;
+ hidden = dc.hidden;
}
cDuplicateRecordingScannerThread::~cDuplicateRecordingScannerThread(){
@@ -124,25 +124,22 @@ void cDuplicateRecordingScannerThread::Action(void) {
}
void cDuplicateRecordingScannerThread::Scan(void) {
+ dsyslog("duplicates: Scanning of duplicates started.");
struct timeval startTime, stopTime;
gettimeofday(&startTime, NULL);
- cStateKey duplicateRecordingsStateKey;
- DuplicateRecordings.Lock(duplicateRecordingsStateKey, true);
cDuplicateRecording *descriptionless = new cDuplicateRecording();
cList<cDuplicateRecording> recordings;
- DuplicateRecordings.Clear();
- {
- cRecordings *Recordings = cRecordings::GetRecordingsWrite(recordingsStateKey); // write access is necessary for sorting!
- Recordings->Sort();
- for (const cRecording *recording = Recordings->First(); recording; recording = Recordings->Next(recording)) {
- cDuplicateRecording *Item = new cDuplicateRecording(recording);
- if (Item->HasDescription())
- recordings.Add(Item);
- else if (dc.hidden || Item->Visibility().Read() != HIDDEN)
- descriptionless->Duplicates()->Add(Item);
- }
- recordingsStateKey.Remove(false); // sorting doesn't count as a real modification
+ cRecordings *Recordings = cRecordings::GetRecordingsWrite(recordingsStateKey); // write access is necessary for sorting!
+ Recordings->Sort();
+ for (const cRecording *recording = Recordings->First(); recording; recording = Recordings->Next(recording)) {
+ cDuplicateRecording *Item = new cDuplicateRecording(recording);
+ if (Item->HasDescription())
+ recordings.Add(Item);
+ else if (dc.hidden || Item->Visibility().Read() != HIDDEN)
+ descriptionless->Duplicates()->Add(Item);
}
+ 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())
return;
@@ -150,28 +147,34 @@ void cDuplicateRecordingScannerThread::Scan(void) {
cCondWait::SleepMs(100);
if (!recording->Checked()) {
recording->SetChecked();
- cDuplicateRecording *duplicates = new cDuplicateRecording();
- duplicates->Duplicates()->Add(new cDuplicateRecording(*recording));
+ cDuplicateRecording *duplicate = new cDuplicateRecording();
+ duplicate->Duplicates()->Add(new cDuplicateRecording(*recording));
for (cDuplicateRecording *compare = recordings.First(); compare; compare = recordings.Next(compare)) {
if (!compare->Checked()) {
if (recording->IsDuplicate(compare)) {
- duplicates->Duplicates()->Add(new cDuplicateRecording(*compare));
+ duplicate->Duplicates()->Add(new cDuplicateRecording(*compare));
compare->SetChecked();
}
}
}
- if (duplicates->Duplicates()->Count() > 1) {
- duplicates->SetText(cString::sprintf(tr("%d duplicate recordings"), duplicates->Duplicates()->Count()));
- DuplicateRecordings.Add(duplicates);
+ if (duplicate->Duplicates()->Count() > 1) {
+ duplicate->SetText(cString::sprintf(tr("%d duplicate recordings"), duplicate->Duplicates()->Count()));
+ duplicates.Add(duplicate);
} else
- delete duplicates;
+ delete duplicate;
}
}
if (descriptionless->Duplicates()->Count() > 0) {
descriptionless->SetText(cString::sprintf(tr("%d recordings without description"), descriptionless->Duplicates()->Count()));
- DuplicateRecordings.Add(descriptionless);
+ duplicates.Add(descriptionless);
} else
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();
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;