summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--HISTORY3
-rw-r--r--recording.c59
2 files changed, 47 insertions, 15 deletions
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);
-void RemoveDeletedRecordings(void)
+// --- cRemoveDeletedRecordingsThread ----------------------------------------
+
+class cRemoveDeletedRecordingsThread : public cThread {
+protected:
+ virtual void Action(void);
+public:
+ cRemoveDeletedRecordingsThread(void);
+ };
+
+cRemoveDeletedRecordingsThread::cRemoveDeletedRecordingsThread(void)
+:cThread("remove deleted recordings")
{
- static time_t LastRemoveCheck = 0;
- if (time(NULL) - LastRemoveCheck > REMOVECHECKDELTA) {
+}
+
+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) {
- // 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;
- }
+ 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) {
+ 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;
+ }
+ }
+ }
LastRemoveCheck = time(NULL);
}
}