[mutter] kms: Add API to add a GSource that'll be invoked in the impl context



commit ca21ca67455dba3d8e4bfa18b54ebeed5bbf8cb1
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Sun Mar 10 13:40:30 2019 +0100

    kms: Add API to add a GSource that'll be invoked in the impl context
    
    The MetaKmsImpl implementation may need to add a GSource that should be
    invoked in the right context; e.g. a idle callback, timeout etc. It
    cannot just add it itself, since it's the responsibility of MetaKms to
    determine what is the impl context and what is the main context, so add
    API to MetaKms to ensure the callback is invoked correctly.
    
    It's the responsibility of the caller to eventually remove and destroy
    the GSource.
    
    https://gitlab.gnome.org/GNOME/mutter/issues/548
    https://gitlab.gnome.org/GNOME/mutter/merge_requests/525

 src/backends/native/meta-kms-private.h |  4 +++
 src/backends/native/meta-kms.c         | 48 ++++++++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+)
---
diff --git a/src/backends/native/meta-kms-private.h b/src/backends/native/meta-kms-private.h
index 8c0ce9425..a2f2a05db 100644
--- a/src/backends/native/meta-kms-private.h
+++ b/src/backends/native/meta-kms-private.h
@@ -41,6 +41,10 @@ gboolean meta_kms_run_impl_task_sync (MetaKms              *kms,
                                       gpointer              user_data,
                                       GError              **error);
 
+GSource * meta_kms_add_source_in_impl (MetaKms     *kms,
+                                       GSourceFunc  func,
+                                       gpointer     user_data);
+
 gboolean meta_kms_in_impl_task (MetaKms *kms);
 
 #define meta_assert_in_kms_impl(kms) \
diff --git a/src/backends/native/meta-kms.c b/src/backends/native/meta-kms.c
index 408b9f5a2..27b709658 100644
--- a/src/backends/native/meta-kms.c
+++ b/src/backends/native/meta-kms.c
@@ -34,6 +34,12 @@ typedef struct _MetaKmsCallbackData
   GDestroyNotify user_data_destroy;
 } MetaKmsCallbackData;
 
+typedef struct _MetaKmsSimpleImplSource
+{
+  GSource source;
+  MetaKms *kms;
+} MetaKmsSimpleImplSource;
+
 struct _MetaKms
 {
   GObject parent;
@@ -117,6 +123,48 @@ meta_kms_run_impl_task_sync (MetaKms              *kms,
   return ret;
 }
 
+static gboolean
+simple_impl_source_dispatch (GSource     *source,
+                             GSourceFunc  callback,
+                             gpointer     user_data)
+{
+  MetaKmsSimpleImplSource *simple_impl_source =
+    (MetaKmsSimpleImplSource *) source;
+  MetaKms *kms = simple_impl_source->kms;
+  gboolean ret;
+
+  kms->in_impl_task = TRUE;
+  ret = callback (user_data);
+  kms->in_impl_task = FALSE;
+
+  return ret;
+}
+
+static GSourceFuncs simple_impl_source_funcs = {
+  .dispatch = simple_impl_source_dispatch,
+};
+
+GSource *
+meta_kms_add_source_in_impl (MetaKms     *kms,
+                             GSourceFunc  func,
+                             gpointer     user_data)
+{
+  GSource *source;
+  MetaKmsSimpleImplSource *simple_impl_source;
+
+  meta_assert_in_kms_impl (kms);
+
+  source = g_source_new (&simple_impl_source_funcs,
+                         sizeof (MetaKmsSimpleImplSource));
+  simple_impl_source = (MetaKmsSimpleImplSource *) source;
+  simple_impl_source->kms = kms;
+
+  g_source_set_callback (source, func, user_data, NULL);
+  g_source_attach (source, g_main_context_get_thread_default ());
+
+  return source;
+}
+
 gboolean
 meta_kms_in_impl_task (MetaKms *kms)
 {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]