From: Ian Jackson Date: Wed, 23 Jun 2010 16:04:26 +0000 (+0100) Subject: libxl: make libxl_wait_for_device_model clearer X-Git-Tag: 4.1.0-rc1~959^2~1 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=caaaad749ab5e81c3c90043b6112b290e41e972b;p=xen.git libxl: make libxl_wait_for_device_model clearer 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. xenstore watch automatically fire one time when you install them for this exact same purpose, so the previous code is not wrong, but this version is clearer. Signed-off-by: Stefano Stabellini --- diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c index 090303b746..13563e89d9 100644 --- a/tools/libxl/libxl_device.c +++ b/tools/libxl/libxl_device.c @@ -418,7 +418,7 @@ int libxl_wait_for_device_model(struct libxl_ctx *ctx, 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 @@ int libxl_wait_for_device_model(struct libxl_ctx *ctx, 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);