WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 16 of 26] libxl: implement destroy for libxl_file_ref

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH 16 of 26] libxl: implement destroy for libxl_file_reference builtin type
From: Ian Campbell <ian.campbell@xxxxxxxxxx>
Date: Mon, 16 Aug 2010 15:33:40 +0100
Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
Delivery-date: Mon, 16 Aug 2010 07:54:46 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1281969204@xxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# Date 1281969065 -3600
# Node ID d91c2cef85ea93062cdbd23c81e4990567c0ba25
# Parent  4c0e7313a88fc4219f37cf48177a1c807ca4d22b
libxl: implement destroy for libxl_file_reference builtin type

As well as freeing data any file mappings need to be torn down so
implement an explicit destroy function.

Also the map and unmap function are internal to libxl so make that so.

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

diff -r 4c0e7313a88f -r d91c2cef85ea tools/libxl/libxl.c
--- a/tools/libxl/libxl.c       Mon Aug 16 15:31:05 2010 +0100
+++ b/tools/libxl/libxl.c       Mon Aug 16 15:31:05 2010 +0100
@@ -23,7 +23,6 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <sys/select.h>
-#include <sys/mman.h>
 #include <sys/wait.h>
 #include <sys/time.h>
 #include <signal.h>
@@ -341,9 +340,9 @@ int libxl_domain_build(libxl_ctx *ctx, l
     }
     ret = build_post(ctx, domid, info, state, vments, localents);
 out:
-    libxl_file_reference_unmap(ctx, &info->kernel);
+    libxl__file_reference_unmap(&info->kernel);
     if (!info->hvm)
-           libxl_file_reference_unmap(ctx, &info->u.pv.ramdisk);
+           libxl__file_reference_unmap(&info->u.pv.ramdisk);
 
     libxl_free_all(&gc);
     return ret;
@@ -406,9 +405,9 @@ int libxl_domain_restore(libxl_ctx *ctx,
     }
 
 out:
-    libxl_file_reference_unmap(ctx, &info->kernel);
+    libxl__file_reference_unmap(&info->kernel);
     if (!info->hvm)
-           libxl_file_reference_unmap(ctx, &info->u.pv.ramdisk);
+           libxl__file_reference_unmap(&info->u.pv.ramdisk);
 
     esave = errno;
 
@@ -3371,47 +3370,8 @@ int libxl_tmem_freeable(libxl_ctx *ctx)
     return rc;
 }
 
-int libxl_file_reference_map(libxl_ctx *ctx, libxl_file_reference *f)
+void libxl_file_reference_destroy(libxl_file_reference *f)
 {
-       struct stat st_buf;
-       int ret, fd;
-       void *data;
-
-       if (f->mapped)
-               return 0;
-
-       fd = open(f->path, O_RDONLY);
-       if (f < 0)
-               return ERROR_FAIL;
-
-       ret = fstat(fd, &st_buf);
-       if (ret < 0)
-               goto out;
-
-       ret = -1;
-       data = mmap(NULL, st_buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
-       if (data == NULL)
-               goto out;
-
-       f->mapped = 1;
-       f->data = data;
-       f->size = st_buf.st_size;
-
-       ret = 0;
-out:
-       close(fd);
-
-       return ret == 0 ? 0 : ERROR_FAIL;
+    libxl__file_reference_unmap(f);
+    free(f->path);
 }
-
-int libxl_file_reference_unmap(libxl_ctx *ctx, libxl_file_reference *f)
-{
-       int ret;
-
-       if (!f->mapped)
-               return 0;
-
-       ret = munmap(f->data, f->size);
-
-       return ret == 0 ? 0 : ERROR_FAIL;
-}
diff -r 4c0e7313a88f -r d91c2cef85ea tools/libxl/libxl.h
--- a/tools/libxl/libxl.h       Mon Aug 16 15:31:05 2010 +0100
+++ b/tools/libxl/libxl.h       Mon Aug 16 15:31:05 2010 +0100
@@ -142,10 +142,8 @@ typedef uint8_t libxl_mac[6];
 typedef uint8_t libxl_mac[6];
 
 typedef char **libxl_string_list;
-void libxl_string_list_destroy(libxl_string_list sl);
 
 typedef char **libxl_key_value_list;
-void libxl_key_value_list_destroy(libxl_key_value_list kvl);
 
 typedef uint64_t *libxl_cpumap;
 
@@ -235,8 +233,10 @@ int libxl_domain_destroy(libxl_ctx *ctx,
 int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force);
 int libxl_domain_preserve(libxl_ctx *ctx, uint32_t domid, 
libxl_domain_create_info *info, const char *name_suffix, libxl_uuid new_uuid);
 
-int libxl_file_reference_map(libxl_ctx *ctx, libxl_file_reference *f);
-int libxl_file_reference_unmap(libxl_ctx *ctx, libxl_file_reference *f);
+/* destructors for builtin data types */
+void libxl_string_list_destroy(libxl_string_list sl);
+void libxl_key_value_list_destroy(libxl_key_value_list kvl);
+void libxl_file_reference_destroy(libxl_file_reference *f);
 
 /*
  * Run the configured bootloader for a PV domain and update
diff -r 4c0e7313a88f -r d91c2cef85ea tools/libxl/libxl_bootloader.c
--- a/tools/libxl/libxl_bootloader.c    Mon Aug 16 15:31:05 2010 +0100
+++ b/tools/libxl/libxl_bootloader.c    Mon Aug 16 15:31:05 2010 +0100
@@ -279,12 +279,12 @@ static void parse_bootloader_result(libx
         if (strncmp("kernel ", o, strlen("kernel ")) == 0) {
             free(info->kernel.path);
             info->kernel.path = strdup(o + strlen("kernel "));
-            libxl_file_reference_map(ctx, &info->kernel);
+            libxl__file_reference_map(&info->kernel);
             unlink(info->kernel.path);
         } else if (strncmp("ramdisk ", o, strlen("ramdisk ")) == 0) {
             free(info->u.pv.ramdisk.path);
             info->u.pv.ramdisk.path = strdup(o + strlen("ramdisk "));
-            libxl_file_reference_map(ctx, &info->u.pv.ramdisk);
+            libxl__file_reference_map(&info->u.pv.ramdisk);
             unlink(info->u.pv.ramdisk.path);
         } else if (strncmp("args ", o, strlen("args ")) == 0) {
             free(info->u.pv.cmdline);
diff -r 4c0e7313a88f -r d91c2cef85ea tools/libxl/libxl_internal.c
--- a/tools/libxl/libxl_internal.c      Mon Aug 16 15:31:05 2010 +0100
+++ b/tools/libxl/libxl_internal.c      Mon Aug 16 15:31:05 2010 +0100
@@ -18,6 +18,12 @@
 #include <stdio.h>
 #include <stdarg.h>
 #include <string.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <unistd.h>
 
 #include "libxl.h"
 #include "libxl_internal.h"
@@ -185,3 +191,48 @@ char *libxl_abs_path(libxl_gc *gc, char 
     return libxl_sprintf(gc, "%s/%s", path, s);
 }
 
+
+int libxl__file_reference_map(libxl_file_reference *f)
+{
+       struct stat st_buf;
+       int ret, fd;
+       void *data;
+
+       if (f->mapped)
+               return 0;
+
+       fd = open(f->path, O_RDONLY);
+       if (f < 0)
+               return ERROR_FAIL;
+
+       ret = fstat(fd, &st_buf);
+       if (ret < 0)
+               goto out;
+
+       ret = -1;
+       data = mmap(NULL, st_buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
+       if (data == NULL)
+               goto out;
+
+       f->mapped = 1;
+       f->data = data;
+       f->size = st_buf.st_size;
+
+       ret = 0;
+out:
+       close(fd);
+
+       return ret == 0 ? 0 : ERROR_FAIL;
+}
+
+int libxl__file_reference_unmap(libxl_file_reference *f)
+{
+       int ret;
+
+       if (!f->mapped)
+               return 0;
+
+       ret = munmap(f->data, f->size);
+
+       return ret == 0 ? 0 : ERROR_FAIL;
+}
diff -r 4c0e7313a88f -r d91c2cef85ea tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h      Mon Aug 16 15:31:05 2010 +0100
+++ b/tools/libxl/libxl_internal.h      Mon Aug 16 15:31:05 2010 +0100
@@ -253,4 +253,7 @@ struct libxl__xen_console_reader {
     unsigned int index;
 };
 
+_hidden int libxl__file_reference_map(libxl_file_reference *f);
+_hidden int libxl__file_reference_unmap(libxl_file_reference *f);
+
 #endif
diff -r 4c0e7313a88f -r d91c2cef85ea tools/libxl/libxltypes.idl
--- a/tools/libxl/libxltypes.idl        Mon Aug 16 15:31:05 2010 +0100
+++ b/tools/libxl/libxltypes.idl        Mon Aug 16 15:31:05 2010 +0100
@@ -85,7 +85,7 @@ mapped is true then the actual file may 
 mapped is true then the actual file may already be unlinked."""),
     ("mapped", integer),
     ("data", void),
-    ("size", size_t)])
+    ("size", size_t)], autogenerate_destructor=False)
 
 libxl_domain_build_info = Struct("domain_build_info",[
     ("max_vcpus",       integer),

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

<Prev in Thread] Current Thread [Next in Thread>