Ticket #892: eitratelimit_#892_8612.patch

File eitratelimit_#892_8612.patch, 5.4 KB (added by greg, 15 years ago)

Small mods to the previously submitted patch

  • libs/libmythtv/eithelper.h

     
    2020{
    2121    Q_OBJECT
    2222  public:
    23     EITHelper() : QObject(NULL, "EITHelper") { ; }
     23    EITHelper() : QObject(NULL, "EITHelper")
     24    {
     25        events_full = false;
     26    }
    2427
    2528    void ClearList(void);
    2629    uint GetListSize(void) const;
     
    2831
    2932  public slots:
    3033    void HandleEITs(QMap_Events* events);
     34  signals:
     35    void StopParsing(bool);
    3136
    3237  private:
    3338    int GetChanID(int tid_db, const Event &event) const;
     
    3944
    4045    /// Maximum number of DB inserts per ProcessEvents call.
    4146    static const uint kChunkSize;
     47
     48    // Max event list size before we stop parsing incoming events
     49    // allowing us to try and catchup.
     50    static const uint kMAXChunkSize;
     51
     52    bool events_full;
    4253};
    4354
    4455#endif // USING_DVB
  • libs/libmythtv/siparser.cpp

     
    6464    ParserInReset(false),           standardChange(false),
    6565    PrivateTypesLoaded(false)
    6666{
     67    events_full = false;
     68
    6769    /* Set the PrivateTypes to default values */
    6870    PrivateTypes.reset();
    6971
     
    515517    (void) pid;
    516518#endif
    517519
     520    if (events_full)
     521    {
     522        pmap_lock.unlock();
     523        return;
     524    }
     525
    518526    if (!(buffer[1] & 0x80))
    519527    {
    520528        VERBOSE(VB_SIPARSER, LOC +
  • libs/libmythtv/eithelper.cpp

     
    44#include "eithelper.h"
    55#include "mythdbcon.h"
    66
     7
     8// TODO: Should these be configurable values based on how much ram a
     9// backend has available?
    710const uint EITHelper::kChunkSize = 20;
     11const uint EITHelper::kMAXChunkSize = 2000;
    812
    913static int get_chan_id_from_db(int tid_db, const Event&);
    1014static uint update_eit_in_db(MSqlQuery&, MSqlQuery&, int, const Event&);
     
    7579    if (!eitList.size())
    7680        return 0;
    7781
     82    //VERBOSE(VB_EIT,QString("EITHelper::ProcessEvents: Events: %1/%2")
     83    //        .arg(eitList.size()).arg(eitList.front()->size()));
     84
    7885    uint insertCount = 0;
    79     if (eitList.front()->size() <= kChunkSize)
     86
     87    QList_Events  subset;
     88    while (subset.size() < kChunkSize && eitList.size())
    8089    {
    8190        QList_Events *events = eitList.front();
    82         eitList.pop_front();
     91        while (subset.size() < kChunkSize && events->size())
     92        {
     93            subset.push_back(events->front());
     94            events->pop_front();
     95        }
     96        if (! events->size())
     97        {
     98            eitList.pop_front();
     99            delete events;
     100        }
     101    }
    83102
    84         eitList_lock.unlock();
    85         insertCount += UpdateEITList(mplexid, *events);
    86         QList_Events::iterator it = events->begin();
    87         for (; it != events->end(); ++it)
    88             delete *it;
    89         delete events;
    90         eitList_lock.lock();
    91     }
    92     else
     103    eitList_lock.unlock();
     104    insertCount += UpdateEITList(mplexid, subset);
     105    QList_Events::iterator it = subset.begin();
     106    for (; it != subset.end(); ++it)
     107        delete *it;
     108    eitList_lock.lock();
     109
     110    if (((eitList.size() <= kChunkSize) && events_full)
     111          || ((eitList.size() > kMAXChunkSize) && !events_full))
    93112    {
    94         QList_Events *events = eitList.front();
    95         QList_Events  subset;
     113        int size = eitList.size();
     114        VERBOSE(VB_GENERAL, QString ("EITHelper: ToggleParsing EIT (%1)")
     115                                      .arg(size));
    96116
    97         QList_Events::iterator subset_end = events->begin();
    98         for (uint i = 0; i < kChunkSize; ++i) ++subset_end;
    99         subset.insert(subset.end(), events->begin(), subset_end);
    100         events->erase(events->begin(), subset_end);
    101        
     117        events_full = (size > kMAXChunkSize);
     118
    102119        eitList_lock.unlock();
    103         insertCount += UpdateEITList(mplexid, subset);
    104         QList_Events::iterator it = subset.begin();
    105         for (; it != subset.end(); ++it)
    106             delete *it;
     120        emit(StopParsing(events_full));
    107121        eitList_lock.lock();
    108122    }
    109123
  • libs/libmythtv/eitscanner.cpp

     
    176176            eitHelper, SLOT(HandleEITs(QMap_Events*)));
    177177    connect(channel,   SIGNAL(UpdatePMTObject(const PMTObject *)),
    178178            this,      SLOT(SetPMTObject(const PMTObject *)));
     179    connect(eitHelper, SIGNAL(StopParsing(bool)),
     180            parser,    SLOT(StopParsing(bool)));
    179181}
    180182
    181183/** \fn EITScanner::StopPassiveScan(void)
  • libs/libmythtv/siparser.h

     
    111111
    112112  public slots:
    113113    virtual void deleteLater(void);
     114    void StopParsing(bool stop)
     115         { pmap_lock.lock(); events_full = stop; pmap_lock.unlock(); }
    114116
    115117  signals:
    116118    void FindTransportsComplete(void);
     
    279281    // statistics
    280282    QMap<uint,uint>     descCount;
    281283    mutable QMutex      descLock;
     284
     285    bool events_full;
    282286};
    283287
    284288#endif // SIPARSER_H