mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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:
1 parent
66cd5879f5
commit
dfcace6951
3 files changed
+43
-55
No files matched your search
@@ -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
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||