tables: don't retry more than 5*nr times.
authorFelix Domke <tmbinc@elitedvb.net>
Fri, 23 Dec 2005 01:15:06 +0000 (01:15 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Fri, 23 Dec 2005 01:15:06 +0000 (01:15 +0000)
lib/dvb/esection.cpp
lib/dvb/esection.h

index 78db901..0af6225 100644 (file)
@@ -8,6 +8,16 @@ void eGTable::sectionRead(const __u8 *d)
        m_table.flags |= eDVBTableSpec::tfThisVersion;
        m_table.version = (d[5]>>1)&0x1F;
 
+               /* if a section is missing, we retry reading the
+                  whole data up to 5 times. if after that the
+                  section is still missing, we timeout. */
+       if (m_tries > 5 * (last_section_number+1))
+       {
+               timeout();
+               return;
+       }
+       
+       m_tries++;
 
        if (createTable(d[6], d, last_section_number + 1))
        {
@@ -44,6 +54,8 @@ RESULT eGTable::start(iDVBSectionReader *reader, const eDVBTableSpec &table)
        m_reader = reader;
        m_reader->connectRead(slot(*this, &eGTable::sectionRead), m_sectionRead_conn);
        
+       m_tries = 0;
+       
        // setup filter struct
        eDVBSectionFilterMask mask;
        
index 2d71eef..6118276 100644 (file)
@@ -11,6 +11,8 @@ private:
        ePtr<iDVBSectionReader> m_reader;
        eDVBTableSpec m_table;
        
+       int m_tries;
+       
        eTimer *m_timeout;
 
        void sectionRead(const __u8 *data);
@@ -42,7 +44,6 @@ protected:
                        delete sections[nr];
                sections.resize(max);
                
-               
                sections[nr] = new Section(data);
                avail.insert(nr);