[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [Xen-devel] [PATCH V5] libxl: make libxl communicate with xenstored by socket or xenbus driver



On Fri, 2010-09-17 at 15:02 +0100, Jun Zhu (Intern) wrote:
> This version adds gc as a parameter to libxl__xs_open, and uses 
> LIBXL__LOG_ERRNO for logging. If some functions cannot use the ctx, It should 
> transfer NULL to libxl__xs_open to disable logging. (But it will make users 
> difficult to find the problem when no logging is output.)
> To make consistent with other functions in libxl__xshelp.c, I use gc as its 
> parameter, not ctx. In the libxl_ctx_init function, I add âlibxl__gc gc = 
> LIBXL_INIT_GC(ctx)â to get the gc of ctx. Please check this.
> 
> Signed-off-by: Jun Zhu <Jun.Zhu@xxxxxxxxxx>
> 
> diff -r cca905a429aa tools/libxl/libxl.c
> --- a/tools/libxl/libxl.c     Tue Sep 14 15:39:36 2010 +0100
> +++ b/tools/libxl/libxl.c     Fri Sep 17 14:58:50 2010 +0100
> @@ -40,6 +40,8 @@
>  
>  int libxl_ctx_init(libxl_ctx *ctx, int version, xentoollog_logger *lg)
>  {
> +    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +

If you add one of these then you also need to add a libxl__free_all(&gc)
on every exit path from the function.

Special care needs to be taken in libxl_ctx_init to ensure the ctx is
initialised enough to be able to create a gc. I suspect it is safe as is
but perhaps moving the "gc = LIBXL_INIT_GC(ctx)" later in the function
will prevent accidents? e.g. put it just before this:

+    ctx->xsh = libxl__xs_open(&gc);
     if (!ctx->xsh) {
         xc_interface_close(ctx->xch);
         return ERROR_FAIL;


> diff -r cca905a429aa tools/libxl/libxl_dom.c
> --- a/tools/libxl/libxl_dom.c Tue Sep 14 15:39:36 2010 +0100
> +++ b/tools/libxl/libxl_dom.c Fri Sep 17 14:58:50 2010 +0100
> @@ -326,14 +326,16 @@
>  
>      snprintf(path, sizeof(path), 
> "/local/domain/0/device-model/%u/logdirty/cmd", domid);
>  
> -    xsh = xs_daemon_open();
> +    xsh = libxl__xs_open(NULL);
> +    if (!xsh)
> +        return;

This is libxl__domain_suspend_common_switch_qemu_logdirty[0] which is
used as a callback from xc_domain_suspend. IMHO any function which takes
a callback should also take a void * closure, which in this case could
be used to pass the context from the caller of xc_domain_save to this
function. Given that xc does not do this I suppose this is fine as is.

[0] BTW please add this to your ~/.hgrc to automatically annotate
functions in diffs:
"""
        [diff]
        showfunc = True
"""

> diff -r cca905a429aa tools/libxl/libxl_utils.c
> --- a/tools/libxl/libxl_utils.c       Tue Sep 14 15:39:36 2010 +0100
> +++ b/tools/libxl/libxl_utils.c       Fri Sep 17 14:58:50 2010 +0100
> @@ -366,9 +366,11 @@
>  
> 
>  int libxl_ctx_postfork(libxl_ctx *ctx) {
> +    libxl__gc gc = LIBXL_INIT_GC(ctx);
>      if (ctx->xsh) xs_daemon_destroy_postfork(ctx->xsh);
> -    ctx->xsh = xs_daemon_open();
> -    if (!ctx->xsh) return ERROR_FAIL;
> +    ctx->xsh = libxl__xs_open(&gc);
> +    if (!ctx->xsh)
> +        return ERROR_FAIL;
>      return 0;
>  }
 
Another place where libxl__free_all(&gc) is needed.



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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