Index: libs/libmythtv/eithelper.h =================================================================== --- libs/libmythtv/eithelper.h (revision 8390) +++ libs/libmythtv/eithelper.h (working copy) @@ -28,6 +28,8 @@ public slots: void HandleEITs(QMap_Events* events); + signals: + void StopParsing(bool); private: int GetChanID(int tid_db, const Event &event) const; Index: libs/libmythtv/eithelper.cpp =================================================================== --- libs/libmythtv/eithelper.cpp (revision 8390) +++ libs/libmythtv/eithelper.cpp (working copy) @@ -75,35 +75,39 @@ if (!eitList.size()) return 0; + VERBOSE(VB_EIT,QString("EITHelper::ProcessEvents: Events: %1/%2") + .arg(eitList.size()).arg(eitList.front()->size())); + uint insertCount = 0; - if (eitList.front()->size() <= kChunkSize) + + QList_Events subset; + while (subset.size() < kChunkSize && eitList.size()) { QList_Events *events = eitList.front(); - eitList.pop_front(); + while (subset.size() < kChunkSize && events->size()) + { + subset.push_back(events->front()); + events->pop_front(); + } + if (! events->size()) + { + eitList.pop_front(); + delete events; + } + } - eitList_lock.unlock(); - insertCount += UpdateEITList(mplexid, *events); - QList_Events::iterator it = events->begin(); - for (; it != events->end(); ++it) - delete *it; - delete events; - eitList_lock.lock(); - } - else + eitList_lock.unlock(); + insertCount += UpdateEITList(mplexid, subset); + QList_Events::iterator it = subset.begin(); + for (; it != subset.end(); ++it) + delete *it; + eitList_lock.lock(); + + if (eitList.size() <= 20 || eitList.size() > 1000) { - QList_Events *events = eitList.front(); - QList_Events subset; - - QList_Events::iterator subset_end = events->begin(); - for (uint i = 0; i < kChunkSize; ++i) ++subset_end; - subset.insert(subset.end(), events->begin(), subset_end); - events->erase(events->begin(), subset_end); - + int size = eitList.size(); eitList_lock.unlock(); - insertCount += UpdateEITList(mplexid, subset); - QList_Events::iterator it = subset.begin(); - for (; it != subset.end(); ++it) - delete *it; + emit(StopParsing(size > 1000)); eitList_lock.lock(); } Index: libs/libmythtv/eitscanner.cpp =================================================================== --- libs/libmythtv/eitscanner.cpp (revision 8390) +++ libs/libmythtv/eitscanner.cpp (working copy) @@ -176,6 +176,8 @@ eitHelper, SLOT(HandleEITs(QMap_Events*))); connect(channel, SIGNAL(UpdatePMTObject(const PMTObject *)), this, SLOT(SetPMTObject(const PMTObject *))); + connect(eitHelper, SIGNAL(StopParsing(bool)), + parser, SLOT(StopParsing(bool))); } /** \fn EITScanner::StopPassiveScan(void)