[kwin/aurorae] Add mutex locker around access to the render buffer

We were facing crashes when the buffer image was being read from and
written to at the same time.
remotes/origin/Plasma/5.0
Martin Gräßlin 13 years ago
parent 73e0a6586c
commit 719923d410
  1. 4
      clients/aurorae/src/aurorae.cpp
  2. 2
      clients/aurorae/src/aurorae.h

@ -21,6 +21,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <QApplication>
#include <QDebug>
#include <QMutex>
#include <QOpenGLFramebufferObject>
#include <QPainter>
#include <QQmlComponent>
@ -235,6 +236,7 @@ AuroraeClient::AuroraeClient(KDecorationBridge *bridge, KDecorationFactory *fact
: KDecoration(bridge, factory)
, m_view(NULL)
, m_item(AuroraeFactory::instance()->createQmlDecoration(this))
, m_mutex(new QMutex(QMutex::Recursive))
{
connect(AuroraeFactory::instance(), SIGNAL(buttonsChanged()), SIGNAL(buttonsChanged()));
connect(AuroraeFactory::instance(), SIGNAL(configChanged()), SIGNAL(configChanged()));
@ -271,6 +273,7 @@ void AuroraeClient::init()
m_view->setRenderTarget(m_fbo.data());
});
connect(m_view, &QQuickWindow::afterRendering, [this]{
QMutexLocker locker(m_mutex.data());
m_buffer = m_fbo->toImage();
});
connect(m_view, &QQuickWindow::afterRendering, this,
@ -551,6 +554,7 @@ bool AuroraeClient::animationsSupported() const
void AuroraeClient::render(QPaintDevice *device, const QRegion &sourceRegion)
{
QMutexLocker locker(m_mutex.data());
QPainter painter(device);
painter.setClipRegion(sourceRegion);
painter.drawImage(QPoint(0, 0), m_buffer);

@ -23,6 +23,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <kdecoration.h>
#include <kdecorationfactory.h>
class QMutex;
class QOpenGLFramebufferObject;
class QQmlComponent;
class QQmlEngine;
@ -160,6 +161,7 @@ private:
QScopedPointer<QQuickItem> m_item;
QScopedPointer<QOpenGLFramebufferObject> m_fbo;
QImage m_buffer;
QScopedPointer<QMutex> m_mutex;
};
}

Loading…
Cancel
Save