summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWieland Hagen <wieland.hagen@kdab.com>2016-06-29 17:05:54 +0200
committerJohan Helsing <johan.helsing@qt.io>2016-08-18 10:33:21 +0000
commit9b7a5b428ba528dfb568af99b09e9e441f482e78 (patch)
treea8fb3e096ac8cb02ad3472388ad53b5aec6fb991
parent1bc3b0fdc8d934c1ab69a902054681896b56d672 (diff)
Fix crash on client exit
This is a backported fix from the 5.7 branch. Original patches: 93ca929fb9caf347150 and d6fe7b6165859e17f03 Change-Id: Iaec5acb314d3bbc199e962a5dc27a70f0d2df655 Reviewed-by: Giulio Camuffo <giulio.camuffo@kdab.com> Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
-rw-r--r--src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
index 9b62d082d..fdef2d3ed 100644
--- a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
+++ b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
@@ -120,8 +120,6 @@ public:
, gl_egl_image_target_texture_2d(0)
, funcs(Q_NULLPTR)
{
- destroy_listener.d = this;
- destroy_listener.listener.notify = destroy_listener_callback;
}
static void destroy_listener_callback(wl_listener *listener, void *data) {
@@ -131,6 +129,10 @@ public:
buffer_destroy_listener *destroy_listener = reinterpret_cast<buffer_destroy_listener *>(listener);
WaylandEglClientBufferIntegrationPrivate *self = destroy_listener->d;
struct ::wl_resource *buffer = static_cast<struct ::wl_resource *>(data);
+
+ wl_list_remove(&listener->link);
+ delete listener;
+
if (!self->buffers.contains(buffer))
return;
@@ -146,11 +148,18 @@ public:
self->funcs->destroy_stream(self->egl_display, state.egl_stream);
}
+ void create_destroy_listener(struct ::wl_resource *buffer) {
+ buffer_destroy_listener *newListener = new buffer_destroy_listener;
+ newListener->d = this;
+ newListener->listener.notify = destroy_listener_callback;
+
+ wl_signal_add(&buffer->destroy_signal, &newListener->listener);
+ }
+
EGLDisplay egl_display;
bool valid;
bool display_bound;
QHash<struct ::wl_resource *, BufferState> buffers;
- buffer_destroy_listener destroy_listener;
PFNEGLBINDWAYLANDDISPLAYWL egl_bind_wayland_display;
PFNEGLUNBINDWAYLANDDISPLAYWL egl_unbind_wayland_display;
@@ -260,7 +269,7 @@ void WaylandEglClientBufferIntegration::initialize(struct ::wl_resource *buffer)
if (!buffer || d->buffers.contains(buffer))
return;
- wl_signal_add(&buffer->destroy_signal, &d->destroy_listener.listener);
+ d->create_destroy_listener(buffer);
}
GLenum WaylandEglClientBufferIntegration::textureTargetForBuffer(struct ::wl_resource *buffer) const