diff options
author | Timo Eskola <timo@tolleri.net> | 2018-09-02 17:10:01 +0300 |
---|---|---|
committer | Timo Eskola <timo@tolleri.net> | 2018-09-02 17:10:01 +0300 |
commit | e793e61250bc01c5c8ab30c61ee88b38ffe56429 (patch) | |
tree | 9d691f168da468697bf4be68352c5fffdcfd2c5d | |
parent | 7b26ed9bf03698505676c1667bf348daf41214d7 (diff) | |
download | vdr-plugin-duplicates-e793e61250bc01c5c8ab30c61ee88b38ffe56429.tar.gz vdr-plugin-duplicates-e793e61250bc01c5c8ab30c61ee88b38ffe56429.tar.bz2 |
Abort duplicate scanning if recordings state has changed.
-rw-r--r-- | menu.c | 6 | ||||
-rw-r--r-- | recording.c | 29 | ||||
-rw-r--r-- | recording.h | 1 |
3 files changed, 26 insertions, 10 deletions
@@ -148,7 +148,7 @@ void cMenuDuplicates::SetHelpKeys(void) { void cMenuDuplicates::Set(bool Refresh) { if (DuplicateRecordings.Lock(duplicateRecordingsStateKey)) { - dsyslog("duplicates: %s menu.", Refresh ? "Refreshing" : "Creating"); + dsyslog("duplicates: %s menu.", Refresh ? "Refreshing" : "Creating"); const char *CurrentRecording = NULL; int currentIndex = -1; if (Refresh) @@ -269,7 +269,7 @@ eOSState cMenuDuplicates::Delete(void) { if (HasSubMenu() || Count() == 0) return osContinue; if (cMenuDuplicateItem *ri = (cMenuDuplicateItem *)Get(Current())) { - const char *FileName = ri->FileName(); + const char *FileName = ri->FileName(); if (Interface->Confirm(trVDR("Delete recording?"))) { if (TimerStillRecording(FileName)) return osContinue; @@ -301,8 +301,8 @@ eOSState cMenuDuplicates::Delete(void) { SetHelpKeys(); Display(); } else { - Skins.Message(mtError, trVDR("Error while deleting recording!")); recordingsStateKey.Remove(); + Skins.Message(mtError, trVDR("Error while deleting recording!")); } } } 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; diff --git a/recording.h b/recording.h index ce766cc..0a93dfb 100644 --- a/recording.h +++ b/recording.h @@ -57,6 +57,7 @@ private: int title; int hidden; void Scan(void); + bool RecordingsStateChanged(void); protected: virtual void Action(void); public: |