libxl: devstate: Use libxl__xswait*

Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
---
v3: Initialise ds->w.ao
This commit is contained in:
Ian Jackson authored and Ian Jackson committed 2015-06-26 16:53:50 +01:00
1 parent 66cd5879f5
commit dfcace6951
3 files changed
+43 -55

No files matched your search

+2 -2
View File
@@ -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);
+37 -46
View File
@@ -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 (!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;
}
} 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;
}
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) {
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 {
LIBXL__LOG(CTX, LIBXL__LOG_DEBUG, "backend %s wanted state %d"
" still waiting state %d", ds->w.path, ds->wanted, got);
return;
}
out:
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);
libxl__ev_devstate_cancel(gc, ds);
ds->callback(egc, ds, ERROR_TIMEDOUT);
}
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;
+4 -7
View File
@@ -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);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.