eitd: Reduce sectionsd memory requirements:

* Various EPG related strings (language- and country keys, audio descriptions) come with a pretty low variance. Cache them, and use an index instead of allocating redundant strings for each and every SIevent.
* Storing content classifications in native format instead of std::string removes quite some memory overhead, too.

This saves about 250 bytes of RAM for every event cached, resulting in a considerably reduced sectionsd memory footprint.

Conflicts:
	src/eitd/xmlutil.cpp
This commit is contained in:
martii
2014-09-14 14:36:26 +02:00
committed by [CST] Focus
parent 221bb9be33
commit 0bcff8b930
6 changed files with 484 additions and 216 deletions

View File

@@ -344,8 +344,7 @@ xprintf("addEvent: ch %012" PRIx64 " running %d (%s) got_CN %d\n", evt.get_chann
already_exists = false;
if ((already_exists) && (SIlanguage::getMode() == CSectionsdClient::LANGUAGE_MODE_OFF)) {
si->second->contentClassification = evt.contentClassification;
si->second->userClassification = evt.userClassification;
si->second->classifications = evt.classifications;
#ifdef USE_ITEM_DESCRIPTION
si->second->itemDescription = evt.itemDescription;
si->second->item = evt.item;
@@ -353,11 +352,11 @@ xprintf("addEvent: ch %012" PRIx64 " running %d (%s) got_CN %d\n", evt.get_chann
//si->second->vps = evt.vps;
if ((evt.getExtendedText().length() > 0) && !evt.times.empty() &&
(evt.times.begin()->startzeit < zeit + secondsExtendedTextCache))
si->second->setExtendedText("OFF",evt.getExtendedText().c_str());
si->second->setExtendedText(0 /*"OFF"*/,evt.getExtendedText());
if (evt.getText().length() > 0)
si->second->setText("OFF",evt.getText().c_str());
si->second->setText(0 /*"OFF"*/,evt.getText());
if (evt.getName().length() > 0)
si->second->setName("OFF",evt.getName().c_str());
si->second->setName(0 /*"OFF"*/,evt.getName());
}
else {
@@ -375,7 +374,7 @@ xprintf("addEvent: ch %012" PRIx64 " running %d (%s) got_CN %d\n", evt.get_chann
//Strip ExtendedDescription if too far in the future
if ((e->times.begin()->startzeit > zeit + secondsExtendedTextCache) &&
(SIlanguage::getMode() == CSectionsdClient::LANGUAGE_MODE_OFF) && (zeit != 0))
e->setExtendedText("OFF","");
e->setExtendedText(0 /*"OFF"*/,"");
/*
* this is test code, so indentation is deliberately wrong :-)
@@ -2601,8 +2600,7 @@ bool CEitManager::getEPGid(const event_id_t epgID, const time_t startzeit, CEPGD
epgdata->info1 = evt.getText();
epgdata->info2 = evt.getExtendedText();
/* FIXME printf("itemDescription: %s\n", evt.itemDescription.c_str()); */
epgdata->contentClassification = std::string(evt.contentClassification.data(), evt.contentClassification.length());
epgdata->userClassification = std::string(evt.userClassification.data(), evt.userClassification.length());
evt.classifications.get(epgdata->contentClassification, epgdata->userClassification);
epgdata->fsk = evt.getFSK();
epgdata->table_id = evt.table_id;
@@ -2663,8 +2661,7 @@ bool CEitManager::getActualEPGServiceKey(const t_channel_id channel_id, CEPGData
epgdata->info1 = evt.getText();
epgdata->info2 = evt.getExtendedText();
/* FIXME printf("itemDescription: %s\n", evt.itemDescription.c_str());*/
epgdata->contentClassification = std::string(evt.contentClassification.data(), evt.contentClassification.length());
epgdata->userClassification = std::string(evt.userClassification.data(), evt.userClassification.length());
evt.classifications.get(epgdata->contentClassification, epgdata->userClassification);
epgdata->fsk = evt.getFSK();
epgdata->table_id = evt.table_id;
@@ -2765,7 +2762,7 @@ bool CEitManager::getComponentTagsUniqueKey(const event_id_t uniqueKey, CSection
ret = true;
for (SIcomponents::iterator cmp = eFirst->second->components.begin(); cmp != eFirst->second->components.end(); ++cmp) {
response.component = cmp->component;
response.component = cmp->getComponentName();
response.componentType = cmp->componentType;
response.componentTag = cmp->componentTag;
response.streamContent = cmp->streamContent;