From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ian Jackson Subject: [PATCH 06/29] libxl: Use libxl__xswait* in libxl__ao_device Date: Tue, 10 Feb 2015 20:09:53 +0000 Message-ID: <1423599016-32639-7-git-send-email-ian.jackson@eu.citrix.com> References: <1423599016-32639-1-git-send-email-ian.jackson@eu.citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1423599016-32639-1-git-send-email-ian.jackson@eu.citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xensource.com Cc: Ian Jackson , Euan Harris List-Id: xen-devel@lists.xenproject.org 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 --- tools/libxl/libxl_device.c | 64 ++++++++++++------------------------------ tools/libxl/libxl_internal.h | 2 +- 2 files changed, 19 insertions(+), 47 deletions(-) diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c index 0f50d04..64ee541 100644 --- a/tools/libxl/libxl_device.c +++ b/tools/libxl/libxl_device.c @@ -450,7 +450,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 */ @@ -731,13 +731,9 @@ static void device_hotplug_child_death_cb(libxl__egc *egc, libxl__async_exec_state *aes, 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); @@ -988,22 +984,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; } @@ -1101,37 +1089,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; @@ -1164,7 +1136,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__async_exec_inuse(&aodev->aes)); } diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 2862c69..5a76d51 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -2152,7 +2152,7 @@ struct libxl__ao_device { /* 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; int num_exec; /* for calling hotplug scripts */ libxl__async_exec_state aes; -- 1.7.10.4