[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 07/35] libxl: devstate: Use libxl__xswait*
Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- v3: Initialise ds->w.ao --- tools/libxl/libxl_device.c | 4 +-- tools/libxl/libxl_event.c | 79 +++++++++++++++++++----------------------- tools/libxl/libxl_internal.h | 11 +++--- 3 files changed, 41 insertions(+), 53 deletions(-) diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c index 8352cfb..951d125 100644 --- a/tools/libxl/libxl_device.c +++ b/tools/libxl/libxl_device.c @@ -758,7 +758,7 @@ void libxl__wait_device_connection(libxl__egc *egc, libxl__ao_device *aodev) return; } - rc = libxl__ev_devstate_wait(gc, &aodev->backend_ds, + rc = libxl__ev_devstate_wait(ao, &aodev->backend_ds, device_backend_callback, state_path, XenbusStateInitWait, LIBXL_INIT_TIMEOUT * 1000); @@ -859,7 +859,7 @@ void libxl__initiate_device_remove(libxl__egc *egc, if (rc < 0) goto out; } - rc = libxl__ev_devstate_wait(gc, &aodev->backend_ds, + rc = libxl__ev_devstate_wait(ao, &aodev->backend_ds, device_backend_callback, state_path, XenbusStateClosed, LIBXL_DESTROY_TIMEOUT * 1000); diff --git a/tools/libxl/libxl_event.c b/tools/libxl/libxl_event.c index 9ff4e78..3b45148 100644 --- a/tools/libxl/libxl_event.c +++ b/tools/libxl/libxl_event.c @@ -816,68 +816,59 @@ void libxl__ev_evtchn_cancel(libxl__gc *gc, libxl__ev_evtchn *evev) * waiting for device state */ -static void devstate_watch_callback(libxl__egc *egc, libxl__ev_xswatch *watch, - const char *watch_path, const char *event_path) +static void devstate_callback(libxl__egc *egc, libxl__xswait_state *xsw, + int rc, const char *sstate) { EGC_GC; - libxl__ev_devstate *ds = CONTAINER_OF(watch, *ds, watch); - int rc; + libxl__ev_devstate *ds = CONTAINER_OF(xsw, *ds, w); - char *sstate = libxl__xs_read(gc, XBT_NULL, watch_path); + if (rc) { + if (rc == ERROR_TIMEDOUT) + LIBXL__LOG(CTX, LIBXL__LOG_DEBUG, "backend %s wanted state %d " + " timed out", ds->w.path, ds->wanted); + goto out; + } if (!sstate) { - if (errno == ENOENT) { - LIBXL__LOG(CTX, LIBXL__LOG_DEBUG, "backend %s wanted state %d" - " but it was removed", watch_path, ds->wanted); - rc = ERROR_INVAL; - } else { - LIBXL__LOG_ERRNO(CTX, LIBXL__LOG_ERROR, "backend %s wanted state" - " %d but read failed", watch_path, ds->wanted); - rc = ERROR_FAIL; - } + LIBXL__LOG(CTX, LIBXL__LOG_DEBUG, "backend %s wanted state %d" + " but it was removed", ds->w.path, ds->wanted); + rc = ERROR_INVAL; + goto out; + } + + int got = atoi(sstate); + if (got == ds->wanted) { + LIBXL__LOG(CTX, LIBXL__LOG_DEBUG, "backend %s wanted state %d ok", + ds->w.path, ds->wanted); + rc = 0; } else { - int got = atoi(sstate); - if (got == ds->wanted) { - LIBXL__LOG(CTX, LIBXL__LOG_DEBUG, "backend %s wanted state %d ok", - watch_path, ds->wanted); - rc = 0; - } else { - LIBXL__LOG(CTX, LIBXL__LOG_DEBUG, "backend %s wanted state %d" - " still waiting state %d", watch_path, ds->wanted, got); - return; - } + LIBXL__LOG(CTX, LIBXL__LOG_DEBUG, "backend %s wanted state %d" + " still waiting state %d", ds->w.path, ds->wanted, got); + return; } - libxl__ev_devstate_cancel(gc, ds); - ds->callback(egc, ds, rc); -} -static void devstate_timeout(libxl__egc *egc, libxl__ev_time *ev, - const struct timeval *requested_abs) -{ - EGC_GC; - libxl__ev_devstate *ds = CONTAINER_OF(ev, *ds, timeout); - LIBXL__LOG(CTX, LIBXL__LOG_DEBUG, "backend %s wanted state %d " - " timed out", ds->watch.path, ds->wanted); + out: libxl__ev_devstate_cancel(gc, ds); - ds->callback(egc, ds, ERROR_TIMEDOUT); + ds->callback(egc, ds, rc); } -int libxl__ev_devstate_wait(libxl__gc *gc, libxl__ev_devstate *ds, +int libxl__ev_devstate_wait(libxl__ao *ao, libxl__ev_devstate *ds, libxl__ev_devstate_callback cb, const char *state_path, int state, int milliseconds) { + AO_GC; int rc; - libxl__ev_time_init(&ds->timeout); - libxl__ev_xswatch_init(&ds->watch); + libxl__xswait_init(&ds->w); ds->wanted = state; ds->callback = cb; - rc = libxl__ev_time_register_rel(gc, &ds->timeout, devstate_timeout, - milliseconds); - if (rc) goto out; - - rc = libxl__ev_xswatch_register(gc, &ds->watch, devstate_watch_callback, - state_path); + ds->w.ao = ao; + ds->w.what = GCSPRINTF("backend %s (hoping for state change to %d)", + state_path, state); + ds->w.path = state_path; + ds->w.timeout_ms = milliseconds; + ds->w.callback = devstate_callback; + rc = libxl__xswait_start(gc, &ds->w); if (rc) goto out; return 0; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 62c04c2..b49b10b 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1189,24 +1189,21 @@ struct libxl__ev_devstate { libxl__ev_devstate_callback *callback; /* as for the remainder, read-only public parts may also be * read by the caller (notably, watch.path), but only when waiting: */ - libxl__ev_xswatch watch; - libxl__ev_time timeout; + libxl__xswait_state w; }; static inline void libxl__ev_devstate_init(libxl__ev_devstate *ds) { - libxl__ev_time_init(&ds->timeout); - libxl__ev_xswatch_init(&ds->watch); + libxl__xswait_init(&ds->w); } static inline void libxl__ev_devstate_cancel(libxl__gc *gc, libxl__ev_devstate *ds) { - libxl__ev_time_deregister(gc,&ds->timeout); - libxl__ev_xswatch_deregister(gc,&ds->watch); + libxl__xswait_stop(gc,&ds->w); } -_hidden int libxl__ev_devstate_wait(libxl__gc *gc, libxl__ev_devstate *ds, +_hidden int libxl__ev_devstate_wait(libxl__ao *ao, libxl__ev_devstate *ds, libxl__ev_devstate_callback cb, const char *state_path, int state, int milliseconds); -- 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 |