Originally posted by dingo
Schon lange habe ich errors wenn mehrere Aufnahmen auf mein full-feature DVB-Karte gescheduled werden:
syslog.1:May 6 22:43:58 videoserver2 vdr: [11682] ERROR: /dev/dvb/adapter3/demux0: Too many open files
syslog.2:May 3 21:33:02 videoserver2 vdr: [4022] ERROR: can't open filter handle on '/dev/dvb/adapter3/demux0'
syslog.2:May 4 23:57:06 videoserver2 vdr: [6263] ERROR: /dev/dvb/adapter3/demux0: Too many open files
syslog.3:Apr 22 16:55:42 videoserver2 vdr: [4046] ERROR: /dev/dvb/adapter3/demux0: Too many open files
syslog.3:Apr 23 14:42:17 videoserver2 vdr: [12756] ERROR: /dev/dvb/adapter3/demux0: Too many open files
Dies wird verursacht durch die hardwaremässige Beschränkung von das Nummer von Pid-filters an FF-Karten.
Dieses kleines Patch bespart einige Pid-filter; bei mir genügt das so dass keine Errors mehr auftreten.
Ich bin der Meinung dieses patch hat nur Vorteile, und keine Nachteile; würde es möglich sein es in nächsten Version von VDR auf zu nehmen?
--- VDR/eit.c.orig 2009-05-08 14:52:18.000000000 +0200
+++ VDR/eit.c 2009-05-08 21:13:25.000000000 +0200
@@ -493,21 +493,25 @@
cEitFilter::cEitFilter(void)
{
- Set(0x12, 0x4E, 0xFE); // event info, actual(0x4E)/other(0x4F) TS, present/following
+/*Set(0x12, 0x4E, 0xFE); // event info, actual(0x4E)/other(0x4F) TS, present/following
Set(0x12, 0x50, 0xF0); // event info, actual TS, schedule(0x50)/schedule for future days(0x5X)
Set(0x12, 0x60, 0xF0); // event info, other TS, schedule(0x60)/schedule for future days(0x6X)
- Set(0x14, 0x70); // TDT
+*/
+ Set(0x12, 0x40, 0xC0); // event info, actual(0x4E), other(0x4F), actual TS future (0x5X), other TS future (0x6X)
+ if (Setup.SetSystemTime && Setup.TimeTransponder)
+ Set(0x14, 0x70); // TDT
}
void cEitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length)
{
switch (Pid) {
case 0x12: {
- cSchedulesLock SchedulesLock(true, 10);
- cSchedules *Schedules = (cSchedules *)cSchedules::Schedules(SchedulesLock);
- if (Schedules)
+ if ((Tid >= 0x4E) && (Tid <= 0x6F)) {
+ cSchedulesLock SchedulesLock(true, 10);
+ cSchedules *Schedules = (cSchedules *)cSchedules::Schedules(SchedulesLock);
+ if (Schedules)
cEIT EIT(Schedules, Source(), Tid, Data);
- else {
+ else {
// If we don't get a write lock, let's at least get a read lock, so
// that we can set the running status and 'seen' timestamp (well, actually
// with a read lock we shouldn't be doing that, but it's only integers that
@@ -516,8 +520,9 @@
cSchedules *Schedules = (cSchedules *)cSchedules::Schedules(SchedulesLock);
if (Schedules)
cEIT EIT(Schedules, Source(), Tid, Data, true);
- }
+ }
}
+ }
break;
case 0x14: {
if (Setup.SetSystemTime && Setup.TimeTransponder && ISTRANSPONDER(Transponder(), Setup.TimeTransponder))
Alles anzeigen