summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authorschmirl <schmirl>2007-04-23 12:52:28 +0000
committerschmirl <schmirl>2007-04-23 12:52:28 +0000
commit6dd3cc412ee9326c4508f8e73f042223f4e816c3 (patch)
treea7f0934c528e3ee48e880440cbca74aad596bf2d /client
parent5f54824d3d0abb08ebd6f1ef7e9f1952a7498e46 (diff)
downloadvdr-plugin-streamdev-6dd3cc412ee9326c4508f8e73f042223f4e816c3.tar.gz
vdr-plugin-streamdev-6dd3cc412ee9326c4508f8e73f042223f4e816c3.tar.bz2
client_section-pipe-carbage-collector.patch by Petri Hintukainen
- Run section filter carbage collector when adding new filter. Carbage collector closes all filters that have already been closed by local VDR section handler. (without this, closed section filters are removed only when they receive data from server. If they wont, ...). - Add locking to list handling (list is accessed from separate threads) Modified Files: client/filter.c client/filter.h
Diffstat (limited to 'client')
-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);