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:
parent
16502a3dbc
commit
50c2ed1b9d
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user