[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 04/14] libxl: Use libxl__xswait* in libxl__ao_device
Replace the separate timeout and xenstore watch with use of libxl__xswait*. Different control flow, but no ultimate functional change apart from slight changes to the text of error messages. Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> --- tools/libxl/libxl_device.c | 64 ++++++++++++------------------------------ tools/libxl/libxl_internal.h | 4 +-- 2 files changed, 20 insertions(+), 48 deletions(-) diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c index ba7d100..c1609a7 100644 --- a/tools/libxl/libxl_device.c +++ b/tools/libxl/libxl_device.c @@ -436,7 +436,7 @@ void libxl__prepare_ao_device(libxl__ao *ao, libxl__ao_device *aodev) * Initialize xs_watch, because it's not used on all possible * execution paths, but it's unconditionally destroyed when finished. */ - libxl__ev_xswatch_init(&aodev->xs_watch); + libxl__xswait_init(&aodev->xswait); aodev->active = 1; /* We init this here because we might call device_hotplug_done * without actually calling any hotplug script */ @@ -714,13 +714,9 @@ static void device_hotplug_child_death_cb(libxl__egc *egc, libxl__ev_child *child, pid_t pid, int status); -static void device_destroy_be_timeout_cb(libxl__egc *egc, libxl__ev_time *ev, - const struct timeval *requested_abs); - static void device_destroy_be_watch_cb(libxl__egc *egc, - libxl__ev_xswatch *watch, - const char *watch_path, - const char *event_path); + libxl__xswait_state *xswait, + int rc, const char *data); static void device_hotplug_done(libxl__egc *egc, libxl__ao_device *aodev); @@ -970,22 +966,14 @@ static void device_hotplug(libxl__egc *egc, libxl__ao_device *aodev) if (aodev->action != LIBXL__DEVICE_ACTION_REMOVE) goto out; - rc = libxl__ev_time_register_rel(gc, &aodev->timeout, - device_destroy_be_timeout_cb, - LIBXL_DESTROY_TIMEOUT * 1000); - if (rc) { - LOG(ERROR, "setup of xs watch timeout failed"); - goto out; - } - - rc = libxl__ev_xswatch_register(gc, &aodev->xs_watch, - device_destroy_be_watch_cb, - be_path); - if (rc) { - LOG(ERROR, "setup of xs watch for %s failed", be_path); - libxl__ev_time_deregister(gc, &aodev->timeout); + aodev->xswait.ao = ao; + aodev->xswait.what = "removal of backend path"; + aodev->xswait.path = be_path; + aodev->xswait.timeout_ms = LIBXL_DESTROY_TIMEOUT * 1000; + aodev->xswait.callback = device_destroy_be_watch_cb; + rc = libxl__xswait_start(gc, &aodev->xswait); + if (rc) goto out; - } return; } @@ -1105,37 +1093,21 @@ error: device_hotplug_done(egc, aodev); } -static void device_destroy_be_timeout_cb(libxl__egc *egc, libxl__ev_time *ev, - const struct timeval *requested_abs) -{ - libxl__ao_device *aodev = CONTAINER_OF(ev, *aodev, timeout); - STATE_AO_GC(aodev->ao); - - LOG(ERROR, "timed out while waiting for %s to be removed", - libxl__device_backend_path(gc, aodev->dev)); - - aodev->rc = ERROR_TIMEDOUT; - - device_hotplug_done(egc, aodev); - return; -} - static void device_destroy_be_watch_cb(libxl__egc *egc, - libxl__ev_xswatch *watch, - const char *watch_path, - const char *event_path) + libxl__xswait_state *xswait, + int rc, const char *dir) { - libxl__ao_device *aodev = CONTAINER_OF(watch, *aodev, xs_watch); + libxl__ao_device *aodev = CONTAINER_OF(xswait, *aodev, xswait); STATE_AO_GC(aodev->ao); - const char *dir; - int rc; - rc = libxl__xs_read_checked(gc, XBT_NULL, watch_path, &dir); if (rc) { - LOG(ERROR, "unable to read backend path: %s", watch_path); + if (rc == ERROR_TIMEDOUT) + LOG(ERROR, "timed out while waiting for %s to be removed", + xswait->path); aodev->rc = rc; goto out; } + if (dir) { /* backend path still exists, wait a little longer... */ return; @@ -1168,7 +1140,7 @@ static void device_hotplug_clean(libxl__gc *gc, libxl__ao_device *aodev) { /* Clean events and check reentrancy */ libxl__ev_time_deregister(gc, &aodev->timeout); - libxl__ev_xswatch_deregister(gc, &aodev->xs_watch); + libxl__xswait_stop(gc, &aodev->xswait); assert(!libxl__ev_child_inuse(&aodev->child)); } diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 1ad2516..ffafd25 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -2025,10 +2025,10 @@ struct libxl__ao_device { libxl__multidev *multidev; /* reference to the containing multidev */ /* private for add/remove implementation */ libxl__ev_devstate backend_ds; - /* Bodge for Qemu devices, also used for timeout of hotplug execution */ + /* Bodge for Qemu devices */ libxl__ev_time timeout; /* xenstore watch for backend path of driver domains */ - libxl__ev_xswatch xs_watch; + libxl__xswait_state xswait; /* device hotplug execution */ const char *what; int num_exec; -- 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 |