libxl: implement destroy for libxl_file_reference builtin type
authorIan Campbell <ian.campbell@citrix.com>
Thu, 19 Aug 2010 14:25:15 +0000 (15:25 +0100)
committerIan Campbell <ian.campbell@citrix.com>
Thu, 19 Aug 2010 14:25:15 +0000 (15:25 +0100)
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@citrix.com>
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/libxl/libxl.c
tools/libxl/libxl.h
tools/libxl/libxl.idl
tools/libxl/libxl_bootloader.c
tools/libxl/libxl_internal.c
tools/libxl/libxl_internal.h

index 531590ce7adba64dd21439ad7e497e46d96e3fea..7a02a24db76a1106641cf3741030af28cd914b2b 100644 (file)
@@ -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, libxl_domain_build_info *info, uint32_t d
     }
     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, libxl_domain_build_info *info,
     }
 
 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)
+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;
-}
-
-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;
+    libxl__file_reference_unmap(f);
+    free(f->path);
 }
index 566da1455ace1a4821cf7d11bb145e95245242a8..ca1d71b8c68e0b064f4d9108bff79e22fdfc4cdb 100644 (file)
@@ -142,10 +142,8 @@ typedef uint8_t libxl_uuid[16];
 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_shutdown(libxl_ctx *ctx, uint32_t domid, int req);
 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
index fcbeddeb3a9380e32c395b956c280f29fcd8db1c..f59950d3e82e900f6922dd576df3d9c528bbe10e 100644 (file)
@@ -85,7 +85,7 @@ libxl_file_reference = Struct("file_reference",[
 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),
index e7e88ce3d10e63a01040ffdd6b2950a3afd513da..08d6a22274996f8b133d425bb1e0621824cbaee7 100644 (file)
@@ -279,12 +279,12 @@ static void parse_bootloader_result(libxl_ctx *ctx,
         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);
index 5eb27a6f4d790a6cb6644f3d328b1e219739ab9e..05ef3e31305e4ca058a50f9ec4091334c1db9b3f 100644 (file)
 #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 *s, const char *path)
     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;
+}
index 2f81acce92085c8038925a01cef4682a79023540..face02136cebf8e989ea5d0f6b6a38951130f4a4 100644 (file)
@@ -274,4 +274,7 @@ struct libxl__xen_console_reader {
 
 _hidden int libxl_error_set(libxl_ctx *ctx, int code);
 
+_hidden int libxl__file_reference_map(libxl_file_reference *f);
+_hidden int libxl__file_reference_unmap(libxl_file_reference *f);
+
 #endif