Related: tdf#158807 mutex must be locked when disposing a VirtualDevice
If the following .ppt document is opened in a debug build
and the document is left open for a minute or two without
changing any content, this destructor will be called on a
non-main thread with the mutex unlocked:
https://bugs.documentfoundation.org/attachment.cgi?id=46801
This hits an assert in VirtualDevice::ReleaseGraphics() so
explicitly lock the mutex and explicitly dispose and clear
the VirtualDevice instances variables.
Change-Id: I5d371a4e99fca4aae2b6edc8b53eca10cb143aef
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161243
Tested-by: Jenkins
Reviewed-by: Patrick Luby <plubius@libreoffice.org>
diff --git a/drawinglayer/source/primitive2d/graphicprimitivehelper2d.cxx b/drawinglayer/source/primitive2d/graphicprimitivehelper2d.cxx
index 7562459..cdda7d6 100644
--- a/drawinglayer/source/primitive2d/graphicprimitivehelper2d.cxx
+++ b/drawinglayer/source/primitive2d/graphicprimitivehelper2d.cxx
@@ -358,6 +358,7 @@ namespace drawinglayer::primitive2d
AnimatedGraphicPrimitive2D(
const Graphic& rGraphic,
basegfx::B2DHomMatrix aTransform);
virtual ~AnimatedGraphicPrimitive2D();
/// data read access
const basegfx::B2DHomMatrix& getTransform() const { return maTransform; }
@@ -421,6 +422,23 @@ namespace drawinglayer::primitive2d
}
}
AnimatedGraphicPrimitive2D::~AnimatedGraphicPrimitive2D()
{
// Related: tdf#158807 mutex must be locked when disposing a VirtualDevice
// If the following .ppt document is opened in a debug build
// and the document is left open for a minute or two without
// changing any content, this destructor will be called on a
// non-main thread with the mutex unlocked:
// https://bugs.documentfoundation.org/attachment.cgi?id=46801
// This hits an assert in VirtualDevice::ReleaseGraphics() so
// explicitly lock the mutex and explicitly dispose and clear
// the VirtualDevice instances variables.
const SolarMutexGuard aSolarGuard;
maVirtualDevice.disposeAndClear();
maVirtualDeviceMask.disposeAndClear();
}
bool AnimatedGraphicPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
{
// do not use 'GroupPrimitive2D::operator==' here, that would compare