diff options
author | Wieland Hagen <wieland.hagen@kdab.com> | 2016-06-29 17:05:54 +0200 |
---|---|---|
committer | Johan Helsing <johan.helsing@qt.io> | 2016-08-18 10:33:21 +0000 |
commit | 9b7a5b428ba528dfb568af99b09e9e441f482e78 (patch) | |
tree | a8fb3e096ac8cb02ad3472388ad53b5aec6fb991 | |
parent | 1bc3b0fdc8d934c1ab69a902054681896b56d672 (diff) | |
download | qtwayland-9b7a5b428ba528dfb568af99b09e9e441f482e78.tar.gz |
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.cpp | 17 |
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 9b62d082..fdef2d3e 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 |