diff --git a/HISTORY b/HISTORY index 53ab8bea..c12d4a9c 100644 --- a/HISTORY +++ b/HISTORY @@ -3963,7 +3963,7 @@ Video Disk Recorder Revision History commands may now be executed at any time, and the message will be displayed (no more "pending message"). -2005-12-27: Version 1.3.38 +2005-12-28: Version 1.3.38 - Fixed handling second audio and Dolby Digital PIDs for encrypted channels (was broken in version 1.3.37). @@ -4006,3 +4006,4 @@ Video Disk Recorder Revision History now immediately creates a timer for the selected event and marks it with 'T'. If the event is already marked with 'T', the "Red" button opens the "Edit timer" menu for that timer. +- Removing deleted recordings is now done in a separate thread. diff --git a/recording.c b/recording.c index 3ab83ecf..b2718c9a 100644 --- a/recording.c +++ b/recording.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: recording.c 1.129 2005/12/18 13:38:30 kls Exp $ + * $Id: recording.c 1.130 2005/12/28 12:19:16 kls Exp $ */ #include "recording.h" @@ -62,26 +62,57 @@ bool VfatFileSystem = false; cRecordings DeletedRecordings(true); +// --- cRemoveDeletedRecordingsThread ---------------------------------------- + +class cRemoveDeletedRecordingsThread : public cThread { +protected: + virtual void Action(void); +public: + cRemoveDeletedRecordingsThread(void); + }; + +cRemoveDeletedRecordingsThread::cRemoveDeletedRecordingsThread(void) +:cThread("remove deleted recordings") +{ +} + +void cRemoveDeletedRecordingsThread::Action(void) +{ + // Make sure only one instance of VDR does this: + cLockFile LockFile(VideoDirectory); + if (LockFile.Lock()) { + cThreadLock DeletedRecordingsLock(&DeletedRecordings); + for (cRecording *r = DeletedRecordings.First(); r; ) { + if (r->deleted && time(NULL) - r->deleted > DELETEDLIFETIME) { + cRecording *next = DeletedRecordings.Next(r); + r->Remove(); + DeletedRecordings.Del(r); + r = next; + RemoveEmptyVideoDirectories(); + continue; + } + r = DeletedRecordings.Next(r); + } + } +} + +static cRemoveDeletedRecordingsThread RemoveDeletedRecordingsThread; + +// --- + void RemoveDeletedRecordings(void) { static time_t LastRemoveCheck = 0; if (time(NULL) - LastRemoveCheck > REMOVECHECKDELTA) { - cThreadLock DeletedRecordingsLock(&DeletedRecordings); - for (cRecording *r = DeletedRecordings.First(); r; ) { - if (r->deleted && time(NULL) - r->deleted > DELETEDLIFETIME) { - // Make sure only one instance of VDR does this: - cLockFile LockFile(VideoDirectory); - if (LockFile.Lock()) { - cRecording *next = DeletedRecordings.Next(r); - r->Remove(); - DeletedRecordings.Del(r); - r = next; - RemoveEmptyVideoDirectories(); - continue; + if (!RemoveDeletedRecordingsThread.Active()) { + cThreadLock DeletedRecordingsLock(&DeletedRecordings); + for (cRecording *r = DeletedRecordings.First(); r; r = DeletedRecordings.Next(r)) { + if (r->deleted && time(NULL) - r->deleted > DELETEDLIFETIME) { + RemoveDeletedRecordingsThread.Start(); + break; } } - r = DeletedRecordings.Next(r); - } + } LastRemoveCheck = time(NULL); } }