[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 14/14] libxl: ao: Timeouts are cancellable
Make libxl__ev_time* register with the cancellation machinery, so that libxl_ao_cancel can cancel any operation which has a timeout. Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> --- tools/libxl/libxl_event.c | 27 +++++++++++++++++++++++++++ tools/libxl/libxl_internal.h | 3 ++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/tools/libxl/libxl_event.c b/tools/libxl/libxl_event.c index e982858..8f85162 100644 --- a/tools/libxl/libxl_event.c +++ b/tools/libxl/libxl_event.c @@ -292,6 +292,8 @@ static int time_register_finite(libxl__gc *gc, libxl__ev_time *ev, static void time_deregister(libxl__gc *gc, libxl__ev_time *ev) { + libxl__ao_cancellable_deregister(&ev->cancel); + if (!ev->infinite) { struct timeval right_away = { 0, 0 }; if (ev->nexus) /* only set if app provided hooks */ @@ -314,6 +316,23 @@ static void time_done_debug(libxl__gc *gc, const char *func, #endif } +static void time_cancelled(libxl__egc *egc, libxl__ao_cancellable *canc, int rc) +{ + libxl__ev_time *ev = CONTAINER_OF(canc, *ev, cancel); + EGC_GC; + + time_deregister(gc, ev); + DBG("ev_time=%p cancelled", ev); + ev->func(egc, ev, &ev->abs, rc); +} + +static int time_register_cancel(libxl__ao *ao, libxl__ev_time *ev) +{ + ev->cancel.ao = ao; + ev->cancel.callback = time_cancelled; + return libxl__ao_cancellable_register(&ev->cancel); +} + int libxl__ev_time_register_abs(libxl__ao *ao, libxl__ev_time *ev, libxl__ev_time_callback *func, struct timeval absolute) @@ -326,6 +345,9 @@ int libxl__ev_time_register_abs(libxl__ao *ao, libxl__ev_time *ev, DBG("ev_time=%p register abs=%lu.%06lu", ev, (unsigned long)absolute.tv_sec, (unsigned long)absolute.tv_usec); + rc = time_register_cancel(ao, ev); + if (rc) goto out; + rc = time_register_finite(gc, ev, absolute); if (rc) goto out; @@ -333,6 +355,7 @@ int libxl__ev_time_register_abs(libxl__ao *ao, libxl__ev_time *ev, rc = 0; out: + libxl__ao_cancellable_deregister(&ev->cancel); time_done_debug(gc,__func__,ev,rc); CTX_UNLOCK; return rc; @@ -351,6 +374,9 @@ int libxl__ev_time_register_rel(libxl__ao *ao, libxl__ev_time *ev, DBG("ev_time=%p register ms=%d", ev, milliseconds); + rc = time_register_cancel(ao, ev); + if (rc) goto out; + if (milliseconds < 0) { ev->infinite = 1; } else { @@ -365,6 +391,7 @@ int libxl__ev_time_register_rel(libxl__ao *ao, libxl__ev_time *ev, rc = 0; out: + libxl__ao_cancellable_deregister(&ev->cancel); time_done_debug(gc,__func__,ev,rc); CTX_UNLOCK; return rc; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 951a77d..927f67e 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -218,6 +218,7 @@ struct libxl__ev_time { LIBXL_TAILQ_ENTRY(libxl__ev_time) entry; struct timeval abs; libxl__osevent_hook_nexus *nexus; + libxl__ao_cancellable cancel; }; typedef struct libxl__ev_xswatch libxl__ev_xswatch; @@ -790,7 +791,7 @@ _hidden int libxl__ev_time_modify_abs(libxl__gc*, libxl__ev_time *ev, struct timeval); _hidden void libxl__ev_time_deregister(libxl__gc*, libxl__ev_time *ev); static inline void libxl__ev_time_init(libxl__ev_time *ev) - { ev->func = 0; } + { ev->func = 0; libxl__ao_cancellable_init(&ev->cancel); } static inline int libxl__ev_time_isregistered(const libxl__ev_time *ev) { return !!ev->func; } -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |