From 1a93efecf317dcded9c21d8570555914ca70f2dd Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 10 May 2023 07:34:23 -0400 Subject: [PATCH] gsk: Dispose the driver when the display is closed This was the intention, but the object data by itself does not achieve that: We do run dispose on the display when it is closed, but object data is only cleared in finalize. So listen to the ::closed signal and remove the driver ourselves. Fix up the drivers dispose implementation enough for that to actually work. --- gsk/gl/gskgldriver.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/gsk/gl/gskgldriver.c b/gsk/gl/gskgldriver.c index 1530056fcf..47734b1a9a 100644 --- a/gsk/gl/gskgldriver.c +++ b/gsk/gl/gskgldriver.c @@ -271,16 +271,12 @@ gsk_gl_driver_dispose (GObject *object) self->autorelease_framebuffers->len = 0; } - g_clear_pointer (&self->texture_pool, g_array_unref); - - g_assert (!self->textures || g_hash_table_size (self->textures) == 0); - g_assert (!self->texture_id_to_key || g_hash_table_size (self->texture_id_to_key) == 0); - g_assert (!self->key_to_texture_id|| g_hash_table_size (self->key_to_texture_id) == 0); - g_clear_object (&self->glyphs_library); g_clear_object (&self->icons_library); g_clear_object (&self->shadows_library); + g_clear_pointer (&self->texture_pool, g_array_unref); + g_clear_pointer (&self->autorelease_framebuffers, g_array_unref); g_clear_pointer (&self->key_to_texture_id, g_hash_table_unref); g_clear_pointer (&self->textures, g_hash_table_unref); @@ -474,6 +470,19 @@ gsk_gl_driver_new (GskGLCommandQueue *command_queue, return g_steal_pointer (&self); } +static void +free_driver (GskGLDriver *driver) +{ + g_object_run_dispose (G_OBJECT (driver)); + g_object_unref (driver); +} + +static void +display_closed (GdkDisplay *display) +{ + g_object_set_data (G_OBJECT (display), "GSK_GL_DRIVER", NULL); +} + /** * gsk_gl_driver_for_display: * @display: A #GdkDisplay that is known to support GL @@ -519,7 +528,8 @@ gsk_gl_driver_for_display (GdkDisplay *display, g_object_set_data_full (G_OBJECT (display), "GSK_GL_DRIVER", g_object_ref (driver), - g_object_unref); + (GDestroyNotify) free_driver); + g_signal_connect (display, "closed", G_CALLBACK (display_closed), NULL); failure: g_clear_object (&command_queue); -- 2.30.2