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

[Xen-changelog] [xen-unstable] xl: Implement flexarray_append() and flexarray_vappend()



# HG changeset patch
# User Gianni Tedesco <gianni.tedesco@xxxxxxxxxx>
# Date 1294426430 0
# Node ID 03718b569d971df043b34799165241e7f9f58b00
# Parent  e1392f5327ce81587ca1eb0e3fda16cf3b84a167
xl: Implement flexarray_append() and flexarray_vappend()

Makes a lot of code simpler and nicer and saves a fair amount of screen
real-estate

Signed-off-by: Gianni Tedesco <gianni.tedesco@xxxxxxxxxx>
Committed-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
---
 tools/libxl/flexarray.c |   24 +++
 tools/libxl/flexarray.h |    3 
 tools/libxl/libxl.c     |  375 ++++++++++++++++++++++--------------------------
 tools/libxl/libxl_dm.c  |  187 ++++++++++-------------
 tools/libxl/libxl_pci.c |   79 +++-------
 5 files changed, 313 insertions(+), 355 deletions(-)

diff -r e1392f5327ce -r 03718b569d97 tools/libxl/flexarray.c
--- a/tools/libxl/flexarray.c   Fri Jan 07 18:24:54 2011 +0000
+++ b/tools/libxl/flexarray.c   Fri Jan 07 18:53:50 2011 +0000
@@ -14,6 +14,7 @@
  */
 
 #include "libxl_internal.h"
+#include <stdarg.h>
 
 flexarray_t *flexarray_make(int size, int autogrow)
 {
@@ -21,6 +22,7 @@ flexarray_t *flexarray_make(int size, in
     if (array) {
         array->size = size;
         array->autogrow = autogrow;
+        array->count = 0;
         array->data = calloc(size, sizeof(void *));
     }
     return array;
@@ -56,8 +58,30 @@ int flexarray_set(flexarray_t *array, un
         if (flexarray_grow(array, newsize - array->size))
             return 2;
     }
+    if ( index + 1 > array->count )
+        array->count = index + 1;
     array->data[index] = ptr;
     return 0;
+}
+
+int flexarray_append(flexarray_t *array, void *ptr)
+{
+    return flexarray_set(array, array->count, ptr);
+}
+
+int flexarray_vappend(flexarray_t *array, ...)
+{
+    va_list va;
+    void *ptr;
+    int ret;
+
+    va_start(va, array);
+    for(ret = 0; (ptr = va_arg(va, void *)); ret++) {
+        if ( flexarray_append(array, ptr) )
+            break;
+    }
+    va_end(va);
+    return ret;
 }
 
 int flexarray_get(flexarray_t *array, int index, void **ptr)
diff -r e1392f5327ce -r 03718b569d97 tools/libxl/flexarray.h
--- a/tools/libxl/flexarray.h   Fri Jan 07 18:24:54 2011 +0000
+++ b/tools/libxl/flexarray.h   Fri Jan 07 18:53:50 2011 +0000
@@ -19,6 +19,7 @@ typedef struct flexarray {
 typedef struct flexarray {
     int size;
     int autogrow;
+    unsigned int count;
     void **data; /* array of pointer */
 } flexarray_t;
 
@@ -26,6 +27,8 @@ _hidden void flexarray_free(flexarray_t 
 _hidden void flexarray_free(flexarray_t *array);
 _hidden int flexarray_grow(flexarray_t *array, int extents);
 _hidden int flexarray_set(flexarray_t *array, unsigned int index, void *ptr);
+_hidden int flexarray_append(flexarray_t *array, void *ptr);
+_hidden int flexarray_vappend(flexarray_t *array, ...);
 _hidden int flexarray_get(flexarray_t *array, int index, void **ptr);
 
 _hidden void **flexarray_contents(flexarray_t *array);
diff -r e1392f5327ce -r 03718b569d97 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c       Fri Jan 07 18:24:54 2011 +0000
+++ b/tools/libxl/libxl.c       Fri Jan 07 18:53:50 2011 +0000
@@ -1075,8 +1075,6 @@ int libxl_device_disk_add(libxl_ctx *ctx
     flexarray_t *front;
     flexarray_t *back;
     char *backend_type;
-    unsigned int boffset = 0;
-    unsigned int foffset = 0;
     int devid;
     libxl__device device;
     int major, minor, rc;
@@ -1111,11 +1109,11 @@ int libxl_device_disk_add(libxl_ctx *ctx
         case PHYSTYPE_PHY: {
 
             libxl__device_physdisk_major_minor(disk->physpath, &major, &minor);
-            flexarray_set(back, boffset++, "physical-device");
-            flexarray_set(back, boffset++, libxl__sprintf(&gc, "%x:%x", major, 
minor));
-
-            flexarray_set(back, boffset++, "params");
-            flexarray_set(back, boffset++, disk->physpath);
+            flexarray_append(back, "physical-device");
+            flexarray_append(back, libxl__sprintf(&gc, "%x:%x", major, minor));
+
+            flexarray_append(back, "params");
+            flexarray_append(back, disk->physpath);
 
             device.backend_kind = DEVICE_VBD;
             break;
@@ -1134,20 +1132,20 @@ int libxl_device_disk_add(libxl_ctx *ctx
                     rc = ERROR_FAIL;
                     goto out_free;
                 }
-                flexarray_set(back, boffset++, "tapdisk-params");
-                flexarray_set(back, boffset++, libxl__sprintf(&gc, "%s:%s", 
libxl__device_disk_string_of_phystype(disk->phystype), disk->physpath));
-                flexarray_set(back, boffset++, "params");
-                flexarray_set(back, boffset++, libxl__strdup(&gc, dev));
+                flexarray_append(back, "tapdisk-params");
+                flexarray_append(back, libxl__sprintf(&gc, "%s:%s", 
libxl__device_disk_string_of_phystype(disk->phystype), disk->physpath));
+                flexarray_append(back, "params");
+                flexarray_append(back, libxl__strdup(&gc, dev));
                 backend_type = "phy";
                 libxl__device_physdisk_major_minor(dev, &major, &minor);
-                flexarray_set(back, boffset++, "physical-device");
-                flexarray_set(back, boffset++, libxl__sprintf(&gc, "%x:%x", 
major, minor));
+                flexarray_append(back, "physical-device");
+                flexarray_append(back, libxl__sprintf(&gc, "%x:%x", major, 
minor));
                 device.backend_kind = DEVICE_VBD;
 
                 break;
             }
-            flexarray_set(back, boffset++, "params");
-            flexarray_set(back, boffset++, libxl__sprintf(&gc, "%s:%s",
+            flexarray_append(back, "params");
+            flexarray_append(back, libxl__sprintf(&gc, "%s:%s",
                           
libxl__device_disk_string_of_phystype(disk->phystype), disk->physpath));
 
             if (libxl__blktap_enabled(&gc))
@@ -1162,40 +1160,40 @@ int libxl_device_disk_add(libxl_ctx *ctx
             goto out_free;
     }
 
-    flexarray_set(back, boffset++, "frontend-id");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", disk->domid));
-    flexarray_set(back, boffset++, "online");
-    flexarray_set(back, boffset++, "1");
-    flexarray_set(back, boffset++, "removable");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", 
(disk->unpluggable) ? 1 : 0));
-    flexarray_set(back, boffset++, "bootable");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", 1));
-    flexarray_set(back, boffset++, "state");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", 1));
-    flexarray_set(back, boffset++, "dev");
-    flexarray_set(back, boffset++, disk->virtpath);
-    flexarray_set(back, boffset++, "type");
-    flexarray_set(back, boffset++, backend_type);
-    flexarray_set(back, boffset++, "mode");
-    flexarray_set(back, boffset++, disk->readwrite ? "w" : "r");
-
-    flexarray_set(front, foffset++, "backend-id");
-    flexarray_set(front, foffset++, libxl__sprintf(&gc, "%d", 
disk->backend_domid));
-    flexarray_set(front, foffset++, "state");
-    flexarray_set(front, foffset++, libxl__sprintf(&gc, "%d", 1));
-    flexarray_set(front, foffset++, "virtual-device");
-    flexarray_set(front, foffset++, libxl__sprintf(&gc, "%d", devid));
-    flexarray_set(front, foffset++, "device-type");
-    flexarray_set(front, foffset++, disk->is_cdrom ? "cdrom" : "disk");
+    flexarray_append(back, "frontend-id");
+    flexarray_append(back, libxl__sprintf(&gc, "%d", disk->domid));
+    flexarray_append(back, "online");
+    flexarray_append(back, "1");
+    flexarray_append(back, "removable");
+    flexarray_append(back, libxl__sprintf(&gc, "%d", (disk->unpluggable) ? 1 : 
0));
+    flexarray_append(back, "bootable");
+    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(back, "state");
+    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(back, "dev");
+    flexarray_append(back, disk->virtpath);
+    flexarray_append(back, "type");
+    flexarray_append(back, backend_type);
+    flexarray_append(back, "mode");
+    flexarray_append(back, disk->readwrite ? "w" : "r");
+
+    flexarray_append(front, "backend-id");
+    flexarray_append(front, libxl__sprintf(&gc, "%d", disk->backend_domid));
+    flexarray_append(front, "state");
+    flexarray_append(front, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(front, "virtual-device");
+    flexarray_append(front, libxl__sprintf(&gc, "%d", devid));
+    flexarray_append(front, "device-type");
+    flexarray_append(front, disk->is_cdrom ? "cdrom" : "disk");
 
     if (0 /* protocol != native*/) {
-        flexarray_set(front, foffset++, "protocol");
-        flexarray_set(front, foffset++, "x86_32-abi"); /* hardcoded ! */
+        flexarray_append(front, "protocol");
+        flexarray_append(front, "x86_32-abi"); /* hardcoded ! */
     }
 
     libxl__device_generic_add(ctx, &device,
-                             libxl__xs_kvs_of_flexarray(&gc, back, boffset),
-                             libxl__xs_kvs_of_flexarray(&gc, front, foffset));
+                             libxl__xs_kvs_of_flexarray(&gc, back, 
back->count),
+                             libxl__xs_kvs_of_flexarray(&gc, front, 
front->count));
 
     rc = 0;
 
@@ -1274,8 +1272,6 @@ int libxl_device_nic_add(libxl_ctx *ctx,
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     flexarray_t *front;
     flexarray_t *back;
-    unsigned int boffset = 0;
-    unsigned int foffset = 0;
     libxl__device device;
     char *dompath, **l;
     unsigned int nb, rc;
@@ -1311,41 +1307,41 @@ int libxl_device_nic_add(libxl_ctx *ctx,
     device.domid = nic->domid;
     device.kind = DEVICE_VIF;
 
-    flexarray_set(back, boffset++, "frontend-id");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", nic->domid));
-    flexarray_set(back, boffset++, "online");
-    flexarray_set(back, boffset++, "1");
-    flexarray_set(back, boffset++, "state");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", 1));
-    flexarray_set(back, boffset++, "script");
-    flexarray_set(back, boffset++, nic->script);
-    flexarray_set(back, boffset++, "mac");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, 
"%02x:%02x:%02x:%02x:%02x:%02x",
+    flexarray_append(back, "frontend-id");
+    flexarray_append(back, libxl__sprintf(&gc, "%d", nic->domid));
+    flexarray_append(back, "online");
+    flexarray_append(back, "1");
+    flexarray_append(back, "state");
+    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(back, "script");
+    flexarray_append(back, nic->script);
+    flexarray_append(back, "mac");
+    flexarray_append(back, libxl__sprintf(&gc, "%02x:%02x:%02x:%02x:%02x:%02x",
                                                  nic->mac[0], nic->mac[1], 
nic->mac[2],
                                                  nic->mac[3], nic->mac[4], 
nic->mac[5]));
-    flexarray_set(back, boffset++, "bridge");
-    flexarray_set(back, boffset++, libxl__strdup(&gc, nic->bridge));
-    flexarray_set(back, boffset++, "handle");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", nic->devid));
-
-    flexarray_set(front, foffset++, "backend-id");
-    flexarray_set(front, foffset++, libxl__sprintf(&gc, "%d", 
nic->backend_domid));
-    flexarray_set(front, foffset++, "state");
-    flexarray_set(front, foffset++, libxl__sprintf(&gc, "%d", 1));
-    flexarray_set(front, foffset++, "handle");
-    flexarray_set(front, foffset++, libxl__sprintf(&gc, "%d", nic->devid));
-    flexarray_set(front, foffset++, "mac");
-    flexarray_set(front, foffset++, libxl__sprintf(&gc, 
"%02x:%02x:%02x:%02x:%02x:%02x",
+    flexarray_append(back, "bridge");
+    flexarray_append(back, libxl__strdup(&gc, nic->bridge));
+    flexarray_append(back, "handle");
+    flexarray_append(back, libxl__sprintf(&gc, "%d", nic->devid));
+
+    flexarray_append(front, "backend-id");
+    flexarray_append(front, libxl__sprintf(&gc, "%d", nic->backend_domid));
+    flexarray_append(front, "state");
+    flexarray_append(front, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(front, "handle");
+    flexarray_append(front, libxl__sprintf(&gc, "%d", nic->devid));
+    flexarray_append(front, "mac");
+    flexarray_append(front, libxl__sprintf(&gc, 
"%02x:%02x:%02x:%02x:%02x:%02x",
                                                   nic->mac[0], nic->mac[1], 
nic->mac[2],
                                                   nic->mac[3], nic->mac[4], 
nic->mac[5]));
     if (0 /* protocol != native*/) {
-        flexarray_set(front, foffset++, "protocol");
-        flexarray_set(front, foffset++, "x86_32-abi"); /* hardcoded ! */
+        flexarray_append(front, "protocol");
+        flexarray_append(front, "x86_32-abi"); /* hardcoded ! */
     }
 
     libxl__device_generic_add(ctx, &device,
-                             libxl__xs_kvs_of_flexarray(&gc, back, boffset),
-                             libxl__xs_kvs_of_flexarray(&gc, front, foffset));
+                             libxl__xs_kvs_of_flexarray(&gc, back, 
back->count),
+                             libxl__xs_kvs_of_flexarray(&gc, front, 
front->count));
 
     /* FIXME: wait for plug */
     rc = 0;
@@ -1433,7 +1429,6 @@ int libxl_device_net2_add(libxl_ctx *ctx
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     flexarray_t *front, *back;
-    unsigned int boffset = 0, foffset = 0;
     libxl__device device;
     char *dompath, *dom, **l;
     unsigned int nb;
@@ -1472,65 +1467,65 @@ int libxl_device_net2_add(libxl_ctx *ctx
     device.domid = net2->domid;
     device.kind = DEVICE_VIF2;
 
-    flexarray_set(back, boffset++, "domain");
-    flexarray_set(back, boffset++, dom);
-    flexarray_set(back, boffset++, "frontend-id");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", net2->domid));
-
-    flexarray_set(back, boffset++, "local-trusted");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", 
net2->back_trusted));
-    flexarray_set(back, boffset++, "mac");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, 
"%02x:%02x:%02x:%02x:%02x:%02x",
+    flexarray_append(back, "domain");
+    flexarray_append(back, dom);
+    flexarray_append(back, "frontend-id");
+    flexarray_append(back, libxl__sprintf(&gc, "%d", net2->domid));
+
+    flexarray_append(back, "local-trusted");
+    flexarray_append(back, libxl__sprintf(&gc, "%d", net2->back_trusted));
+    flexarray_append(back, "mac");
+    flexarray_append(back, libxl__sprintf(&gc, "%02x:%02x:%02x:%02x:%02x:%02x",
                                                  net2->back_mac[0], 
net2->back_mac[1],
                                                  net2->back_mac[2], 
net2->back_mac[3],
                                                  net2->back_mac[4], 
net2->back_mac[5]));
 
-    flexarray_set(back, boffset++, "remote-trusted");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", net2->trusted));
-    flexarray_set(back, boffset++, "remote-mac");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, 
"%02x:%02x:%02x:%02x:%02x:%02x",
+    flexarray_append(back, "remote-trusted");
+    flexarray_append(back, libxl__sprintf(&gc, "%d", net2->trusted));
+    flexarray_append(back, "remote-mac");
+    flexarray_append(back, libxl__sprintf(&gc, "%02x:%02x:%02x:%02x:%02x:%02x",
                                                  net2->front_mac[0], 
net2->front_mac[1],
                                                  net2->front_mac[2], 
net2->front_mac[3],
                                                  net2->front_mac[4], 
net2->front_mac[5]));
 
-    flexarray_set(back, boffset++, "max-bypasses");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", 
net2->max_bypasses));
-    flexarray_set(back, boffset++, "filter-mac");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", 
!!(net2->filter_mac)));
-    flexarray_set(back, boffset++, "handle");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", net2->devid));
-    flexarray_set(back, boffset++, "online");
-    flexarray_set(back, boffset++, "1");
-    flexarray_set(back, boffset++, "state");
-    flexarray_set(back, boffset++, "1");
-
-    flexarray_set(front, foffset++, "backend-id");
-    flexarray_set(front, foffset++, libxl__sprintf(&gc, "%d", 
net2->backend_domid));
-
-    flexarray_set(front, foffset++, "local-trusted");
-    flexarray_set(front, foffset++, libxl__sprintf(&gc, "%d", net2->trusted));
-    flexarray_set(front, foffset++, "mac");
-    flexarray_set(front, foffset++, libxl__sprintf(&gc, 
"%02x:%02x:%02x:%02x:%02x:%02x",
+    flexarray_append(back, "max-bypasses");
+    flexarray_append(back, libxl__sprintf(&gc, "%d", net2->max_bypasses));
+    flexarray_append(back, "filter-mac");
+    flexarray_append(back, libxl__sprintf(&gc, "%d", !!(net2->filter_mac)));
+    flexarray_append(back, "handle");
+    flexarray_append(back, libxl__sprintf(&gc, "%d", net2->devid));
+    flexarray_append(back, "online");
+    flexarray_append(back, "1");
+    flexarray_append(back, "state");
+    flexarray_append(back, "1");
+
+    flexarray_append(front, "backend-id");
+    flexarray_append(front, libxl__sprintf(&gc, "%d", net2->backend_domid));
+
+    flexarray_append(front, "local-trusted");
+    flexarray_append(front, libxl__sprintf(&gc, "%d", net2->trusted));
+    flexarray_append(front, "mac");
+    flexarray_append(front, libxl__sprintf(&gc, 
"%02x:%02x:%02x:%02x:%02x:%02x",
                                                   net2->front_mac[0], 
net2->front_mac[1],
                                                   net2->front_mac[2], 
net2->front_mac[3],
                                                   net2->front_mac[4], 
net2->front_mac[5]));
 
-    flexarray_set(front, foffset++, "remote-trusted");
-    flexarray_set(front, foffset++, libxl__sprintf(&gc, "%d", 
net2->back_trusted));
-    flexarray_set(front, foffset++, "remote-mac");
-    flexarray_set(front, foffset++, libxl__sprintf(&gc, 
"%02x:%02x:%02x:%02x:%02x:%02x",
+    flexarray_append(front, "remote-trusted");
+    flexarray_append(front, libxl__sprintf(&gc, "%d", net2->back_trusted));
+    flexarray_append(front, "remote-mac");
+    flexarray_append(front, libxl__sprintf(&gc, 
"%02x:%02x:%02x:%02x:%02x:%02x",
                                                   net2->back_mac[0], 
net2->back_mac[1],
                                                   net2->back_mac[2], 
net2->back_mac[3],
                                                   net2->back_mac[4], 
net2->back_mac[5]));
 
-    flexarray_set(front, foffset++, "filter-mac");
-    flexarray_set(front, foffset++, libxl__sprintf(&gc, "%d", 
!!(net2->filter_mac)));
-    flexarray_set(front, foffset++, "state");
-    flexarray_set(front, foffset++, "1");
+    flexarray_append(front, "filter-mac");
+    flexarray_append(front, libxl__sprintf(&gc, "%d", !!(net2->filter_mac)));
+    flexarray_append(front, "state");
+    flexarray_append(front, "1");
 
     libxl__device_generic_add(ctx, &device,
-                             libxl__xs_kvs_of_flexarray(&gc, back, boffset),
-                             libxl__xs_kvs_of_flexarray(&gc, front, foffset));
+                             libxl__xs_kvs_of_flexarray(&gc, back, 
back->count),
+                             libxl__xs_kvs_of_flexarray(&gc, front, 
front->count));
 
     /* FIXME: wait for plug */
     rc = 0;
@@ -1624,8 +1619,6 @@ int libxl_device_console_add(libxl_ctx *
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     flexarray_t *front;
     flexarray_t *back;
-    unsigned int boffset = 0;
-    unsigned int foffset = 0;
     libxl__device device;
     int rc;
 
@@ -1647,48 +1640,48 @@ int libxl_device_console_add(libxl_ctx *
     device.domid = console->domid;
     device.kind = DEVICE_CONSOLE;
 
-    flexarray_set(back, boffset++, "frontend-id");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", console->domid));
-    flexarray_set(back, boffset++, "online");
-    flexarray_set(back, boffset++, "1");
-    flexarray_set(back, boffset++, "state");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", 1));
-    flexarray_set(back, boffset++, "domain");
-    flexarray_set(back, boffset++, libxl__domid_to_name(&gc, domid));
-    flexarray_set(back, boffset++, "protocol");
-    flexarray_set(back, boffset++, LIBXL_XENCONSOLE_PROTOCOL);
-
-    flexarray_set(front, foffset++, "backend-id");
-    flexarray_set(front, foffset++, libxl__sprintf(&gc, "%d", 
console->backend_domid));
-    flexarray_set(front, foffset++, "limit");
-    flexarray_set(front, foffset++, libxl__sprintf(&gc, "%d", 
LIBXL_XENCONSOLE_LIMIT));
-    flexarray_set(front, foffset++, "type");
+    flexarray_append(back, "frontend-id");
+    flexarray_append(back, libxl__sprintf(&gc, "%d", console->domid));
+    flexarray_append(back, "online");
+    flexarray_append(back, "1");
+    flexarray_append(back, "state");
+    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(back, "domain");
+    flexarray_append(back, libxl__domid_to_name(&gc, domid));
+    flexarray_append(back, "protocol");
+    flexarray_append(back, LIBXL_XENCONSOLE_PROTOCOL);
+
+    flexarray_append(front, "backend-id");
+    flexarray_append(front, libxl__sprintf(&gc, "%d", console->backend_domid));
+    flexarray_append(front, "limit");
+    flexarray_append(front, libxl__sprintf(&gc, "%d", LIBXL_XENCONSOLE_LIMIT));
+    flexarray_append(front, "type");
     if (console->consback == LIBXL_CONSBACK_XENCONSOLED)
-        flexarray_set(front, foffset++, "xenconsoled");
+        flexarray_append(front, "xenconsoled");
     else
-        flexarray_set(front, foffset++, "ioemu");
-    flexarray_set(front, foffset++, "output");
-    flexarray_set(front, foffset++, console->output);
+        flexarray_append(front, "ioemu");
+    flexarray_append(front, "output");
+    flexarray_append(front, console->output);
 
     if (device.devid == 0) {
         if (console->build_state == NULL) {
             rc = ERROR_INVAL;
             goto out_free;
         }
-        flexarray_set(front, foffset++, "port");
-        flexarray_set(front, foffset++, libxl__sprintf(&gc, "%"PRIu32, 
console->build_state->console_port));
-        flexarray_set(front, foffset++, "ring-ref");
-        flexarray_set(front, foffset++, libxl__sprintf(&gc, "%lu", 
console->build_state->console_mfn));
+        flexarray_append(front, "port");
+        flexarray_append(front, libxl__sprintf(&gc, "%"PRIu32, 
console->build_state->console_port));
+        flexarray_append(front, "ring-ref");
+        flexarray_append(front, libxl__sprintf(&gc, "%lu", 
console->build_state->console_mfn));
     } else {
-        flexarray_set(front, foffset++, "state");
-        flexarray_set(front, foffset++, libxl__sprintf(&gc, "%d", 1));
-        flexarray_set(front, foffset++, "protocol");
-        flexarray_set(front, foffset++, LIBXL_XENCONSOLE_PROTOCOL);
+        flexarray_append(front, "state");
+        flexarray_append(front, libxl__sprintf(&gc, "%d", 1));
+        flexarray_append(front, "protocol");
+        flexarray_append(front, LIBXL_XENCONSOLE_PROTOCOL);
     }
 
     libxl__device_generic_add(ctx, &device,
-                             libxl__xs_kvs_of_flexarray(&gc, back, boffset),
-                             libxl__xs_kvs_of_flexarray(&gc, front, foffset));
+                             libxl__xs_kvs_of_flexarray(&gc, back, 
back->count),
+                             libxl__xs_kvs_of_flexarray(&gc, front, 
front->count));
     rc = 0;
 out_free:
     flexarray_free(back);
@@ -1704,8 +1697,6 @@ int libxl_device_vkb_add(libxl_ctx *ctx,
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     flexarray_t *front;
     flexarray_t *back;
-    unsigned int boffset = 0;
-    unsigned int foffset = 0;
     libxl__device device;
     int rc;
 
@@ -1727,23 +1718,23 @@ int libxl_device_vkb_add(libxl_ctx *ctx,
     device.domid = vkb->domid;
     device.kind = DEVICE_VKBD;
 
-    flexarray_set(back, boffset++, "frontend-id");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", vkb->domid));
-    flexarray_set(back, boffset++, "online");
-    flexarray_set(back, boffset++, "1");
-    flexarray_set(back, boffset++, "state");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", 1));
-    flexarray_set(back, boffset++, "domain");
-    flexarray_set(back, boffset++, libxl__domid_to_name(&gc, domid));
-
-    flexarray_set(front, foffset++, "backend-id");
-    flexarray_set(front, foffset++, libxl__sprintf(&gc, "%d", 
vkb->backend_domid));
-    flexarray_set(front, foffset++, "state");
-    flexarray_set(front, foffset++, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(back, "frontend-id");
+    flexarray_append(back, libxl__sprintf(&gc, "%d", vkb->domid));
+    flexarray_append(back, "online");
+    flexarray_append(back, "1");
+    flexarray_append(back, "state");
+    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(back, "domain");
+    flexarray_append(back, libxl__domid_to_name(&gc, domid));
+
+    flexarray_append(front, "backend-id");
+    flexarray_append(front, libxl__sprintf(&gc, "%d", vkb->backend_domid));
+    flexarray_append(front, "state");
+    flexarray_append(front, libxl__sprintf(&gc, "%d", 1));
 
     libxl__device_generic_add(ctx, &device,
-                             libxl__xs_kvs_of_flexarray(&gc, back, boffset),
-                             libxl__xs_kvs_of_flexarray(&gc, front, foffset));
+                             libxl__xs_kvs_of_flexarray(&gc, back, 
back->count),
+                             libxl__xs_kvs_of_flexarray(&gc, front, 
front->count));
     rc = 0;
 out_free:
     flexarray_free(back);
@@ -1904,8 +1895,6 @@ int libxl_device_vfb_add(libxl_ctx *ctx,
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     flexarray_t *front;
     flexarray_t *back;
-    unsigned int boffset = 0;
-    unsigned int foffset = 0;
     libxl__device device;
     int rc;
 
@@ -1927,45 +1916,31 @@ int libxl_device_vfb_add(libxl_ctx *ctx,
     device.domid = vfb->domid;
     device.kind = DEVICE_VFB;
 
-    flexarray_set(back, boffset++, "frontend-id");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", vfb->domid));
-    flexarray_set(back, boffset++, "online");
-    flexarray_set(back, boffset++, "1");
-    flexarray_set(back, boffset++, "state");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", 1));
-    flexarray_set(back, boffset++, "domain");
-    flexarray_set(back, boffset++, libxl__domid_to_name(&gc, domid));
-    flexarray_set(back, boffset++, "vnc");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", vfb->vnc));
-    flexarray_set(back, boffset++, "vnclisten");
-    flexarray_set(back, boffset++, vfb->vnclisten);
-    flexarray_set(back, boffset++, "vncpasswd");
-    flexarray_set(back, boffset++, vfb->vncpasswd);
-    flexarray_set(back, boffset++, "vncdisplay");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", vfb->vncdisplay));
-    flexarray_set(back, boffset++, "vncunused");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", vfb->vncunused));
-    flexarray_set(back, boffset++, "sdl");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", vfb->sdl));
-    flexarray_set(back, boffset++, "opengl");
-    flexarray_set(back, boffset++, libxl__sprintf(&gc, "%d", vfb->opengl));
+    flexarray_vappend(back, "frontend-id", libxl__sprintf(&gc, "%d", 
vfb->domid), NULL);
+    flexarray_vappend(back, "online", "1", NULL);
+    flexarray_vappend(back, "state", libxl__sprintf(&gc, "%d", 1), NULL);
+    flexarray_vappend(back, "domain", libxl__domid_to_name(&gc, domid), NULL);
+    flexarray_vappend(back, "vnc", libxl__sprintf(&gc, "%d", vfb->vnc), NULL);
+    flexarray_vappend(back, "vnclisten", vfb->vnclisten, NULL);
+    flexarray_append(back, "vncpasswd");
+    flexarray_append(back, vfb->vncpasswd);
+    flexarray_vappend(back, "vncdisplay", libxl__sprintf(&gc, "%d", 
vfb->vncdisplay), NULL);
+    flexarray_vappend(back, "vncunused", libxl__sprintf(&gc, "%d", 
vfb->vncunused), NULL);
+    flexarray_vappend(back, "sdl", libxl__sprintf(&gc, "%d", vfb->sdl), NULL);
+    flexarray_vappend(back, "opengl", libxl__sprintf(&gc, "%d", vfb->opengl), 
NULL);
     if (vfb->xauthority) {
-        flexarray_set(back, boffset++, "xauthority");
-        flexarray_set(back, boffset++, vfb->xauthority);
+        flexarray_vappend(back, "xauthority", vfb->xauthority, NULL);
     }
     if (vfb->display) {
-        flexarray_set(back, boffset++, "display");
-        flexarray_set(back, boffset++, vfb->display);
-    }
-
-    flexarray_set(front, foffset++, "backend-id");
-    flexarray_set(front, foffset++, libxl__sprintf(&gc, "%d", 
vfb->backend_domid));
-    flexarray_set(front, foffset++, "state");
-    flexarray_set(front, foffset++, libxl__sprintf(&gc, "%d", 1));
+        flexarray_vappend(back, "display", vfb->display, NULL);
+    }
+
+    flexarray_vappend(front, "backend-id", libxl__sprintf(&gc, "%d", 
vfb->backend_domid), NULL);
+    flexarray_vappend(front, "state", libxl__sprintf(&gc, "%d", 1), NULL);
 
     libxl__device_generic_add(ctx, &device,
-                             libxl__xs_kvs_of_flexarray(&gc, back, boffset),
-                             libxl__xs_kvs_of_flexarray(&gc, front, foffset));
+                             libxl__xs_kvs_of_flexarray(&gc, back, 
back->count),
+                             libxl__xs_kvs_of_flexarray(&gc, front, 
front->count));
     rc = 0;
 out_free:
     flexarray_free(front);
diff -r e1392f5327ce -r 03718b569d97 tools/libxl/libxl_dm.c
--- a/tools/libxl/libxl_dm.c    Fri Jan 07 18:24:54 2011 +0000
+++ b/tools/libxl/libxl_dm.c    Fri Jan 07 18:53:50 2011 +0000
@@ -32,101 +32,88 @@ static char ** libxl_build_device_model_
                                              libxl_device_nic *vifs,
                                              int num_vifs)
 {
-    int num = 0, i;
+    int i;
     flexarray_t *dm_args;
     dm_args = flexarray_make(16, 1);
 
     if (!dm_args)
         return NULL;
 
-    flexarray_set(dm_args, num++, "qemu-dm");
-    flexarray_set(dm_args, num++, "-d");
-
-    flexarray_set(dm_args, num++, libxl__sprintf(gc, "%d", info->domid));
-
-    if (info->dom_name) {
-        flexarray_set(dm_args, num++, "-domain-name");
-        flexarray_set(dm_args, num++, info->dom_name);
-    }
+    flexarray_vappend(dm_args, "qemu-dm", "-d", libxl__sprintf(gc, "%d", 
info->domid), NULL);
+
+    if (info->dom_name)
+        flexarray_vappend(dm_args, "-domain-name", info->dom_name, NULL);
+
     if (info->vnc || info->vncdisplay || info->vnclisten || info->vncunused) {
-        flexarray_set(dm_args, num++, "-vnc");
+        flexarray_append(dm_args, "-vnc");
         if (info->vncdisplay) {
             if (info->vnclisten && strchr(info->vnclisten, ':') == NULL) {
-                flexarray_set(
-                    dm_args, num++,
+                flexarray_append(dm_args, 
                     libxl__sprintf(gc, "%s:%d%s",
                                   info->vnclisten,
                                   info->vncdisplay,
                                   info->vncpasswd ? ",password" : ""));
             } else {
-                flexarray_set(dm_args, num++, libxl__sprintf(gc, 
"127.0.0.1:%d", info->vncdisplay));
+                flexarray_append(dm_args, libxl__sprintf(gc, "127.0.0.1:%d", 
info->vncdisplay));
             }
         } else if (info->vnclisten) {
             if (strchr(info->vnclisten, ':') != NULL) {
-                flexarray_set(dm_args, num++, info->vnclisten);
+                flexarray_append(dm_args, info->vnclisten);
             } else {
-                flexarray_set(dm_args, num++, libxl__sprintf(gc, "%s:0", 
info->vnclisten));
+                flexarray_append(dm_args, libxl__sprintf(gc, "%s:0", 
info->vnclisten));
             }
         } else {
-            flexarray_set(dm_args, num++, "127.0.0.1:0");
+            flexarray_append(dm_args, "127.0.0.1:0");
         }
         if (info->vncunused) {
-            flexarray_set(dm_args, num++, "-vncunused");
+            flexarray_append(dm_args, "-vncunused");
         }
     }
     if (info->sdl) {
-        flexarray_set(dm_args, num++, "-sdl");
+        flexarray_append(dm_args, "-sdl");
         if (!info->opengl) {
-            flexarray_set(dm_args, num++, "-disable-opengl");
+            flexarray_append(dm_args, "-disable-opengl");
         }
     }
     if (info->keymap) {
-        flexarray_set(dm_args, num++, "-k");
-        flexarray_set(dm_args, num++, info->keymap);
+        flexarray_vappend(dm_args, "-k", info->keymap, NULL);
     }
     if (info->nographic && (!info->sdl && !info->vnc)) {
-        flexarray_set(dm_args, num++, "-nographic");
+        flexarray_append(dm_args, "-nographic");
     }
     if (info->serial) {
-        flexarray_set(dm_args, num++, "-serial");
-        flexarray_set(dm_args, num++, info->serial);
+        flexarray_vappend(dm_args, "-serial", info->serial, NULL);
     }
     if (info->type == XENFV) {
         int ioemu_vifs = 0;
 
         if (info->videoram) {
-            flexarray_set(dm_args, num++, "-videoram");
-            flexarray_set(dm_args, num++, libxl__sprintf(gc, "%d", 
info->videoram));
+            flexarray_vappend(dm_args, "-videoram", libxl__sprintf(gc, "%d", 
info->videoram), NULL);
         }
         if (info->stdvga) {
-            flexarray_set(dm_args, num++, "-std-vga");
+            flexarray_append(dm_args, "-std-vga");
         }
 
         if (info->boot) {
-            flexarray_set(dm_args, num++, "-boot");
-            flexarray_set(dm_args, num++, info->boot);
+            flexarray_vappend(dm_args, "-boot", info->boot, NULL);
         }
         if (info->usb || info->usbdevice) {
-            flexarray_set(dm_args, num++, "-usb");
+            flexarray_append(dm_args, "-usb");
             if (info->usbdevice) {
-                flexarray_set(dm_args, num++, "-usbdevice");
-                flexarray_set(dm_args, num++, info->usbdevice);
+                flexarray_vappend(dm_args, "-usbdevice", info->usbdevice, 
NULL);
             }
         }
         if (info->soundhw) {
-            flexarray_set(dm_args, num++, "-soundhw");
-            flexarray_set(dm_args, num++, info->soundhw);
+            flexarray_vappend(dm_args, "-soundhw", info->soundhw, NULL);
         }
         if (info->apic) {
-            flexarray_set(dm_args, num++, "-acpi");
+            flexarray_append(dm_args, "-acpi");
         }
         if (info->vcpus > 1) {
-            flexarray_set(dm_args, num++, "-vcpus");
-            flexarray_set(dm_args, num++, libxl__sprintf(gc, "%d", 
info->vcpus));
+            flexarray_vappend(dm_args, "-vcpus", libxl__sprintf(gc, "%d", 
info->vcpus), NULL);
         }
         if (info->vcpu_avail) {
-            flexarray_set(dm_args, num++, "-vcpu_avail");
-            flexarray_set(dm_args, num++, libxl__sprintf(gc, "0x%x", 
info->vcpu_avail));
+            flexarray_vappend(dm_args, "-vcpu_avail", libxl__sprintf(gc, 
"0x%x", info->vcpu_avail), NULL);
         }
         for (i = 0; i < num_vifs; i++) {
             if (vifs[i].nictype == NICTYPE_IOEMU) {
@@ -138,33 +125,30 @@ static char ** libxl_build_device_model_
                     ifname = libxl__sprintf(gc, "tap%d.%d", info->domid, 
vifs[i].devid);
                 else
                     ifname = vifs[i].ifname;
-                flexarray_set(dm_args, num++, "-net");
-                flexarray_set(dm_args, num++, libxl__sprintf(gc, 
"nic,vlan=%d,macaddr=%s,model=%s",
-                            vifs[i].devid, smac, vifs[i].model));
-                flexarray_set(dm_args, num++, "-net");
-                flexarray_set(dm_args, num++, libxl__sprintf(gc, 
"tap,vlan=%d,ifname=%s,bridge=%s,script=no",
-                            vifs[i].devid, ifname, vifs[i].bridge));
+                flexarray_vappend(dm_args,
+                                "-net", libxl__sprintf(gc, 
"nic,vlan=%d,macaddr=%s,model=%s",
+                                                       vifs[i].devid, smac, 
vifs[i].model),
+                                "-net", libxl__sprintf(gc, 
"tap,vlan=%d,ifname=%s,bridge=%s,script=no",
+                                                       vifs[i].devid, ifname, 
vifs[i].bridge), NULL);
                 ioemu_vifs++;
             }
         }
         /* If we have no emulated nics, tell qemu not to create any */
         if ( ioemu_vifs == 0 ) {
-            flexarray_set(dm_args, num++, "-net");
-            flexarray_set(dm_args, num++, "none");
+            flexarray_vappend(dm_args, "-net", "none", NULL);
         }
     }
     if (info->saved_state) {
-        flexarray_set(dm_args, num++, "-loadvm");
-        flexarray_set(dm_args, num++, info->saved_state);
+        flexarray_vappend(dm_args, "-loadvm", info->saved_state, NULL);
     }
     for (i = 0; info->extra && info->extra[i] != NULL; i++)
-        flexarray_set(dm_args, num++, info->extra[i]);
-    flexarray_set(dm_args, num++, "-M");
+        flexarray_append(dm_args, info->extra[i]);
+    flexarray_append(dm_args, "-M");
     if (info->type == XENPV)
-        flexarray_set(dm_args, num++, "xenpv");
+        flexarray_append(dm_args, "xenpv");
     else
-        flexarray_set(dm_args, num++, "xenfv");
-    flexarray_set(dm_args, num++, NULL);
+        flexarray_append(dm_args, "xenfv");
+    flexarray_append(dm_args, NULL);
     return (char **) flexarray_contents(dm_args);
 }
 
@@ -173,33 +157,29 @@ static char ** libxl_build_device_model_
                                              libxl_device_nic *vifs,
                                              int num_vifs)
 {
-    int num = 0, i;
     flexarray_t *dm_args;
-    int nb;
     libxl_device_disk *disks;
+    int nb, i;
 
     dm_args = flexarray_make(16, 1);
     if (!dm_args)
         return NULL;
 
-    flexarray_set(dm_args, num++, libxl__strdup(gc, info->device_model));
-
-    flexarray_set(dm_args, num++, "-xen-domid");
-    flexarray_set(dm_args, num++, libxl__sprintf(gc, "%d", info->domid));
+    flexarray_vappend(dm_args, libxl__strdup(gc, info->device_model),
+                        "-xen-domid", libxl__sprintf(gc, "%d", info->domid), 
NULL);
 
     if (info->type == XENPV) {
-        flexarray_set(dm_args, num++, "-xen-attach");
+        flexarray_append(dm_args, "-xen-attach");
     }
 
     if (info->dom_name) {
-        flexarray_set(dm_args, num++, "-name");
-        flexarray_set(dm_args, num++, info->dom_name);
+        flexarray_vappend(dm_args, "-name", info->dom_name, NULL);
     }
     if (info->vnc || info->vncdisplay || info->vnclisten || info->vncunused) {
         int display = 0;
         const char *listen = "127.0.0.1";
 
-        flexarray_set(dm_args, num++, "-vnc");
+        flexarray_append(dm_args, "-vnc");
 
         if (info->vncdisplay) {
             display = info->vncdisplay;
@@ -211,66 +191,59 @@ static char ** libxl_build_device_model_
         }
 
         if (strchr(listen, ':') != NULL)
-            flexarray_set(dm_args, num++,
+            flexarray_append(dm_args, 
                     libxl__sprintf(gc, "%s%s", listen,
                         info->vncunused ? ",to=99" : ""));
         else
-            flexarray_set(dm_args, num++,
+            flexarray_append(dm_args, 
                     libxl__sprintf(gc, "%s:%d%s", listen, display,
                         info->vncunused ? ",to=99" : ""));
     }
     if (info->sdl) {
-        flexarray_set(dm_args, num++, "-sdl");
+        flexarray_append(dm_args, "-sdl");
     }
 
     if (info->type == XENPV && !info->nographic) {
-        flexarray_set(dm_args, num++, "-vga");
-        flexarray_set(dm_args, num++, "xenfb");
+        flexarray_vappend(dm_args, "-vga", "xenfb", NULL);
     }
 
     if (info->keymap) {
-        flexarray_set(dm_args, num++, "-k");
-        flexarray_set(dm_args, num++, info->keymap);
+        flexarray_vappend(dm_args, "-k", info->keymap, NULL);
     }
     if (info->nographic && (!info->sdl && !info->vnc)) {
-        flexarray_set(dm_args, num++, "-nographic");
+        flexarray_append(dm_args, "-nographic");
     }
     if (info->serial) {
-        flexarray_set(dm_args, num++, "-serial");
-        flexarray_set(dm_args, num++, info->serial);
+        flexarray_vappend(dm_args, "-serial", info->serial, NULL);
     }
     if (info->type == XENFV) {
         int ioemu_vifs = 0;
 
         if (info->stdvga) {
-                flexarray_set(dm_args, num++, "-vga");
-                flexarray_set(dm_args, num++, "std");
+                flexarray_vappend(dm_args, "-vga", "std", NULL);
         }
 
         if (info->boot) {
-            flexarray_set(dm_args, num++, "-boot");
-            flexarray_set(dm_args, num++, libxl__sprintf(gc, "order=%s", 
info->boot));
+            flexarray_vappend(dm_args, "-boot", libxl__sprintf(gc, "order=%s", 
info->boot), NULL);
         }
         if (info->usb || info->usbdevice) {
-            flexarray_set(dm_args, num++, "-usb");
+            flexarray_append(dm_args, "-usb");
             if (info->usbdevice) {
-                flexarray_set(dm_args, num++, "-usbdevice");
-                flexarray_set(dm_args, num++, info->usbdevice);
+                flexarray_vappend(dm_args, "-usbdevice", info->usbdevice, 
NULL);
             }
         }
         if (info->soundhw) {
-            flexarray_set(dm_args, num++, "-soundhw");
-            flexarray_set(dm_args, num++, info->soundhw);
+            flexarray_vappend(dm_args, "-soundhw", info->soundhw, NULL);
         }
         if (!info->apic) {
-            flexarray_set(dm_args, num++, "-no-acpi");
+            flexarray_append(dm_args, "-no-acpi");
         }
         if (info->vcpus > 1) {
-            flexarray_set(dm_args, num++, "-smp");
+            flexarray_append(dm_args, "-smp");
             if (info->vcpu_avail)
-                flexarray_set(dm_args, num++, libxl__sprintf(gc, 
"%d,maxcpus=%d", info->vcpus, info->vcpu_avail));
+                flexarray_append(dm_args, libxl__sprintf(gc, "%d,maxcpus=%d", 
info->vcpus, info->vcpu_avail));
             else
-                flexarray_set(dm_args, num++, libxl__sprintf(gc, "%d", 
info->vcpus));
+                flexarray_append(dm_args, libxl__sprintf(gc, "%d", 
info->vcpus));
         }
         for (i = 0; i < num_vifs; i++) {
             if (vifs[i].nictype == NICTYPE_IOEMU) {
@@ -283,52 +256,52 @@ static char ** libxl_build_device_model_
                 } else {
                     ifname = vifs[i].ifname;
                 }
-                flexarray_set(dm_args, num++, "-net");
-                flexarray_set(dm_args, num++, libxl__sprintf(gc, 
"nic,vlan=%d,macaddr=%s,model=%s",
+                flexarray_append(dm_args, "-net");
+                flexarray_append(dm_args, libxl__sprintf(gc, 
"nic,vlan=%d,macaddr=%s,model=%s",
                             vifs[i].devid, smac, vifs[i].model));
-                flexarray_set(dm_args, num++, "-net");
-                flexarray_set(dm_args, num++, libxl__sprintf(gc, 
"tap,vlan=%d,ifname=%s,script=no",
+                flexarray_append(dm_args, "-net");
+                flexarray_append(dm_args, libxl__sprintf(gc, 
"tap,vlan=%d,ifname=%s,script=no",
                             vifs[i].devid, ifname));
                 ioemu_vifs++;
             }
         }
         /* If we have no emulated nics, tell qemu not to create any */
         if ( ioemu_vifs == 0 ) {
-            flexarray_set(dm_args, num++, "-net");
-            flexarray_set(dm_args, num++, "none");
+            flexarray_append(dm_args, "-net");
+            flexarray_append(dm_args, "none");
         }
     }
     if (info->saved_state) {
-        flexarray_set(dm_args, num++, "-loadvm");
-        flexarray_set(dm_args, num++, info->saved_state);
+        flexarray_append(dm_args, "-loadvm");
+        flexarray_append(dm_args, info->saved_state);
     }
     for (i = 0; info->extra && info->extra[i] != NULL; i++)
-        flexarray_set(dm_args, num++, info->extra[i]);
-    flexarray_set(dm_args, num++, "-M");
+        flexarray_append(dm_args, info->extra[i]);
+    flexarray_append(dm_args, "-M");
     if (info->type == XENPV)
-        flexarray_set(dm_args, num++, "xenpv");
+        flexarray_append(dm_args, "xenpv");
     else
-        flexarray_set(dm_args, num++, "xenfv");
+        flexarray_append(dm_args, "xenfv");
 
     /* RAM Size */
-    flexarray_set(dm_args, num++, "-m");
-    flexarray_set(dm_args, num++, libxl__sprintf(gc, "%d", info->target_ram));
+    flexarray_append(dm_args, "-m");
+    flexarray_append(dm_args, libxl__sprintf(gc, "%d", info->target_ram));
 
     if (info->type == XENFV) {
         disks = libxl_device_disk_list(libxl__gc_owner(gc), info->domid, &nb);
         for (i; i < nb; i++) {
             if (disks[i].is_cdrom) {
-                flexarray_set(dm_args, num++, "-cdrom");
-                flexarray_set(dm_args, num++, libxl__strdup(gc, 
disks[i].physpath));
+                flexarray_append(dm_args, "-cdrom");
+                flexarray_append(dm_args, libxl__strdup(gc, 
disks[i].physpath));
             } else {
-                flexarray_set(dm_args, num++, libxl__sprintf(gc, "-%s", 
disks[i].virtpath));
-                flexarray_set(dm_args, num++, libxl__strdup(gc, 
disks[i].physpath));
+                flexarray_append(dm_args, libxl__sprintf(gc, "-%s", 
disks[i].virtpath));
+                flexarray_append(dm_args, libxl__strdup(gc, 
disks[i].physpath));
             }
             libxl_device_disk_destroy(&disks[i]);
         }
         free(disks);
     }
-    flexarray_set(dm_args, num++, NULL);
+    flexarray_append(dm_args, NULL);
     return (char **) flexarray_contents(dm_args);
 }
 
diff -r e1392f5327ce -r 03718b569d97 tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c   Fri Jan 07 18:24:54 2011 +0000
+++ b/tools/libxl/libxl_pci.c   Fri Jan 07 18:53:50 2011 +0000
@@ -226,8 +226,6 @@ static int libxl_create_pci_backend(libx
     libxl_ctx *ctx = libxl__gc_owner(gc);
     flexarray_t *front;
     flexarray_t *back;
-    unsigned int boffset = 0;
-    unsigned int foffset = 0;
     libxl__device device;
     int i;
 
@@ -248,39 +246,28 @@ static int libxl_create_pci_backend(libx
     device.domid = domid;
     device.kind = DEVICE_PCI;
 
-    flexarray_set(back, boffset++, "frontend-id");
-    flexarray_set(back, boffset++, libxl__sprintf(gc, "%d", domid));
-    flexarray_set(back, boffset++, "online");
-    flexarray_set(back, boffset++, "1");
-    flexarray_set(back, boffset++, "state");
-    flexarray_set(back, boffset++, libxl__sprintf(gc, "%d", 1));
-    flexarray_set(back, boffset++, "domain");
-    flexarray_set(back, boffset++, libxl__domid_to_name(gc, domid));
+    flexarray_vappend(back, "frontend-id", libxl__sprintf(gc, "%d", domid),
+                     "online", "1", "state", libxl__sprintf(gc, "%d", 1),
+                    "domain", libxl__domid_to_name(gc, domid), NULL);
     for (i = 0; i < num; i++) {
-        flexarray_set(back, boffset++, libxl__sprintf(gc, "key-%d", i));
-        flexarray_set(back, boffset++, libxl__sprintf(gc, PCI_BDF, 
pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func));
-        flexarray_set(back, boffset++, libxl__sprintf(gc, "dev-%d", i));
-        flexarray_set(back, boffset++, libxl__sprintf(gc, PCI_BDF, 
pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func));
+        flexarray_append(back, libxl__sprintf(gc, "key-%d", i));
+        flexarray_append(back, libxl__sprintf(gc, PCI_BDF, pcidev->domain, 
pcidev->bus, pcidev->dev, pcidev->func));
+        flexarray_append(back, libxl__sprintf(gc, "dev-%d", i));
+        flexarray_append(back, libxl__sprintf(gc, PCI_BDF, pcidev->domain, 
pcidev->bus, pcidev->dev, pcidev->func));
         if (pcidev->vdevfn) {
-            flexarray_set(back, boffset++, libxl__sprintf(gc, "vdevfn-%d", i));
-            flexarray_set(back, boffset++, libxl__sprintf(gc, "%x", 
pcidev->vdevfn));
-        }
-        flexarray_set(back, boffset++, libxl__sprintf(gc, "opts-%d", i));
-        flexarray_set(back, boffset++, libxl__sprintf(gc, 
"msitranslate=%d,power_mgmt=%d", pcidev->msitranslate, pcidev->power_mgmt));
-        flexarray_set(back, boffset++, libxl__sprintf(gc, "state-%d", i));
-        flexarray_set(back, boffset++, libxl__sprintf(gc, "%d", 1));
-    }
-    flexarray_set(back, boffset++, "num_devs");
-    flexarray_set(back, boffset++, libxl__sprintf(gc, "%d", num));
-
-    flexarray_set(front, foffset++, "backend-id");
-    flexarray_set(front, foffset++, libxl__sprintf(gc, "%d", 0));
-    flexarray_set(front, foffset++, "state");
-    flexarray_set(front, foffset++, libxl__sprintf(gc, "%d", 1));
+            flexarray_vappend(back, libxl__sprintf(gc, "vdevfn-%d", i), 
libxl__sprintf(gc, "%x", pcidev->vdevfn), NULL);
+        }
+        flexarray_append(back, libxl__sprintf(gc, "opts-%d", i));
+        flexarray_append(back, libxl__sprintf(gc, 
"msitranslate=%d,power_mgmt=%d", pcidev->msitranslate, pcidev->power_mgmt));
+        flexarray_vappend(back, libxl__sprintf(gc, "state-%d", i), 
libxl__sprintf(gc, "%d", 1), NULL);
+    }
+    flexarray_vappend(back, "num_devs", libxl__sprintf(gc, "%d", num),
+                    "backend-id", libxl__sprintf(gc, "%d", 0),
+                    "state", libxl__sprintf(gc, "%d", 1), NULL);
 
     libxl__device_generic_add(ctx, &device,
-                             libxl__xs_kvs_of_flexarray(gc, back, boffset),
-                             libxl__xs_kvs_of_flexarray(gc, front, foffset));
+                             libxl__xs_kvs_of_flexarray(gc, back, back->count),
+                             libxl__xs_kvs_of_flexarray(gc, front, 
front->count));
 
     flexarray_free(back);
     flexarray_free(front);
@@ -293,7 +280,6 @@ static int libxl_device_pci_add_xenstore
     flexarray_t *back;
     char *num_devs, *be_path;
     int num = 0;
-    unsigned int boffset = 0;
     xs_transaction_t t;
 
     be_path = libxl__sprintf(gc, "%s/backend/pci/%d/0", 
libxl__xs_get_dompath(gc, 0), domid);
@@ -312,27 +298,24 @@ static int libxl_device_pci_add_xenstore
 
     LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Adding new pci device to xenstore");
     num = atoi(num_devs);
-    flexarray_set(back, boffset++, libxl__sprintf(gc, "key-%d", num));
-    flexarray_set(back, boffset++, libxl__sprintf(gc, PCI_BDF, pcidev->domain, 
pcidev->bus, pcidev->dev, pcidev->func));
-    flexarray_set(back, boffset++, libxl__sprintf(gc, "dev-%d", num));
-    flexarray_set(back, boffset++, libxl__sprintf(gc, PCI_BDF, pcidev->domain, 
pcidev->bus, pcidev->dev, pcidev->func));
+    flexarray_append(back, libxl__sprintf(gc, "key-%d", num));
+    flexarray_append(back, libxl__sprintf(gc, PCI_BDF, pcidev->domain, 
pcidev->bus, pcidev->dev, pcidev->func));
+    flexarray_append(back, libxl__sprintf(gc, "dev-%d", num));
+    flexarray_append(back, libxl__sprintf(gc, PCI_BDF, pcidev->domain, 
pcidev->bus, pcidev->dev, pcidev->func));
     if (pcidev->vdevfn) {
-        flexarray_set(back, boffset++, libxl__sprintf(gc, "vdevfn-%d", num));
-        flexarray_set(back, boffset++, libxl__sprintf(gc, "%x", 
pcidev->vdevfn));
-    }
-    flexarray_set(back, boffset++, libxl__sprintf(gc, "opts-%d", num));
-    flexarray_set(back, boffset++, libxl__sprintf(gc, 
"msitranslate=%d,power_mgmt=%d", pcidev->msitranslate, pcidev->power_mgmt));
-    flexarray_set(back, boffset++, libxl__sprintf(gc, "state-%d", num));
-    flexarray_set(back, boffset++, libxl__sprintf(gc, "%d", 1));
-    flexarray_set(back, boffset++, "num_devs");
-    flexarray_set(back, boffset++, libxl__sprintf(gc, "%d", num + 1));
-    flexarray_set(back, boffset++, "state");
-    flexarray_set(back, boffset++, libxl__sprintf(gc, "%d", 7));
+        flexarray_append(back, libxl__sprintf(gc, "vdevfn-%d", num));
+        flexarray_append(back, libxl__sprintf(gc, "%x", pcidev->vdevfn));
+    }
+    flexarray_append(back, libxl__sprintf(gc, "opts-%d", num));
+    flexarray_append(back, libxl__sprintf(gc, "msitranslate=%d,power_mgmt=%d", 
pcidev->msitranslate, pcidev->power_mgmt));
+    flexarray_vappend(back, libxl__sprintf(gc, "state-%d", num), 
libxl__sprintf(gc, "%d", 1), NULL);
+    flexarray_vappend(back, "num_devs", libxl__sprintf(gc, "%d", num + 1), 
NULL);
+    flexarray_vappend(back, "state", libxl__sprintf(gc, "%d", 7), NULL);
 
 retry_transaction:
     t = xs_transaction_start(ctx->xsh);
     libxl__xs_writev(gc, t, be_path,
-                    libxl__xs_kvs_of_flexarray(gc, back, boffset));
+                    libxl__xs_kvs_of_flexarray(gc, back, back->count));
     if (!xs_transaction_end(ctx->xsh, t, 0))
         if (errno == EAGAIN)
             goto retry_transaction;

_______________________________________________
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®.