Looks good to me Acked-by: Christophe Fergeau <cfergeau@xxxxxxxxxx> Christophe On Tue, Jan 26, 2016 at 09:44:31AM +0000, Frediano Ziglio wrote: > Use a custom GSource. > This to avoid having to allocate a timer all the time we add one. > > Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> > --- > server/event-loop.c | 56 +++++++++++++++++++++++------------------------------ > 1 file changed, 24 insertions(+), 32 deletions(-) > > 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 { > -- > 2.4.3 > > _______________________________________________ > Spice-devel mailing list > Spice-devel@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/spice-devel
Attachment:
signature.asc
Description: PGP signature
_______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel