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

[Xen-changelog] [xen-unstable] libxl: implement destroy for libxl_file_reference builtin type



# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# Date 1282227915 -3600
# Node ID ed717f785082d355e6362ed6ab645a0f47016f6d
# Parent  1ba7cbf9683b159ec56a8a77d856296ea681898b
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.

[PATCH 09 of 16 of
 libxl: autogenerate type definitions and destructor functions]

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
---
 tools/libxl/libxl.c            |   58 ++++++-----------------------------------
 tools/libxl/libxl.h            |    8 ++---
 tools/libxl/libxl.idl          |    2 -
 tools/libxl/libxl_bootloader.c |    4 +-
 tools/libxl/libxl_internal.c   |   51 ++++++++++++++++++++++++++++++++++++
 tools/libxl/libxl_internal.h   |    5 ++-
 6 files changed, 71 insertions(+), 57 deletions(-)

diff -r 1ba7cbf9683b -r ed717f785082 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c       Thu Aug 19 15:24:41 2010 +0100
+++ b/tools/libxl/libxl.c       Thu Aug 19 15:25:15 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>
@@ -340,9 +339,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;
@@ -405,9 +404,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;
 
@@ -3355,47 +3354,8 @@ int libxl_tmem_freeable(libxl_ctx *ctx)
     return rc;
 }
 
-int libxl_file_reference_map(libxl_ctx *ctx, 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_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;
-}
+void libxl_file_reference_destroy(libxl_file_reference *f)
+{
+    libxl__file_reference_unmap(f);
+    free(f->path);
+}
diff -r 1ba7cbf9683b -r ed717f785082 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h       Thu Aug 19 15:24:41 2010 +0100
+++ b/tools/libxl/libxl.h       Thu Aug 19 15:25:15 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 1ba7cbf9683b -r ed717f785082 tools/libxl/libxl.idl
--- a/tools/libxl/libxl.idl     Thu Aug 19 15:24:41 2010 +0100
+++ b/tools/libxl/libxl.idl     Thu Aug 19 15:25:15 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),
diff -r 1ba7cbf9683b -r ed717f785082 tools/libxl/libxl_bootloader.c
--- a/tools/libxl/libxl_bootloader.c    Thu Aug 19 15:24:41 2010 +0100
+++ b/tools/libxl/libxl_bootloader.c    Thu Aug 19 15:25:15 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 1ba7cbf9683b -r ed717f785082 tools/libxl/libxl_internal.c
--- a/tools/libxl/libxl_internal.c      Thu Aug 19 15:24:41 2010 +0100
+++ b/tools/libxl/libxl_internal.c      Thu Aug 19 15:25:15 2010 +0100
@@ -19,6 +19,12 @@
 #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"
 #include "libxl_utils.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 1ba7cbf9683b -r ed717f785082 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h      Thu Aug 19 15:24:41 2010 +0100
+++ b/tools/libxl/libxl_internal.h      Thu Aug 19 15:25:15 2010 +0100
@@ -274,4 +274,7 @@ struct libxl__xen_console_reader {
 
 _hidden int libxl_error_set(libxl_ctx *ctx, int code);
 
-#endif
+_hidden int libxl__file_reference_map(libxl_file_reference *f);
+_hidden int libxl__file_reference_unmap(libxl_file_reference *f);
+
+#endif

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


 


Rackspace

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