diff --git a/mythtv/libs/libmythbase/mythversion.h b/mythtv/libs/libmythbase/mythversion.h index 6d2c47c1177..3d3bd0550c5 100644 --- a/mythtv/libs/libmythbase/mythversion.h +++ b/mythtv/libs/libmythbase/mythversion.h @@ -12,7 +12,7 @@ /// Update this whenever the plug-in API changes. /// Including changes in the libmythbase, libmyth, libmythtv, libmythav* and /// libmythui class methods used by plug-ins. -#define MYTH_BINARY_VERSION "0.26.20120719-1" +#define MYTH_BINARY_VERSION "0.26.20120721-1" /** \brief Increment this whenever the MythTV network protocol changes. * diff --git a/mythtv/libs/libmythui/mythpainter.cpp b/mythtv/libs/libmythui/mythpainter.cpp index 4b5017c3a64..82d5e0516ee 100644 --- a/mythtv/libs/libmythui/mythpainter.cpp +++ b/mythtv/libs/libmythui/mythpainter.cpp @@ -21,20 +21,23 @@ MythPainter::MythPainter() SetMaximumCacheSizes(96, 96); } -MythPainter::~MythPainter(void) +void MythPainter::Teardown(void) { - QMutexLocker locker(&m_allocationLock); - ExpireImages(0); - if (m_allocatedImages.isEmpty()) - return; + QMutexLocker locker(&m_allocationLock); - LOG(VB_GENERAL, LOG_WARNING, - QString("MythPainter: %1 images not yet de-allocated.") + if (!m_allocatedImages.isEmpty()) + { + LOG(VB_GENERAL, LOG_WARNING, + QString("MythPainter: %1 images not yet de-allocated.") .arg(m_allocatedImages.size())); - while (!m_allocatedImages.isEmpty()) - m_allocatedImages.takeLast()->SetParent(NULL); + } + + QSet::iterator it = m_allocatedImages.begin(); + for (; it != m_allocatedImages.end(); ++it) + (*it)->SetParent(NULL); + m_allocatedImages.clear(); } void MythPainter::SetClipRect(const QRect &) @@ -506,34 +509,29 @@ MythImage* MythPainter::GetImageFromRect(const QRect &area, int radius, return im; } -MythImage *MythPainter::GetFormatImage() +MythImage *MythPainter::GetFormatImage(void) { - m_allocationLock.lock(); + QMutexLocker locker(&m_allocationLock); MythImage *result = GetFormatImagePriv(); result->SetFileName("GetFormatImage"); - m_allocatedImages.append(result); - m_allocationLock.unlock(); + m_allocatedImages.insert(result); return result; } void MythPainter::DeleteFormatImage(MythImage *im) { - m_allocationLock.lock(); + QMutexLocker locker(&m_allocationLock); DeleteFormatImagePriv(im); - - while (m_allocatedImages.contains(im)) - m_allocatedImages.removeOne(im); - m_allocationLock.unlock(); + m_allocatedImages.remove(im); } void MythPainter::CheckFormatImage(MythImage *im) { if (im && !im->GetParent()) { - m_allocationLock.lock(); - m_allocatedImages.append(im); + QMutexLocker locker(&m_allocationLock); + m_allocatedImages.insert(im); im->SetParent(this); - m_allocationLock.unlock(); } } diff --git a/mythtv/libs/libmythui/mythpainter.h b/mythtv/libs/libmythui/mythpainter.h index 3d6d5ca415a..e079930e934 100644 --- a/mythtv/libs/libmythui/mythpainter.h +++ b/mythtv/libs/libmythui/mythpainter.h @@ -7,6 +7,7 @@ #include #include #include +#include class QRect; class QRegion; @@ -29,7 +30,14 @@ class MUI_PUBLIC MythPainter { public: MythPainter(); - virtual ~MythPainter(); + /** MythPainter destructor. + * + * The MythPainter destructor does not cleanup, it is unsafe + * to do cleanup in the MythPainter destructor because + * DeleteImagePriv() is a pure virtual in this class. Instead + * children should call MythPainter::Teardown() for cleanup. + */ + virtual ~MythPainter() {} virtual QString GetName(void) = 0; virtual bool SupportsAnimation(void) = 0; @@ -108,6 +116,10 @@ class MUI_PUBLIC MythPainter virtual void DeleteFormatImagePriv(MythImage *im) = 0; void ExpireImages(int64_t max = 0); + // This needs to be called by classes inheriting from MythPainter + // in the destructor. + virtual void Teardown(void); + void CheckFormatImage(MythImage *im); QPaintDevice *m_Parent; @@ -118,8 +130,8 @@ class MUI_PUBLIC MythPainter int64_t m_SoftwareCacheSize; int64_t m_MaxSoftwareCacheSize; - QList m_allocatedImages; - QMutex m_allocationLock; + QMutex m_allocationLock; + QSet m_allocatedImages; QMap m_StringToImageMap; std::list m_StringExpireList; diff --git a/mythtv/libs/libmythui/mythpainter_d3d9.cpp b/mythtv/libs/libmythui/mythpainter_d3d9.cpp index f5004913dc0..1af50df8e82 100644 --- a/mythtv/libs/libmythui/mythpainter_d3d9.cpp +++ b/mythtv/libs/libmythui/mythpainter_d3d9.cpp @@ -46,7 +46,7 @@ bool MythD3D9Painter::InitD3D9(QPaintDevice *parent) void MythD3D9Painter::Teardown(void) { - ExpireImages(); + MythPainter::Teardown(); ClearCache(); DeleteBitmaps(); diff --git a/mythtv/libs/libmythui/mythpainter_d3d9.h b/mythtv/libs/libmythui/mythpainter_d3d9.h index e5cb4ea5378..a20a084e62c 100644 --- a/mythtv/libs/libmythui/mythpainter_d3d9.h +++ b/mythtv/libs/libmythui/mythpainter_d3d9.h @@ -34,8 +34,9 @@ class MUI_PUBLIC MythD3D9Painter : public MythPainter protected: virtual MythImage* GetFormatImagePriv(void) { return new MythImage(this); } virtual void DeleteFormatImagePriv(MythImage *im); + virtual void Teardown(void); + bool InitD3D9(QPaintDevice *parent); - void Teardown(void); void ClearCache(void); void DeleteBitmaps(void); D3D9Image* GetImageFromCache(MythImage *im); diff --git a/mythtv/libs/libmythui/mythpainter_ogl.cpp b/mythtv/libs/libmythui/mythpainter_ogl.cpp index adc71aa05d4..b146428b099 100644 --- a/mythtv/libs/libmythui/mythpainter_ogl.cpp +++ b/mythtv/libs/libmythui/mythpainter_ogl.cpp @@ -31,7 +31,7 @@ MythOpenGLPainter::MythOpenGLPainter(MythRenderOpenGL *render, MythOpenGLPainter::~MythOpenGLPainter() { - ExpireImages(0); + Teardown(); FreeResources(); } diff --git a/mythtv/libs/libmythui/mythpainter_qimage.cpp b/mythtv/libs/libmythui/mythpainter_qimage.cpp index 9ee77515046..ff2181876a1 100644 --- a/mythtv/libs/libmythui/mythpainter_qimage.cpp +++ b/mythtv/libs/libmythui/mythpainter_qimage.cpp @@ -17,7 +17,7 @@ MythQImagePainter::MythQImagePainter() : MythQImagePainter::~MythQImagePainter() { - ExpireImages(); + Teardown(); } void MythQImagePainter::Begin(QPaintDevice *parent) diff --git a/mythtv/libs/libmythui/mythpainter_qt.cpp b/mythtv/libs/libmythui/mythpainter_qt.cpp index 24d83fcda06..03ad17fb584 100644 --- a/mythtv/libs/libmythui/mythpainter_qt.cpp +++ b/mythtv/libs/libmythui/mythpainter_qt.cpp @@ -61,6 +61,7 @@ MythQtPainter::MythQtPainter() : MythQtPainter::~MythQtPainter() { + Teardown(); DeletePixmaps(); } diff --git a/mythtv/libs/libmythui/mythpainter_vdpau.cpp b/mythtv/libs/libmythui/mythpainter_vdpau.cpp index 899cda02fc3..012d99966ce 100644 --- a/mythtv/libs/libmythui/mythpainter_vdpau.cpp +++ b/mythtv/libs/libmythui/mythpainter_vdpau.cpp @@ -52,7 +52,8 @@ bool MythVDPAUPainter::InitVDPAU(QPaintDevice *parent) void MythVDPAUPainter::Teardown(void) { - ExpireImages(); + MythPainter::Teardown(); + FreeResources(); m_ImageBitmapMap.clear(); diff --git a/mythtv/libs/libmythui/mythpainter_vdpau.h b/mythtv/libs/libmythui/mythpainter_vdpau.h index 0c147d94779..7e8ed2e1a27 100644 --- a/mythtv/libs/libmythui/mythpainter_vdpau.h +++ b/mythtv/libs/libmythui/mythpainter_vdpau.h @@ -33,9 +33,9 @@ class MUI_PUBLIC MythVDPAUPainter : public MythPainter protected: virtual MythImage* GetFormatImagePriv(void) { return new MythImage(this); } virtual void DeleteFormatImagePriv(MythImage *im); + virtual void Teardown(void); bool InitVDPAU(QPaintDevice *parent); - void Teardown(void); void ClearCache(void); void DeleteBitmaps(void); uint GetTextureFromCache(MythImage *im); diff --git a/mythtv/libs/libmythui/mythpainter_yuva.cpp b/mythtv/libs/libmythui/mythpainter_yuva.cpp index 10097918225..db752734e3a 100644 --- a/mythtv/libs/libmythui/mythpainter_yuva.cpp +++ b/mythtv/libs/libmythui/mythpainter_yuva.cpp @@ -11,6 +11,7 @@ QColor inline rgb_to_yuv(const QColor &original); MythYUVAPainter::~MythYUVAPainter() { + Teardown(); foreach(MythFontProperties* font, m_convertedFonts) delete font; }