xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] libxl: make libxl_wait_for_device_model not racy
@ 2010-06-23 11:15 Stefano Stabellini
  2010-06-23 11:25 ` Vincent Hanquez
  2010-06-23 16:50 ` Jeremy Fitzhardinge
  0 siblings, 2 replies; 8+ messages in thread
From: Stefano Stabellini @ 2010-06-23 11:15 UTC (permalink / raw)
  To: xen-devel

Hi all,
at the moment libxl_wait_for_device_model waits on a xenstore watch
before checking the current value of the xenstore node, that might
contain already the value the function was looking for.
This patch changes libxl_wait_for_device_model so that it checks the
value of the xenstore node first, then waits for the watch.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

---

diff -r e2f5e4f3481c tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Tue Jun 22 16:22:30 2010 +0100
+++ b/tools/libxl/libxl_device.c	Wed Jun 23 11:04:49 2010 +0100
@@ -418,7 +418,7 @@
     char *path;
     char *p;
     unsigned int len;
-    int rc;
+    int rc = 0;
     struct xs_handle *xsh;
     int nfds;
     fd_set rfds;
@@ -432,28 +432,29 @@
     tv.tv_sec = LIBXL_DEVICE_MODEL_START_TIMEOUT;
     tv.tv_usec = 0;
     nfds = xs_fileno(xsh) + 1;
-    while (tv.tv_sec > 0) {
+    while (rc > 0 || (!rc && tv.tv_sec > 0)) {
+        p = xs_read(xsh, XBT_NULL, path, &len);
+        if (p && (!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);
+again:
         FD_ZERO(&rfds);
         FD_SET(xs_fileno(xsh), &rfds);
-        if (select(nfds, &rfds, NULL, NULL, &tv) > 0) {
+        rc = select(nfds, &rfds, NULL, NULL, &tv);
+        if (rc > 0) {
             l = xs_read_watch(xsh, &num);
-            if (l != NULL) {
+            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);
-            }
+            else
+                goto again;
         }
     }
     xs_unwatch(xsh, path, path);

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2010-06-23 16:54 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-06-23 11:15 [PATCH] libxl: make libxl_wait_for_device_model not racy Stefano Stabellini
2010-06-23 11:25 ` Vincent Hanquez
2010-06-23 13:15   ` Stefano Stabellini
2010-06-23 13:36     ` Vincent Hanquez
2010-06-23 16:03       ` Ian Jackson
2010-06-23 16:50 ` Jeremy Fitzhardinge
2010-06-23 16:52   ` Stefano Stabellini
2010-06-23 16:54     ` Jeremy Fitzhardinge

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).