summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSamuel Rødal <samuel.rodal@nokia.com>2011-03-30 13:39:09 (GMT)
committerSamuel Rødal <samuel.rodal@nokia.com>2011-03-30 13:57:45 (GMT)
commita3524950a04329b7f37f0d1107902a59f86b2c3b (patch)
treebba4bfbfad73f41fe300b272f397c2cf98c4be50 /src
parentb69d64dfe615bbbfbaf317debbab5b9933895b4a (diff)
downloadQt-a3524950a04329b7f37f0d1107902a59f86b2c3b.zip
Qt-a3524950a04329b7f37f0d1107902a59f86b2c3b.tar.gz
Qt-a3524950a04329b7f37f0d1107902a59f86b2c3b.tar.bz2
Fixed dead-locks in XCB window surface.
Move the mutex lock into the window surface instead of belonging to the QXcbShmImage, which will be destroyed and recreated in resize().
Diffstat (limited to 'src')
-rw-r--r--src/plugins/platforms/xcb/qxcbwindowsurface.cpp21
-rw-r--r--src/plugins/platforms/xcb/qxcbwindowsurface.h3
2 files changed, 11 insertions, 13 deletions
diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
index 8ab0140..c90ebb5 100644
--- a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
@@ -44,7 +44,6 @@
#include "qxcbconnection.h"
#include "qxcbscreen.h"
#include "qxcbwindow.h"
-#include "qmutex.h"
#include <xcb/shm.h>
#include <xcb/xcb_image.h>
@@ -65,9 +64,6 @@ public:
void put(xcb_window_t window, const QPoint &dst, const QRect &source);
void preparePaint(const QRegion &region);
- void lock() { m_surfaceLock.lock(); }
- void unlock() { m_surfaceLock.unlock(); }
-
private:
void destroy();
@@ -81,7 +77,6 @@ private:
xcb_window_t m_gc_window;
QRegion m_dirty;
- QMutex m_surfaceLock;
};
QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size)
@@ -114,7 +109,8 @@ void QXcbShmImage::destroy()
xcb_image_destroy(m_xcb_image);
shmdt(m_shm_info.shmaddr);
shmctl(m_shm_info.shmid, IPC_RMID, 0);
- Q_XCB_CALL(xcb_free_gc(xcb_connection(), m_gc));
+ if (m_gc)
+ Q_XCB_CALL(xcb_free_gc(xcb_connection(), m_gc));
}
void QXcbShmImage::put(xcb_window_t window, const QPoint &target, const QRect &source)
@@ -175,13 +171,13 @@ QPaintDevice *QXcbWindowSurface::paintDevice()
void QXcbWindowSurface::beginPaint(const QRegion &region)
{
- m_image->lock();
+ m_surfaceLock.lock();
m_image->preparePaint(region);
}
void QXcbWindowSurface::endPaint(const QRegion &)
{
- m_image->unlock();
+ m_surfaceLock.unlock();
}
void QXcbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
@@ -189,18 +185,18 @@ void QXcbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoi
Q_UNUSED(region);
Q_UNUSED(offset);
+ connection()->sync();
+
QXcbWindow *window = static_cast<QXcbWindow *>(widget->window()->platformWindow());
extern QWidgetData* qt_widget_data(QWidget *);
QPoint widgetOffset = qt_qwidget_data(widget)->wrect.topLeft();
- m_image->lock();
+ QMutexLocker(&m_surfaceLock);
QVector<QRect> rects = region.rects();
for (int i = 0; i < rects.size(); ++i)
m_image->put(window->window(), rects.at(i).topLeft() - widgetOffset, rects.at(i).translated(offset));
-
- m_image->unlock();
}
void QXcbWindowSurface::resize(const QSize &size)
@@ -209,8 +205,7 @@ void QXcbWindowSurface::resize(const QSize &size)
QXcbScreen *screen = static_cast<QXcbScreen *>(QPlatformScreen::platformScreenForWidget(window()));
- if (m_image)
- m_image->lock();
+ QMutexLocker(&m_surfaceLock);
delete m_image;
m_image = new QXcbShmImage(screen, size);
diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.h b/src/plugins/platforms/xcb/qxcbwindowsurface.h
index f87e122..e508fe6 100644
--- a/src/plugins/platforms/xcb/qxcbwindowsurface.h
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.h
@@ -48,6 +48,8 @@
#include "qxcbobject.h"
+#include <QMutex>
+
class QXcbShmImage;
class QXcbWindowSurface : public QXcbObject, public QWindowSurface
@@ -66,6 +68,7 @@ public:
private:
QXcbShmImage *m_image;
+ QMutex m_surfaceLock;
};
#endif