[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] libxenlight: use watch and select in libxl_wait_for_device_model
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1259779323 0 # Node ID 32f6420c15e95cb7d39a544df270f5028641d19a # Parent 54409eceb4bef355880520ecb6dd8578fcf2b287 libxenlight: use watch and select in libxl_wait_for_device_model This patch reimplements libxl_wait_for_device_model using a xenstore watch and a select loop. Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> --- tools/libxl/libxl.c | 1 tools/libxl/libxl_device.c | 58 +++++++++++++++++++++++++++---------------- tools/libxl/libxl_internal.h | 1 3 files changed, 39 insertions(+), 21 deletions(-) diff -r 54409eceb4be -r 32f6420c15e9 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Wed Dec 02 18:41:31 2009 +0000 +++ b/tools/libxl/libxl.c Wed Dec 02 18:42:03 2009 +0000 @@ -888,6 +888,7 @@ int libxl_create_device_model(struct lib *starting_r = libxl_calloc(ctx, sizeof(libxl_device_model_starting), 1); if (!*starting_r) goto xit; p = *starting_r; + p->for_spawn = libxl_calloc(ctx, sizeof(struct libxl_spawn_starting), 1); } else { p = &buf_starting; p->for_spawn = NULL; diff -r 54409eceb4be -r 32f6420c15e9 tools/libxl/libxl_device.c --- a/tools/libxl/libxl_device.c Wed Dec 02 18:41:31 2009 +0000 +++ b/tools/libxl/libxl_device.c Wed Dec 02 18:42:03 2009 +0000 @@ -297,31 +297,47 @@ int libxl_wait_for_device_model(struct l { char path[50]; char *p; - int watchdog = 100; unsigned int len; int rc; - + struct xs_handle *xsh; + int nfds; + fd_set rfds; + struct timeval tv; + unsigned int num; + char **l = NULL; + + xsh = xs_daemon_open(); snprintf(path, sizeof(path), "/local/domain/0/device-model/%d/state", domid); - while (watchdog > 0) { - p = xs_read(ctx->xsh, XBT_NULL, path, &len); - if (p == NULL) { - usleep(100000); - watchdog--; - } else { - if (state == NULL || !strcmp(state, p)) { + xs_watch(xsh, path, path); + tv.tv_sec = LIBXL_DEVICE_MODEL_START_TIMEOUT; + tv.tv_usec = 0; + nfds = xs_fileno(xsh) + 1; + while (tv.tv_sec > 0) { + FD_ZERO(&rfds); + FD_SET(xs_fileno(xsh), &rfds); + if (select(nfds, &rfds, NULL, NULL, &tv) > 0) { + l = xs_read_watch(xsh, &num); + if (l != NULL) { + free(l); + p = xs_read(xsh, XBT_NULL, path, &len); + if (!p) + continue; + if (!state || !strcmp(state, p)) { + free(p); + xs_unwatch(xsh, path, path); + xs_daemon_close(xsh); + if (check_callback) { + rc = check_callback(ctx, check_callback_userdata); + if (rc) return rc; + } + return 0; + } free(p); - return 0; - } else { - free(p); - usleep(100000); - watchdog--; - } - } - if (check_callback) { - rc = check_callback(ctx, check_callback_userdata); - if (rc) return rc; - } - } + } + } + } + xs_unwatch(xsh, path, path); + xs_daemon_close(xsh); XL_LOG(ctx, XL_LOG_ERROR, "Device Model not ready"); return -1; } diff -r 54409eceb4be -r 32f6420c15e9 tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Wed Dec 02 18:41:31 2009 +0000 +++ b/tools/libxl/libxl_internal.h Wed Dec 02 18:42:03 2009 +0000 @@ -28,6 +28,7 @@ #include "libxl_utils.h" #define LIBXL_DESTROY_TIMEOUT 10 +#define LIBXL_DEVICE_MODEL_START_TIMEOUT 10 #define LIBXL_XENCONSOLE_LIMIT 1048576 #define LIBXL_XENCONSOLE_PROTOCOL "vt100" #define QEMU_SIGNATURE "QemuDeviceModelRecord" _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |