diff --git a/CONTRIBUTORS b/CONTRIBUTORS index eb47d58b..ce8335e8 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1109,6 +1109,7 @@ Rolf Ahrenberg for some input on how to use BER and UNC values to generate a "quality" value for fixing some crashes in subtitle display for reporting that DELETENULL() was not thread safe + for reporting a crash in subtitle display, related to cOsd::Osds Ralf Klueber for reporting a bug in cutting a recording if there is only a single editing mark diff --git a/HISTORY b/HISTORY index f1af119c..545f9086 100644 --- a/HISTORY +++ b/HISTORY @@ -6650,7 +6650,7 @@ Video Disk Recorder Revision History - Added support for "content identifier descriptor" and "default authority descriptor" to 'libsi' (thanks to Dave Pickles). -2011-08-14: Version 1.7.20 +2011-08-15: Version 1.7.20 - Added some missing 'const' to tChannelID (reported by Sundararaj Reel). - The isnumber() function now checks the given pointer for NULL (thanks to Holger @@ -6686,3 +6686,5 @@ Video Disk Recorder Revision History - The pic2mpg script of the 'pictures' plugin now generates HD images (thanks to Andre Weidemann for his support in using convert/ffmpeg). The old SD version is still available as pic2mpg-sd. +- Added a mutex to protect cOsd::Osds from simultaneous access from different threads + (reported by Rolf Ahrenberg). diff --git a/osd.c b/osd.c index e5091aee..ab24e174 100644 --- a/osd.c +++ b/osd.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: osd.c 2.22 2011/05/22 15:18:59 kls Exp $ + * $Id: osd.c 2.23 2011/08/15 09:27:39 kls Exp $ */ #include "osd.h" @@ -1600,9 +1600,11 @@ int cOsd::osdTop = 0; int cOsd::osdWidth = 0; int cOsd::osdHeight = 0; cVector cOsd::Osds; +cMutex cOsd::mutex; cOsd::cOsd(int Left, int Top, uint Level) { + cMutexLock MutexLock(&mutex); isTrueColor = false; savedBitmap = NULL; numBitmaps = 0; @@ -1624,6 +1626,7 @@ cOsd::cOsd(int Left, int Top, uint Level) cOsd::~cOsd() { + cMutexLock MutexLock(&mutex); for (int i = 0; i < numBitmaps; i++) delete bitmaps[i]; delete savedBitmap; @@ -1944,6 +1947,7 @@ cOsdProvider::~cOsdProvider() cOsd *cOsdProvider::NewOsd(int Left, int Top, uint Level) { + cMutexLock MutexLock(&cOsd::mutex); if (Level == OSD_LEVEL_DEFAULT && cOsd::IsOpen()) esyslog("ERROR: attempt to open OSD while it is already open - using dummy OSD!"); else if (osdProvider) { diff --git a/osd.h b/osd.h index b56853a3..ab10e42b 100644 --- a/osd.h +++ b/osd.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: osd.h 2.13 2011/04/17 14:24:32 kls Exp $ + * $Id: osd.h 2.14 2011/08/15 09:22:50 kls Exp $ */ #ifndef __OSD_H @@ -709,6 +709,7 @@ class cOsd { private: static int osdLeft, osdTop, osdWidth, osdHeight; static cVector Osds; + static cMutex mutex; bool isTrueColor; cBitmap *savedBitmap; cBitmap *bitmaps[MAXOSDAREAS];