summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatti Lehtimäki <matti.lehtimaki@gmail.com>2012-05-12 15:48:21 +0300
committerMatti Lehtimäki <matti.lehtimaki@gmail.com>2012-05-12 15:48:21 +0300
commit67fa657e483b171fe9d951cbb00bb550241d86c7 (patch)
treeb7372ba202920d4a8e8e6e77a612f15d5c06af95
parent6b488dcedf24cf9b4890505eba992d683eedecac (diff)
downloadvdr-plugin-epgfixer-67fa657e483b171fe9d951cbb00bb550241d86c7.tar.gz
vdr-plugin-epgfixer-67fa657e483b171fe9d951cbb00bb550241d86c7.tar.bz2
Fix event handling thread, thanks to Rolf Ahrenberg.
-rw-r--r--tools.c39
1 files changed, 27 insertions, 12 deletions
diff --git a/tools.c b/tools.c
index afc3848..4c02c8c 100644
--- a/tools.c
+++ b/tools.c
@@ -170,13 +170,14 @@ public:
class cAddEventThread : public cThread
{
private:
- time_t LastHandleEvent;
+ cTimeMs LastHandleEvent;
cList<cAddEventListItem> *list;
+ enum { INSERT_TIMEOUT_IN_MS = 10000 };
protected:
virtual void Action(void);
public:
cAddEventThread(void);
- ~cAddEventThread(void) { list->cList::Clear(); }
+ ~cAddEventThread(void);
void AddEvent(cEvent *Event, tChannelID ChannelID);
};
@@ -185,33 +186,47 @@ cAddEventThread::cAddEventThread(void)
{
LastHandleEvent = time(NULL);
list = new cList<cAddEventListItem>;
- SetPriority(19);
+}
+
+cAddEventThread::~cAddEventThread(void)
+{
+ LOCK_THREAD;
+ list->cList::Clear();
+ Cancel(3);
}
void cAddEventThread::Action(void)
{
- if (Running()) {
+ SetPriority(19);
+ cList<cAddEventListItem> *tmplist = new cList<cAddEventListItem>;
+ while (Running() && !LastHandleEvent.TimedOut()) {
+ Lock();
cAddEventListItem *e = list->First();
while (e) {
- cAddEventListItem *d = NULL;
+ tmplist->Add(new cAddEventListItem(e->GetEvent(), e->GetChannelID()));
+ list->Del(e);
+ e = list->First();
+ }
+ Unlock();
+ e = tmplist->First();
+ while (e) {
cSchedulesLock SchedulesLock(true, 10);
cSchedules *schedules = (cSchedules *)cSchedules::Schedules(SchedulesLock);
if (schedules) {
((cSchedule *)schedules->GetSchedule(Channels.GetByChannelID(e->GetChannelID()), true))->AddEvent(e->GetEvent());
- d = e;
+ tmplist->Del(e);
}
- e = list->Next(e);
- if (d)
- list->Del(d);
+ e = tmplist->First();
}
- if (time(NULL) - LastHandleEvent > 10)
- Cancel();
+ cCondWait::SleepMs(10);
}
+ delete tmplist;
}
void cAddEventThread::AddEvent(cEvent *Event, tChannelID ChannelID)
{
- LastHandleEvent = time(NULL);
+ LOCK_THREAD;
+ LastHandleEvent.Set(INSERT_TIMEOUT_IN_MS);
list->Add(new cAddEventListItem(Event, ChannelID));
}