libxl: builtin list types should be pass-by-reference
authorIan Campbell <ian.campbell@citrix.com>
Tue, 31 Aug 2010 18:16:23 +0000 (19:16 +0100)
committerIan Campbell <ian.campbell@citrix.com>
Tue, 31 Aug 2010 18:16:23 +0000 (19:16 +0100)
This makes all _destroy functions consistent wrt freeing the actual
reference passed in. Previously we were relying on the reference
contained within the type itself which worked but was semantically a
little confusing.

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/libxltypes.py

index 271134d7bcc14e7cb94f207e0b14a371ab85c97d..03d4f313e1a374686e17982a0cf40931a34eb95f 100644 (file)
@@ -73,9 +73,10 @@ int libxl_ctx_free(libxl_ctx *ctx)
     return 0;
 }
 
-void libxl_string_list_destroy(libxl_string_list sl)
+void libxl_string_list_destroy(libxl_string_list *psl)
 {
     int i;
+    libxl_string_list sl = *psl;
 
     if (!sl)
         return;
@@ -85,9 +86,10 @@ void libxl_string_list_destroy(libxl_string_list sl)
     free(sl);
 }
 
-void libxl_key_value_list_destroy(libxl_key_value_list kvl)
+void libxl_key_value_list_destroy(libxl_key_value_list *pkvl)
 {
     int i;
+    libxl_key_value_list kvl = *pkvl;
 
     if (!kvl)
         return;
index 82a06ee38afc7ec1bb066da99c23574a7711a648..80aef7ab38ef082cdf515fee1fa3cd1b162b89c7 100644 (file)
@@ -234,8 +234,8 @@ 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);
 
 /* 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_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);
 
 /*
index f59950d3e82e900f6922dd576df3d9c528bbe10e..1e36926c61057e4957fb061eeb48112621f90b52 100644 (file)
@@ -12,8 +12,8 @@ libxl_console_constype = Builtin("console_constype")
 libxl_disk_phystype = Builtin("disk_phystype")
 libxl_nic_type = Builtin("nic_type")
 
-libxl_string_list = Builtin("string_list", destructor_fn="libxl_string_list_destroy")
-libxl_key_value_list = Builtin("key_value_list", destructor_fn="libxl_key_value_list_destroy")
+libxl_string_list = Builtin("string_list", destructor_fn="libxl_string_list_destroy", passby=PASS_BY_REFERENCE)
+libxl_key_value_list = Builtin("key_value_list", destructor_fn="libxl_key_value_list_destroy", passby=PASS_BY_REFERENCE)
 
 libxl_cpumap = Builtin("cpumap", destructor_fn="free")
 
index 5caff9c2e171dc61771d19b79228c4cb64b92676..2b2db9ae5461c6099a6b8d9936baf4a3ccfb289a 100644 (file)
@@ -182,6 +182,8 @@ def parse(f):
             globs[n] = t
         elif isinstance(t,type(object)) and issubclass(t, Type):
             globs[n] = t
+        elif n in ['PASS_BY_REFERENCE', 'PASS_BY_VALUE']:
+            globs[n] = t
 
     try:
         execfile(f, globs, locs)