From 8175562a7afb6abffaad2550f792a4396951d3f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Tue, 10 Nov 2015 11:35:00 +0100 Subject: [PATCH] [wayland] Fix cleanup handling on tear down ASAN righly complained: we need to delete our Wayland objects before we destroy the internal client connection. Solved by better setting parent relationships in the QPA plugin and correctly delete objects in destroy of internal client connection. --- plugins/qpa/integration.cpp | 9 +++++---- plugins/qpa/window.cpp | 8 ++++++-- wayland_server.cpp | 3 +++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/plugins/qpa/integration.cpp b/plugins/qpa/integration.cpp index abcd3e8434..9cb4482959 100644 --- a/plugins/qpa/integration.cpp +++ b/plugins/qpa/integration.cpp @@ -34,6 +34,7 @@ along with this program. If not, see . #include #include #include +#include #include #include @@ -112,8 +113,8 @@ QPlatformWindow *Integration::createPlatformWindow(QWindow *window) const return new QPlatformWindow(window); } else { // don't set window as parent, cause infinite recursion in PlasmaQuick::Dialog - auto surface = c->createSurface(); - return new Window(window, surface, s->createSurface(surface), this); + auto surface = c->createSurface(c); + return new Window(window, surface, s->createSurface(surface, surface), this); } } @@ -196,7 +197,7 @@ KWayland::Client::Compositor *Integration::compositor() const auto registry = waylandServer()->internalClientRegistry(); const auto c = registry->interface(Registry::Interface::Compositor); if (c.name != 0u) { - const_cast(this)->m_compositor = registry->createCompositor(c.name, c.version); + const_cast(this)->m_compositor = registry->createCompositor(c.name, c.version, registry); } } return m_compositor; @@ -209,7 +210,7 @@ KWayland::Client::Shell *Integration::shell() const auto registry = waylandServer()->internalClientRegistry(); const auto s = registry->interface(Registry::Interface::Shell); if (s.name != 0u) { - const_cast(this)->m_shell = registry->createShell(s.name, s.version); + const_cast(this)->m_shell = registry->createShell(s.name, s.version, registry); } } return m_shell; diff --git a/plugins/qpa/window.cpp b/plugins/qpa/window.cpp index 43a3297be2..7efc95cee2 100644 --- a/plugins/qpa/window.cpp +++ b/plugins/qpa/window.cpp @@ -43,6 +43,8 @@ Window::Window(QWindow *window, KWayland::Client::Surface *surface, KWayland::Cl , m_windowId(++s_windowId) , m_integration(integration) { + QObject::connect(m_surface, &QObject::destroyed, window, [this] { m_surface = nullptr;}); + QObject::connect(m_shellSurface, &QObject::destroyed, window, [this] { m_shellSurface = nullptr;}); waylandServer()->internalClientConection()->flush(); } @@ -103,8 +105,10 @@ void Window::unmap() if (m_shellClient) { m_shellClient->setInternalFramebufferObject(QSharedPointer()); } - m_surface->attachBuffer(KWayland::Client::Buffer::Ptr()); - m_surface->commit(KWayland::Client::Surface::CommitFlag::None); + if (m_surface) { + m_surface->attachBuffer(KWayland::Client::Buffer::Ptr()); + m_surface->commit(KWayland::Client::Surface::CommitFlag::None); + } if (waylandServer()->internalClientConection()) { waylandServer()->internalClientConection()->flush(); } diff --git a/wayland_server.cpp b/wayland_server.cpp index f44726c124..f1b59b0d5c 100644 --- a/wayland_server.cpp +++ b/wayland_server.cpp @@ -29,6 +29,7 @@ along with this program. If not, see . #include #include #include +#include #include // Server #include @@ -75,6 +76,8 @@ WaylandServer::~WaylandServer() = default; void WaylandServer::destroyInternalConnection() { if (m_internalConnection.client) { + delete m_internalConnection.registry; + delete m_internalConnection.shm; dispatch(); m_internalConnection.client->deleteLater(); m_internalConnection.clientThread->quit();