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

View File

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