[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.