From 0c103303921988e06996cdbf50a49b3054f73c50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20D=C3=A4nzer?= Date: Fri, 28 Jun 2024 18:55:06 +0200 Subject: [PATCH] screen-cast/stream-src: Add timelines hash table Will be used to look up a MetaDrmTimeline object for a syncobj file descriptor. v2: * Add comment above timelines hash table declaration in MetaScreenCastStreamSrcPrivate. (Bilal Elmoussaoui) Part-of: --- src/backends/meta-screen-cast-stream-src.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c index 0cc8423f9..602e191bd 100644 --- a/src/backends/meta-screen-cast-stream-src.c +++ b/src/backends/meta-screen-cast-stream-src.c @@ -117,6 +117,15 @@ typedef struct _MetaScreenCastStreamSrcPrivate gboolean uses_dma_bufs; GHashTable *dmabuf_handles; + /* Keys: File descriptors + * Values: MetaDrmTimeline object pointers + * + * Both keys and values are owned by the hash table and destroyed / + * unreferenced when a key/value pair is removed from the hash table or the + * hash table is destroyed. + */ + GHashTable *timelines; + MtkRegion *redraw_clip; GHashTable *modifiers; @@ -1728,6 +1737,7 @@ meta_screen_cast_stream_src_dispose (GObject *object) g_array_free (value, TRUE); g_clear_pointer (&priv->modifiers, g_hash_table_destroy); + g_clear_pointer (&priv->timelines, g_hash_table_destroy); g_clear_pointer (&priv->pipewire_stream, pw_stream_destroy); g_clear_pointer (&priv->dmabuf_handles, g_hash_table_destroy); g_clear_pointer (&priv->pipewire_core, pw_core_disconnect); @@ -1777,6 +1787,14 @@ meta_screen_cast_stream_src_get_property (GObject *object, } } +static void +close_fd (gpointer key) +{ + int fd = GPOINTER_TO_INT (key); + + close (fd); +} + static void meta_screen_cast_stream_src_init (MetaScreenCastStreamSrc *src) { @@ -1787,6 +1805,9 @@ meta_screen_cast_stream_src_init (MetaScreenCastStreamSrc *src) g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) cogl_dma_buf_handle_free); + priv->timelines = + g_hash_table_new_full (NULL, NULL, close_fd, g_object_unref); + priv->modifiers = g_hash_table_new (NULL, NULL); }