[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Re: [PATCH] libxenlight: fix multiple xenstore watches problem
I will apply Stefano's patches now, then you can see what bits you need to re-send. Stefano or Vincent will want to ack/nack your patches before I try to apply them anyway. -- Keir On 02/12/2009 18:08, "Andres Lagar-Cavilla" <andres@xxxxxxxxxxxxxxxx> wrote: > mmm, > most likely the first two patches in my latest resend clash against > this. Yikes > Andres >> Message: 3 >> Date: Wed, 2 Dec 2009 15:01:32 +0000 >> From: Stefano Stabellini<stefano.stabellini@xxxxxxxxxxxxx> >> Subject: [Xen-devel] [PATCH] libxenlight: fix multiple xenstore >> watches problem >> To: xen-devel@xxxxxxxxxxxxxxxxxxx >> Message-ID:<alpine.DEB.2.00.0912021455450.26846@kaball-desktop> >> Content-Type: text/plain; charset="US-ASCII" >> >> Hi all, >> this patch fixes the multiple xenstore watches problem in libxenlight >> opening a new xenstore connection to set and read temporary watches on >> the device state nodes. >> This way they don't interfere with other long running watches. >> >> Signed-off-by: Stefano Stabellini<stefano.stabellini@xxxxxxxxxxxxx> >> >> --- >> >> diff -r 96a9740f4f33 tools/libxl/libxl_device.c >> --- a/tools/libxl/libxl_device.c Wed Dec 02 14:29:24 2009 +0000 >> +++ b/tools/libxl/libxl_device.c Wed Dec 02 14:43:06 2009 +0000 >> @@ -212,47 +212,50 @@ >> fd_set rfds; >> struct timeval tv; >> flexarray_t *toremove; >> + struct libxl_ctx clone = *ctx; >> >> + clone.xsh = xs_daemon_open(); >> toremove = flexarray_make(16, 1); >> - path = libxl_sprintf(ctx, "/local/domain/%d/device", domid); >> - l1 = libxl_xs_directory(ctx, XBT_NULL, path,&num1); >> + path = libxl_sprintf(&clone, "/local/domain/%d/device", domid); >> + l1 = libxl_xs_directory(&clone, XBT_NULL, path,&num1); >> if (!l1) { >> - XL_LOG(ctx, XL_LOG_ERROR, "%s is empty", path); >> + XL_LOG(&clone, XL_LOG_ERROR, "%s is empty", path); >> + xs_daemon_close(clone.xsh); >> return -1; >> } >> for (i = 0; i< num1; i++) { >> - path = libxl_sprintf(ctx, "/local/domain/%d/device/%s", domid, >> l1[i]); >> - l2 = libxl_xs_directory(ctx, XBT_NULL, path,&num2); >> + path = libxl_sprintf(&clone, "/local/domain/%d/device/%s", domid, >> l1[i]); >> + l2 = libxl_xs_directory(&clone, XBT_NULL, path,&num2); >> if (!l2) >> continue; >> for (j = 0; j< num2; j++) { >> - fe_path = libxl_sprintf(ctx, "/local/domain/%d/device/%s/%s", >> domid, l1[i], l2[j]); >> - be_path = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, >> "%s/backend", fe_path)); >> + fe_path = libxl_sprintf(&clone, "/local/domain/%d/device/%s/%s", >> domid, l1[i], l2[j]); >> + be_path = libxl_xs_read(&clone, XBT_NULL, libxl_sprintf(&clone, >> "%s/backend", fe_path)); >> if (be_path != NULL) { >> - if (libxl_device_destroy(ctx, be_path, force)> 0) >> + if (libxl_device_destroy(&clone, be_path, force)> 0) >> n_watches++; >> - flexarray_set(toremove, n++, libxl_dirname(ctx, be_path)); >> + flexarray_set(toremove, n++, libxl_dirname(&clone, >> be_path)); >> } else { >> - xs_rm(ctx->xsh, XBT_NULL, path); >> + xs_rm(clone.xsh, XBT_NULL, path); >> } >> } >> } >> if (!force) { >> - nfds = xs_fileno(ctx->xsh) + 1; >> + nfds = xs_fileno(clone.xsh) + 1; >> /* Linux-ism */ >> tv.tv_sec = LIBXL_DESTROY_TIMEOUT; >> tv.tv_usec = 0; >> while (n_watches> 0&& tv.tv_sec> 0) { >> FD_ZERO(&rfds); >> - FD_SET(xs_fileno(ctx->xsh),&rfds); >> + FD_SET(xs_fileno(clone.xsh),&rfds); >> if (select(nfds,&rfds, NULL, NULL,&tv)> 0) { >> - l1 = xs_read_watch(ctx->xsh,&num1); >> + l1 = xs_read_watch(clone.xsh,&num1); >> if (l1 != NULL) { >> - char *state = libxl_xs_read(ctx, XBT_NULL, l1[0]); >> + char *state = libxl_xs_read(&clone, XBT_NULL, l1[0]); >> if (!state || atoi(state) == 6) { >> - xs_unwatch(ctx->xsh, l1[0], l1[1]); >> - xs_rm(ctx->xsh, XBT_NULL, l1[1]); >> - XL_LOG(ctx, XL_LOG_DEBUG, "Destroyed device backend >> at %s", l1[1]); >> + xs_unwatch(clone.xsh, l1[0], l1[1]); >> + xs_rm(clone.xsh, XBT_NULL, l1[1]); >> + XL_LOG(&clone, XL_LOG_DEBUG, "Destroyed device >> backend at %s", l1[1]); >> n_watches--; >> } >> free(l1); >> @@ -263,9 +266,10 @@ >> } >> for (i = 0; i< n; i++) { >> flexarray_get(toremove, i, (void**)&path); >> - xs_rm(ctx->xsh, XBT_NULL, path); >> + xs_rm(clone.xsh, XBT_NULL, path); >> } >> flexarray_free(toremove); >> + xs_daemon_close(clone.xsh); >> return 0; >> } >> >> > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxxxxxxxx > http://lists.xensource.com/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |