diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 491a0fd2..a280fdc5 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1241,6 +1241,7 @@ Marco Schl for fixing detecting short channel names for "Kabel Deutschland" for reporting that the FATALERRNO macro needs to check for a non-zero errno value for reporting missing mutex locks in cCiMenu::Abort() and cCiEnquiry::Abort() + for fixing a race condition in the SPU decoder Jürgen Schmitz for reporting a bug in displaying the current channel when switching via the SVDRP diff --git a/HISTORY b/HISTORY index 013b3e72..a91667ad 100644 --- a/HISTORY +++ b/HISTORY @@ -3933,3 +3933,4 @@ Video Disk Recorder Revision History commands of any length. The MAXPARSEBUFFER macros is now obsolete and has been removed. If a plugin has used that macro, it should either define a buffer size of its own, or use cReadLine when reading files. +- Fixed a race condition in the SPU decoder (thanks to Marco Schlüßler). diff --git a/dvbspu.c b/dvbspu.c index f9a1df41..9887cc05 100644 --- a/dvbspu.c +++ b/dvbspu.c @@ -8,7 +8,7 @@ * * parts of this file are derived from the OMS program. * - * $Id: dvbspu.c 1.16 2005/11/04 14:19:07 kls Exp $ + * $Id: dvbspu.c 1.17 2005/11/05 12:08:15 kls Exp $ */ #include @@ -338,6 +338,7 @@ sDvbSpuRect cDvbSpuDecoder::CalcAreaSize(sDvbSpuRect fgsize, cBitmap *fgbmp, sDv void cDvbSpuDecoder::Draw(void) { + cMutexLock MutexLock(&mutex); if (!spubmp) { Hide(); return; @@ -390,6 +391,7 @@ void cDvbSpuDecoder::Draw(void) void cDvbSpuDecoder::Hide(void) { + cMutexLock MutexLock(&mutex); delete osd; osd = NULL; } diff --git a/dvbspu.h b/dvbspu.h index 8a7d9051..e018c702 100644 --- a/dvbspu.h +++ b/dvbspu.h @@ -8,7 +8,7 @@ * * parts of this file are derived from the OMS program. * - * $Id: dvbspu.h 1.9 2005/05/07 11:14:03 kls Exp $ + * $Id: dvbspu.h 1.10 2005/11/05 12:08:47 kls Exp $ */ #ifndef __DVBSPU_H @@ -91,7 +91,8 @@ class cDvbSpuBitmap { class cDvbSpuDecoder:public cSpuDecoder { private: - cOsd * osd; + cOsd *osd; + cMutex mutex; // processing state uint8_t *spu;