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);