From 3033eb15a2e29abe3e30ed89a44179069e0b06a2 Mon Sep 17 00:00:00 2001 From: Jochen Dolze Date: Mon, 2 Apr 2012 18:57:21 +0200 Subject: Added execution priority to import thread, prevent housekeeping while importer thread is running --- import.cpp | 3 ++- source.cpp | 12 +++++++++--- source.h | 5 ++++- xmltv2vdr.cpp | 53 ++++++++++++++++++++++++++++++++--------------------- xmltv2vdr.h | 1 + 5 files changed, 48 insertions(+), 26 deletions(-) diff --git a/import.cpp b/import.cpp index 51d4ea9..e35eb30 100644 --- a/import.cpp +++ b/import.cpp @@ -722,7 +722,8 @@ bool cImport::PutEvent(cEPGSource *source, sqlite3 *db, cSchedule* schedule, strftime(from,sizeof(from)-1,"%b %d %H:%M",&tm); localtime_r(&end,&tm); strftime(till,sizeof(till)-1,"%b %d %H:%M",&tm); - source->Dlog("changing %s'%s'@%s-%s",xevent->EITDescription() ? "old " : "", + source->Dlog("changing %s%s'%s'@%s-%s",xevent->EITDescription() ? "old " : "", + (Option==IMPORT_SHORTTEXT) ? "shorttext " : "description ", event->Title(),from,till); } return true; diff --git a/source.cpp b/source.cpp index 587e949..1ba97d5 100644 --- a/source.cpp +++ b/source.cpp @@ -10,6 +10,7 @@ #include #include +#include "xmltv2vdr.h" #include "source.h" #include "extpipe.h" @@ -32,19 +33,24 @@ int cEPGChannel::Compare(const cListObject &ListObject) const // ------------------------------------------------------------- -cEPGExecutor::cEPGExecutor(cEPGSources *Sources) : cThread("xmltv2vdr importer") +cEPGExecutor::cEPGExecutor(cPluginXmltv2vdr *Plugin,cEPGSources *Sources) : cThread("xmltv2vdr importer") { + baseplugin=Plugin; sources=Sources; } void cEPGExecutor::Action() { if (!sources) return; + if (!baseplugin) return; for (cEPGSource *epgs=sources->First(); epgs; epgs=sources->Next(epgs)) { if (epgs->RunItNow()) { + // if timer thread is runnung, wait till it's stopped + baseplugin->Wait4TimerThread(); + int retries=0; while (retries<=2) { @@ -895,8 +901,8 @@ void cEPGSources::ReadIn(const char *ConfDir, const char *EpgFile, cEPGMappings if (!Exists(EITSOURCE)) { Add(new cEPGSource(EITSOURCE,ConfDir,EpgFile,EPGMappings,TextMappings)); - } - + } + if (!SourceOrder) return; char *buf=strdup(SourceOrder); if (!buf) return; diff --git a/source.h b/source.h index 0d1c4e8..0344830 100644 --- a/source.h +++ b/source.h @@ -180,12 +180,15 @@ public: void Remove(); }; +class cPluginXmltv2vdr; + class cEPGExecutor : public cThread { private: cEPGSources *sources; + cPluginXmltv2vdr *baseplugin; public: - cEPGExecutor(cEPGSources *Sources); + cEPGExecutor(cPluginXmltv2vdr *Plugin, cEPGSources *Sources); bool StillRunning() { return Running(); diff --git a/xmltv2vdr.cpp b/xmltv2vdr.cpp index 450a79d..1ef897a 100644 --- a/xmltv2vdr.cpp +++ b/xmltv2vdr.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include "setup.h" #include "xmltv2vdr.h" @@ -156,7 +157,7 @@ bool cEPGHandler::SetShortText(cEvent* Event, const char* UNUSED(ShortText)) // ------------------------------------------------------------- cEPGTimer::cEPGTimer(const char *EpgFile, cEPGSources *Sources, cEPGMappings *Maps, - cTEXTMappings *Texts) : cThread("xmltv2vdr timer thread") + cTEXTMappings *Texts) : cThread("xmltv2vdr timer") { epgfile=EpgFile; sources=Sources; @@ -212,7 +213,7 @@ void cEPGTimer::Action() // ------------------------------------------------------------- -cPluginXmltv2vdr::cPluginXmltv2vdr(void) : epgexecutor(&epgsources) +cPluginXmltv2vdr::cPluginXmltv2vdr(void) : epgexecutor(this, &epgsources) { // Initialize any member variables here. // DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL @@ -267,6 +268,13 @@ bool cPluginXmltv2vdr::IsIdle() return false; } +void cPluginXmltv2vdr::Wait4TimerThread() +{ + if (!epgtimer->Active()) return; + dsyslog("xmltv2vdr: wait for timer thread"); + pthread_join(epgtimer->ThreadId(),NULL); +} + bool cPluginXmltv2vdr::EPGSourceMove(int From, int To) { if (From==To) return false; @@ -390,32 +398,35 @@ void cPluginXmltv2vdr::Housekeeping(void) time_t now=time(NULL); if (now>(last_housetime_t+3600)) { - struct stat statbuf; - if (stat(epgfile,&statbuf)!=-1) + if (IsIdle()) { - if (statbuf.st_size) + struct stat statbuf; + if (stat(epgfile,&statbuf)!=-1) { - sqlite3 *db=NULL; - if (sqlite3_open_v2(epgfile,&db,SQLITE_OPEN_READWRITE,NULL)==SQLITE_OK) + if (statbuf.st_size) { - char *sql; - if (asprintf(&sql,"delete from epg where ((starttime+duration) < %li)",now)!=-1) + sqlite3 *db=NULL; + if (sqlite3_open_v2(epgfile,&db,SQLITE_OPEN_READWRITE,NULL)==SQLITE_OK) { - char *errmsg; - if (sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK) + char *sql; + if (asprintf(&sql,"delete from epg where ((starttime+duration) < %li)",now)!=-1) { - esyslog("xmltv2vdr: %s",errmsg); - sqlite3_free(errmsg); + char *errmsg; + if (sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK) + { + esyslog("xmltv2vdr: %s",errmsg); + sqlite3_free(errmsg); + } + else + { + isyslog("xmltv2vdr: removed %i old entries from db",sqlite3_changes(db)); + sqlite3_exec(db,"VACCUM;",NULL,NULL,NULL); + } + free(sql); } - else - { - isyslog("xmltv2vdr: removed %i old entries from db",sqlite3_changes(db)); - sqlite3_exec(db,"VACCUM;",NULL,NULL,NULL); - } - free(sql); } + sqlite3_close(db); } - sqlite3_close(db); } } last_housetime_t=now; @@ -429,7 +440,7 @@ void cPluginXmltv2vdr::MainThreadHook(void) time_t now=time(NULL); if (now>(last_maintime_t+60)) { - if (IsIdle()) + if (!epgexecutor.Active()) { if (epgsources.RunItNow()) epgexecutor.Start(); } diff --git a/xmltv2vdr.h b/xmltv2vdr.h index 4b8d80a..8805a16 100644 --- a/xmltv2vdr.h +++ b/xmltv2vdr.h @@ -140,6 +140,7 @@ public: { epgsources.ReadIn(confdir,epgfile,&epgmappings,&textmappings,srcorder,Reload); } + void Wait4TimerThread(); bool IsIdle(); bool EPGSourceMove(int From, int To); int EPGSourceCount() -- cgit v1.2.3