summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/filter.c38
-rw-r--r--client/filter.h3
2 files changed, 38 insertions, 3 deletions
diff --git a/client/filter.c b/client/filter.c
index ec5aa9a..db4a7c7 100644
--- a/client/filter.c
+++ b/client/filter.c
@@ -1,5 +1,5 @@
/*
- * $Id: filter.c,v 1.9 2007/04/23 12:01:33 schmirl Exp $
+ * $Id: filter.c,v 1.10 2007/04/23 12:52:28 schmirl Exp $
*/
#include "client/filter.h"
@@ -155,9 +155,43 @@ cStreamdevFilters::~cStreamdevFilters() {
}
int cStreamdevFilters::OpenFilter(u_short Pid, u_char Tid, u_char Mask) {
+ CarbageCollect();
+
cStreamdevFilter *f = new cStreamdevFilter(Pid, Tid, Mask);
+ int fh = f->ReadPipe();
+
+ Lock();
Add(f);
- return f->ReadPipe();
+ Unlock();
+
+ return fh;
+}
+
+void cStreamdevFilters::CarbageCollect(void) {
+ LOCK_THREAD;
+ for (cStreamdevFilter *fi = First(); fi;) {
+ if (fi->IsClosed()) {
+ if (errno == ECONNREFUSED ||
+ errno == ECONNRESET ||
+ errno == EPIPE) {
+ ClientSocket.SetFilter(fi->Pid(), fi->Tid(), fi->Mask(), false);
+ Dprintf("cStreamdevFilters::CarbageCollector: filter closed: Pid %4d, Tid %3d, Mask %2x (%d filters left)",
+ (int)fi->Pid(), (int)fi->Tid(), fi->Mask(), Count()-1);
+
+ cStreamdevFilter *next = Prev(fi);
+ Del(fi);
+ fi = next ? Next(next) : First();
+ } else {
+ esyslog("cStreamdevFilters::CarbageCollector() error: "
+ "Pid %4d, Tid %3d, Mask %2x (%d filters left) failed",
+ (int)fi->Pid(), (int)fi->Tid(), fi->Mask(), Count()-1);
+ LOG_ERROR;
+ fi = Next(fi);
+ }
+ } else {
+ fi = Next(fi);
+ }
+ }
}
cStreamdevFilter *cStreamdevFilters::Matches(u_short Pid, u_char Tid) {
diff --git a/client/filter.h b/client/filter.h
index 9fb9df0..04e8c75 100644
--- a/client/filter.h
+++ b/client/filter.h
@@ -1,5 +1,5 @@
/*
- * $Id: filter.h,v 1.2 2007/04/23 11:23:15 schmirl Exp $
+ * $Id: filter.h,v 1.3 2007/04/23 12:52:28 schmirl Exp $
*/
#ifndef VDR_STREAMDEV_FILTER_H
@@ -23,6 +23,7 @@ private:
protected:
virtual void Action(void);
+ void CarbageCollect(void);
public:
cStreamdevFilters(void);