[Spice-commits] server/event-loop.c

Frediano Ziglio fziglio at kemper.freedesktop.org
Wed Feb 3 13:27:47 UTC 2016


 server/event-loop.c |   59 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 59 insertions(+)

New commits:
commit 7a11b960955f95ccf8357d67f63de1ccc27bc01d
Author: Frediano Ziglio <fziglio at redhat.com>
Date:   Wed Feb 3 13:25:47 2016 +0000

    compatibility patch for event loop
    
    This patch use old code to implement timer events.
    The new version use some function from GLib 2.34 however some systems
    (like RHEL 6) have former GLib version (RHEL 6 has GLib 2.28 installed)
    
    Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
    Acked-by: Christophe Fergeau <cfergeau at redhat.com>

diff --git a/server/event-loop.c b/server/event-loop.c
index 6e08d78..9eae913 100644
--- a/server/event-loop.c
+++ b/server/event-loop.c
@@ -24,6 +24,7 @@
 
 #include "red-common.h"
 
+#if GLIB_CHECK_VERSION(2, 34, 0)
 struct SpiceTimer {
     GSource source;
 };
@@ -72,6 +73,64 @@ static void timer_remove(SpiceTimer *timer)
     g_source_destroy(&timer->source);
     g_source_unref(&timer->source);
 }
+#else
+struct SpiceTimer {
+    GMainContext *context;
+    SpiceTimerFunc func;
+    void *opaque;
+    GSource *source;
+};
+
+static SpiceTimer* timer_add(const SpiceCoreInterfaceInternal *iface,
+                             SpiceTimerFunc func, void *opaque)
+{
+    SpiceTimer *timer = spice_malloc0(sizeof(SpiceTimer));
+
+    timer->context = iface->main_context;
+    timer->func = func;
+    timer->opaque = opaque;
+
+    return timer;
+}
+
+static gboolean timer_func(gpointer user_data)
+{
+    SpiceTimer *timer = user_data;
+
+    timer->func(timer->opaque);
+    /* timer might be free after func(), don't touch */
+
+    return FALSE;
+}
+
+static void timer_cancel(SpiceTimer *timer)
+{
+    if (timer->source) {
+        g_source_destroy(timer->source);
+        g_source_unref(timer->source);
+        timer->source = NULL;
+    }
+}
+
+static void timer_start(SpiceTimer *timer, uint32_t ms)
+{
+    timer_cancel(timer);
+
+    timer->source = g_timeout_source_new(ms);
+    spice_assert(timer->source != NULL);
+
+    g_source_set_callback(timer->source, timer_func, timer, NULL);
+
+    g_source_attach(timer->source, timer->context);
+}
+
+static void timer_remove(SpiceTimer *timer)
+{
+    timer_cancel(timer);
+    spice_assert(timer->source == NULL);
+    free(timer);
+}
+#endif
 
 struct SpiceWatch {
     GMainContext *context;


More information about the Spice-commits mailing list