From 0a25184b9af19786d8d20c520f93ee0bfc65355f Mon Sep 17 00:00:00 2001 From: Andy Nichols Date: Thu, 9 Feb 2012 19:08:30 +0100 Subject: [PATCH] Remove hack that causes deadlock when waiting in eglSwapBuffers MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This hack was added to work around the problem of calling wl_display_iterate in two separate threads, but now that we are are enforceing that wl_display_iterate can only be called in one thread it now causes a deadlock when we are waiting in eglSwapBuffers for the gui thread to actually call wl_display_iterate. Change-Id: Id3153b184c191494838fc363380f7cae621ac64e Reviewed-by: Jørgen Lind --- .../wayland_egl/qwaylandglcontext.cpp | 6 --- src/plugins/platforms/wayland/qwaylanddisplay.cpp | 50 +++++++++------------- 2 files changed, 20 insertions(+), 36 deletions(-) diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp index f2671ae..e0af14a 100644 --- a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp +++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp @@ -49,7 +49,6 @@ #include #include -#include QWaylandGLContext::QWaylandGLContext(EGLDisplay eglDisplay, const QSurfaceFormat &format, QPlatformOpenGLContext *share) : QPlatformOpenGLContext() @@ -85,13 +84,8 @@ void QWaylandGLContext::doneCurrent() eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); } -// lock to sync with QWaylandDisplay event loop ( defined in qwaylanddisplay.cpp ) -extern QMutex g_waylandLock; - void QWaylandGLContext::swapBuffers(QPlatformSurface *surface) { - QMutexLocker l(&g_waylandLock); - EGLSurface eglSurface = static_cast(surface)->eglSurface(); eglSwapBuffers(m_eglDisplay, eglSurface); } diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp index b1b1d33..bf21e0b 100644 --- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp +++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp @@ -70,11 +70,6 @@ #include #include -#include - -// lock used to syncronize swap-buffers with the display-event-loop -QMutex g_waylandLock; - #include struct wl_surface *QWaylandDisplay::createSurface(void *handle) @@ -184,32 +179,27 @@ void QWaylandDisplay::flushRequests() void QWaylandDisplay::readEvents() { - if (g_waylandLock.tryLock()) - { - fd_set fds; - FD_ZERO(&fds); - FD_SET(mFd, &fds); - - fd_set nds; - FD_ZERO(&nds); - fd_set rs = fds; - fd_set ws = nds; - fd_set es = nds; - timeval timeout; - - timeout.tv_sec = 0; - timeout.tv_usec = 0; - - int ret = ::select(mFd+1, &rs, &ws, &es, &timeout ); - - if (ret <= 0) { - g_waylandLock.unlock(); - return; - } - - wl_display_iterate(mDisplay, WL_DISPLAY_READABLE); - g_waylandLock.unlock(); + fd_set fds; + FD_ZERO(&fds); + FD_SET(mFd, &fds); + + fd_set nds; + FD_ZERO(&nds); + fd_set rs = fds; + fd_set ws = nds; + fd_set es = nds; + timeval timeout; + + timeout.tv_sec = 0; + timeout.tv_usec = 0; + + int ret = ::select(mFd+1, &rs, &ws, &es, &timeout ); + + if (ret <= 0) { + return; } + + wl_display_iterate(mDisplay, WL_DISPLAY_READABLE); } void QWaylandDisplay::blockingReadEvents() -- 2.7.4