gsk: Dispose the driver when the display is closed
authorMatthias Clasen <mclasen@redhat.com>
Wed, 10 May 2023 11:34:23 +0000 (07:34 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 11 May 2023 00:21:12 +0000 (20:21 -0400)
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

index 1530056fcf0630693691acb5176085ff8d9259ee..47734b1a9adce60a8c7cca3a35b08b46bc31c968 100644 (file)
@@ -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);