[Spice-devel] [PATCH v2 4/9] worker: improved implementation of SpiceTimer
Christophe Fergeau
cfergeau at redhat.com
Tue Jan 26 04:55:05 PST 2016
Looks good to me
Acked-by: Christophe Fergeau <cfergeau at redhat.com>
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 at redhat.com>
> ---
> 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20160126/2ea19f86/attachment-0001.sig>
More information about the Spice-devel
mailing list