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

Frediano Ziglio fziglio at kemper.freedesktop.org
Tue Jan 26 05:14:47 PST 2016


 server/event-loop.c |   56 ++++++++++++++++++++++------------------------------
 1 file changed, 24 insertions(+), 32 deletions(-)

New commits:
commit 28e33ccdf037b6c3ad3edecdbea6c11e327660fb
Author: Frediano Ziglio <fziglio at redhat.com>
Date:   Mon Jan 25 12:55:22 2016 +0000

    worker: improved implementation of SpiceTimer
    
    Use a custom GSource.
    This to avoid having to allocate a timer all the time we add one.
    
    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 4738ed9..6e08d78 100644
--- a/server/event-loop.c
+++ b/server/event-loop.c
@@ -25,60 +25,52 @@
 #include "red-common.h"
 
 struct SpiceTimer {
-    GMainContext *context;
-    SpiceTimerFunc func;
-    void *opaque;
-    GSource *source;
+    GSource source;
 };
 
-static SpiceTimer* timer_add(const SpiceCoreInterfaceInternal *iface,
-                             SpiceTimerFunc func, void *opaque)
+static gboolean
+spice_timer_dispatch(GSource     *source,
+                     GSourceFunc  callback,
+                     gpointer     user_data)
 {
-    SpiceTimer *timer = spice_malloc0(sizeof(SpiceTimer));
+    SpiceTimerFunc func = (SpiceTimerFunc) callback;
 
-    timer->context = iface->main_context;
-    timer->func = func;
-    timer->opaque = opaque;
+    func(user_data);
+    /* timer might be free after func(), don't touch */
 
-    return timer;
+    return FALSE;
 }
 
-static gboolean timer_func(gpointer user_data)
+static GSourceFuncs spice_timer_funcs = {
+    .dispatch = spice_timer_dispatch,
+};
+
+static SpiceTimer* timer_add(const SpiceCoreInterfaceInternal *iface,
+                             SpiceTimerFunc func, void *opaque)
 {
-    SpiceTimer *timer = user_data;
+    SpiceTimer *timer = (SpiceTimer *) g_source_new(&spice_timer_funcs, sizeof(SpiceTimer));
 
-    timer->func(timer->opaque);
-    /* timer might be free after func(), don't touch */
+    g_source_set_callback(&timer->source, (GSourceFunc) func, opaque, NULL);
 
-    return FALSE;
+    g_source_attach(&timer->source, iface->main_context);
+
+    return timer;
 }
 
 static void timer_cancel(SpiceTimer *timer)
 {
-    if (timer->source) {
-        g_source_destroy(timer->source);
-        g_source_unref(timer->source);
-        timer->source = NULL;
-    }
+    g_source_set_ready_time(&timer->source, -1);
 }
 
 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);
+    g_source_set_ready_time(&timer->source, g_get_monotonic_time() + ms * 1000u);
 }
 
 static void timer_remove(SpiceTimer *timer)
 {
-    timer_cancel(timer);
-    spice_assert(timer->source == NULL);
-    free(timer);
+    g_source_destroy(&timer->source);
+    g_source_unref(&timer->source);
 }
 
 struct SpiceWatch {


More information about the Spice-commits mailing list