diff --git a/dvbapi.c b/dvbapi.c index 876fe825..8392a9b5 100644 --- a/dvbapi.c +++ b/dvbapi.c @@ -7,7 +7,7 @@ * DVD support initially written by Andreas Schultz * based on dvdplayer-0.5 by Matjaz Thaler * - * $Id: dvbapi.c 1.149 2002/02/23 10:40:55 kls Exp $ + * $Id: dvbapi.c 1.150 2002/02/23 13:11:13 kls Exp $ */ //#define DVDDEBUG 1 @@ -2732,13 +2732,6 @@ void cDvbApi::Cleanup(void) PrimaryDvbApi = NULL; } -const cSchedules *cDvbApi::Schedules(cThreadLock *ThreadLock) const -{ - if (siProcessor && ThreadLock->Lock(siProcessor)) - return siProcessor->Schedules(); - return NULL; -} - bool cDvbApi::GrabImage(const char *FileName, bool Jpeg, int Quality, int SizeX, int SizeY) { int videoDev = OstOpen(DEV_VIDEO, CardIndex(), O_RDWR, true); diff --git a/dvbapi.h b/dvbapi.h index fbc1e9d9..2802ff38 100644 --- a/dvbapi.h +++ b/dvbapi.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: dvbapi.h 1.61 2002/02/03 16:43:38 kls Exp $ + * $Id: dvbapi.h 1.62 2002/02/23 13:11:07 kls Exp $ */ #ifndef __DVBAPI_H @@ -143,10 +143,6 @@ public: private: cSIProcessor *siProcessor; public: - const cSchedules *Schedules(cThreadLock *ThreadLock) const; - // Caller must provide a cThreadLock which has to survive the entire - // time the returned cSchedules is accessed. Once the cSchedules is no - // longer used, the cThreadLock must be destroyed. void SetUseTSTime(bool On) { if (siProcessor) siProcessor->SetUseTSTime(On); } // Image Grab facilities diff --git a/eit.c b/eit.c index 09c30f5e..afb1ed4f 100644 --- a/eit.c +++ b/eit.c @@ -16,7 +16,7 @@ * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * - * $Id: eit.c 1.35 2002/02/15 13:58:26 kls Exp $ + * $Id: eit.c 1.36 2002/02/23 13:53:53 kls Exp $ ***************************************************************************/ #include "eit.h" @@ -913,6 +913,13 @@ cSIProcessor::~cSIProcessor() delete fileName; } +const cSchedules *cSIProcessor::Schedules(cMutexLock &MutexLock) +{ + if (MutexLock.Lock(&schedulesMutex)) + return schedules; + return NULL; +} + void cSIProcessor::SetEpgDataFileName(const char *FileName) { epgDataFileName = NULL; diff --git a/eit.h b/eit.h index 48ab9133..16f21017 100644 --- a/eit.h +++ b/eit.h @@ -16,7 +16,7 @@ * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * - * $Id: eit.h 1.13 2002/01/13 16:18:23 kls Exp $ + * $Id: eit.h 1.14 2002/02/23 13:51:31 kls Exp $ ***************************************************************************/ #ifndef __EIT_H @@ -146,10 +146,13 @@ public: ~cSIProcessor(); static void SetEpgDataFileName(const char *FileName); static const char *GetEpgDataFileName(void); + static const cSchedules *Schedules(cMutexLock &MutexLock); + // Caller must provide a cMutexLock which has to survive the entire + // time the returned cSchedules is accessed. Once the cSchedules is no + // longer used, the cMutexLock must be destroyed. void SetStatus(bool On); bool SetUseTSTime(bool use); bool SetCurrentServiceID(unsigned short servid); - const cSchedules *Schedules(void) { return schedules; } }; #endif diff --git a/menu.c b/menu.c index 19c3ecb8..20bfac1e 100644 --- a/menu.c +++ b/menu.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 1.156 2002/02/23 09:33:04 kls Exp $ + * $Id: menu.c 1.157 2002/02/23 13:55:23 kls Exp $ */ #include "menu.h" @@ -1429,7 +1429,7 @@ cMenuScheduleItem::cMenuScheduleItem(const cEventInfo *EventInfo) class cMenuSchedule : public cOsdMenu { private: - cThreadLock threadLock; + cMutexLock mutexLock; const cSchedules *schedules; bool now, next; int otherChannel; @@ -1449,7 +1449,7 @@ cMenuSchedule::cMenuSchedule(void) cChannel *channel = Channels.GetByNumber(cDvbApi::CurrentChannel()); if (channel) { cMenuWhatsOn::SetCurrentChannel(channel->number); - schedules = cDvbApi::PrimaryDvbApi->Schedules(&threadLock); + schedules = cSIProcessor::Schedules(mutexLock); PrepareSchedule(channel); SetHelp(tr("Record"), tr("Now"), tr("Next")); } @@ -2262,8 +2262,8 @@ void cDisplayChannel::DisplayInfo(void) { if (withInfo) { const cEventInfo *Present = NULL, *Following = NULL; - cThreadLock ThreadLock; - const cSchedules *Schedules = cDvbApi::PrimaryDvbApi->Schedules(&ThreadLock); + cMutexLock MutexLock; + const cSchedules *Schedules = cSIProcessor::Schedules(MutexLock); if (Schedules) { const cSchedule *Schedule = Schedules->GetSchedule(); if (Schedule) { @@ -2445,8 +2445,8 @@ bool cRecordControl::GetEventInfo(void) time_t Time = timer->active == taActInst ? timer->StartTime() + INSTANT_REC_EPG_LOOKAHEAD : timer->StartTime() + (timer->StopTime() - timer->StartTime()) / 2; for (int seconds = 0; seconds <= MAXWAIT4EPGINFO; seconds++) { { - cThreadLock ThreadLock; - const cSchedules *Schedules = dvbApi->Schedules(&ThreadLock); + cMutexLock MutexLock; + const cSchedules *Schedules = cSIProcessor::Schedules(MutexLock); if (Schedules) { const cSchedule *Schedule = Schedules->GetSchedule(channel->pnr); if (Schedule) { diff --git a/svdrp.c b/svdrp.c index 08da0667..da816b01 100644 --- a/svdrp.c +++ b/svdrp.c @@ -10,7 +10,7 @@ * and interact with the Video Disk Recorder - or write a full featured * graphical interface that sits on top of an SVDRP connection. * - * $Id: svdrp.c 1.30 2002/02/02 15:59:18 kls Exp $ + * $Id: svdrp.c 1.31 2002/02/23 13:55:57 kls Exp $ */ #include "svdrp.h" @@ -600,8 +600,8 @@ void cSVDRP::CmdLSTC(const char *Option) void cSVDRP::CmdLSTE(const char *Option) { - cThreadLock ThreadLock; - const cSchedules *Schedules = cDvbApi::PrimaryDvbApi->Schedules(&ThreadLock); + cMutexLock MutexLock; + const cSchedules *Schedules = cSIProcessor::Schedules(MutexLock); if (Schedules) { FILE *f = fdopen(file, "w"); if (f) { diff --git a/thread.c b/thread.c index 4d7fccaf..94ba8605 100644 --- a/thread.c +++ b/thread.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: thread.c 1.17 2002/02/17 14:47:28 kls Exp $ + * $Id: thread.c 1.18 2002/02/23 13:49:06 kls Exp $ */ #include "thread.h" @@ -190,6 +190,32 @@ bool cThread::EmergencyExit(bool Request) return emergencyExitRequested = true; // yes, it's an assignment, not a comparison! } +// --- cMutexLock ------------------------------------------------------------ + +cMutexLock::cMutexLock(cMutex *Mutex) +{ + mutex = NULL; + locked = false; + Lock(Mutex); +} + +cMutexLock::~cMutexLock() +{ + if (mutex && locked) + mutex->Unlock(); +} + +bool cMutexLock::Lock(cMutex *Mutex) +{ + if (Mutex && !mutex) { + mutex = Mutex; + Mutex->Lock(); + locked = true; + return true; + } + return false; +} + // --- cThreadLock ----------------------------------------------------------- cThreadLock::cThreadLock(cThread *Thread) diff --git a/thread.h b/thread.h index 4547adde..3ac398a2 100644 --- a/thread.h +++ b/thread.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: thread.h 1.11 2001/10/27 13:22:20 kls Exp $ + * $Id: thread.h 1.12 2002/02/23 13:53:38 kls Exp $ */ #ifndef __THREAD_H @@ -69,6 +69,22 @@ public: static bool EmergencyExit(bool Request = false); }; +// cMutexLock can be used to easily set a lock on mutex and make absolutely +// sure that it will be unlocked when the block will be left. Several locks can +// be stacked, so a function that makes many calls to another function which uses +// cMutexLock may itself use a cMutexLock to make one longer lock instead of many +// short ones. + +class cMutexLock { +private: + cMutex *mutex; + bool locked; +public: + cMutexLock(cMutex *Mutex = NULL); + ~cMutexLock(); + bool Lock(cMutex *Mutex); + }; + // cThreadLock can be used to easily set a lock in a thread and make absolutely // sure that it will be unlocked when the block will be left. Several locks can // be stacked, so a function that makes many calls to another function which uses