# 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
|