diff --git a/src/eitd/sectionsd.cpp b/src/eitd/sectionsd.cpp index 964974068..661bd9bec 100644 --- a/src/eitd/sectionsd.cpp +++ b/src/eitd/sectionsd.cpp @@ -68,7 +68,8 @@ static bool notify_complete = false; #define HOUSEKEEPING_SLEEP (5 * 60) // sleep 5 minutes //#define HOUSEKEEPING_SLEEP (30) // FIXME 1 min for testing /* period to clean cached sections and force restart sections read */ -#define META_HOUSEKEEPING (24 * 60 * 60) / HOUSEKEEPING_SLEEP // meta housekeeping after XX housekeepings - every 24h - +#define META_HOUSEKEEPING_COUNT (24 * 60 * 60) / HOUSEKEEPING_SLEEP // meta housekeeping after XX housekeepings - every 24h - +#define STANDBY_HOUSEKEEPING_COUNT (60 * 60) / HOUSEKEEPING_SLEEP // Timeout bei tcp/ip connections in ms #define READ_TIMEOUT_IN_SECONDS 2 @@ -611,6 +612,7 @@ static void removeOldEvents(const long seconds) time_t zeit = time(NULL); readLockEvents(); + unsigned total_events = mySIeventsOrderUniqueKey.size(); MySIeventsOrderFirstEndTimeServiceIDEventUniqueKey::iterator e = mySIeventsOrderFirstEndTimeServiceIDEventUniqueKey.begin(); @@ -633,6 +635,9 @@ static void removeOldEvents(const long seconds) for (std::vector::iterator i = to_delete.begin(); i != to_delete.end(); ++i) deleteEvent(*i); + readLockEvents(); + printf("[sectionsd] Removed %d old events (%d left).\n", (int)(total_events - mySIeventsOrderUniqueKey.size()), (int)mySIeventsOrderUniqueKey.size()); + unlockEvents(); return; } @@ -2003,14 +2008,14 @@ static void print_meminfo(void) //--------------------------------------------------------------------- static void *houseKeepingThread(void *) { - int count = 0; + int count = 0, scount = 0; dprintf("housekeeping-thread started.\n"); pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, 0); while (!sectionsd_stop) { - if (count == META_HOUSEKEEPING) { + if (count == META_HOUSEKEEPING_COUNT) { dprintf("meta housekeeping - deleting all transponders, services, bouquets.\n"); deleteSIexceptEPG(); count = 0; @@ -2021,53 +2026,28 @@ static void *houseKeepingThread(void *) while (rc) rc = sleep(rc); - while (!scanning) { - sleep(1); // wait for streaming to end... - if (sectionsd_stop) - break; + if (!scanning) { + scount++; + if (scount < STANDBY_HOUSEKEEPING_COUNT) + continue; } + scount = 0; dprintf("housekeeping.\n"); - // TODO: maybe we need to stop scanning here?... - - readLockEvents(); - - unsigned anzEventsAlt = mySIeventsOrderUniqueKey.size(); - dprintf("before removeoldevents\n"); - unlockEvents(); - removeOldEvents(oldEventsAre); // alte Events - dprintf("after removeoldevents\n"); - readLockEvents(); - printf("[sectionsd] Removed %d old events (%d left).\n", (int)(anzEventsAlt - mySIeventsOrderUniqueKey.size()), (int)mySIeventsOrderUniqueKey.size()); - if (mySIeventsOrderUniqueKey.size() != anzEventsAlt) - { - print_meminfo(); - dprintf("Removed %d old events.\n", (int)(anzEventsAlt - mySIeventsOrderUniqueKey.size())); - } - anzEventsAlt = mySIeventsOrderUniqueKey.size(); - unlockEvents(); readLockEvents(); - if (mySIeventsOrderUniqueKey.size() != anzEventsAlt) - { - print_meminfo(); - dprintf("Removed %d waste events.\n", (int)(anzEventsAlt - mySIeventsOrderUniqueKey.size())); - } - dprintf("Number of sptr events (event-ID): %u\n", (unsigned)mySIeventsOrderUniqueKey.size()); dprintf("Number of sptr events (service-id, start time, event-id): %u\n", (unsigned)mySIeventsOrderServiceUniqueKeyFirstStartTimeEventUniqueKey.size()); dprintf("Number of sptr events (end time, service-id, event-id): %u\n", (unsigned)mySIeventsOrderFirstEndTimeServiceIDEventUniqueKey.size()); dprintf("Number of sptr nvod events (event-ID): %u\n", (unsigned)mySIeventsNVODorderUniqueKey.size()); dprintf("Number of cached meta-services: %u\n", (unsigned)mySIeventUniqueKeysMetaOrderServiceUniqueKey.size()); - unlockEvents(); print_meminfo(); count++; - } // for endlos dprintf("housekeeping-thread ended.\n");