Fix race condition on mFrameCallback

Don't try to destroy the callback from two different threads. This
caused a crash with brcm-egl.

Change-Id: Idcb18fca9ed7f84902b88212c0cebd67932a59d3
Reviewed-by: Johan Helsing <johan.helsing@qt.io>
This commit is contained in:
Paul Olav Tvete 2016-10-04 16:45:15 +02:00
parent 16502a3dbc
commit 50c2ed1b9d
2 changed files with 8 additions and 9 deletions

View File

@ -83,7 +83,7 @@ QWaylandWindow::QWaylandWindow(QWindow *window)
, mMousePressedInContentArea(Qt::NoButton)
, m_cursor(Qt::ArrowCursor)
, mWaitingForFrameSync(false)
, mFrameCallback(0)
, mFrameCallback(nullptr)
, mRequestResizeSent(false)
, mCanResize(true)
, mResizeDirty(false)
@ -453,14 +453,12 @@ void QWaylandWindow::requestResize()
void QWaylandWindow::attach(QWaylandBuffer *buffer, int x, int y)
{
if (mFrameCallback) {
wl_callback_destroy(mFrameCallback);
mFrameCallback = 0;
}
mFrameCallback = nullptr;
if (buffer) {
mFrameCallback = frame();
wl_callback_add_listener(mFrameCallback, &QWaylandWindow::callbackListener, this);
auto callback = frame();
wl_callback_add_listener(callback, &QWaylandWindow::callbackListener, this);
mFrameCallback = callback;
mWaitingForFrameSync = true;
attach(buffer->buffer(), x, y);
@ -491,7 +489,7 @@ void QWaylandWindow::frameCallback(void *data, struct wl_callback *callback, uin
self->mWaitingForFrameSync = false;
wl_callback_destroy(callback);
self->mFrameCallback = 0;
self->mFrameCallback.testAndSetRelaxed(callback, nullptr);
if (self->mUpdateRequested) {
QWindowPrivate *w = QWindowPrivate::get(self->window());
self->mUpdateRequested = false;

View File

@ -53,6 +53,7 @@
#include <QtCore/QWaitCondition>
#include <QtCore/QMutex>
#include <QtCore/QAtomicPointer>
#include <QtGui/QIcon>
#include <QtCore/QVariant>
@ -220,7 +221,7 @@ protected:
WId mWindowId;
bool mWaitingForFrameSync;
struct wl_callback *mFrameCallback;
QAtomicPointer<struct wl_callback> mFrameCallback;
QWaitCondition mFrameSyncWait;
QMutex mResizeLock;