aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIan Jackson <ian.jackson@eu.citrix.com>2011-12-12 17:48:40 +0000
committerIan Jackson <ian.jackson@eu.citrix.com>2011-12-12 17:48:40 +0000
commit814268e81de4722244c775627b736a9ff76cdeda (patch)
tree12587bd1f103bceafa5b43009e558a3f6f179ec4
parente66ba879d163f9e58eca843f4669616cc49c2f66 (diff)
downloadxen-814268e81de4722244c775627b736a9ff76cdeda.tar.gz
xen-814268e81de4722244c775627b736a9ff76cdeda.tar.bz2
xen-814268e81de4722244c775627b736a9ff76cdeda.zip
libxl: internal convenience macros
Provide some macros which are useful shorthands for use within libxl: * GC_INIT to initialise a gc from a ctx and GC_FREE to free it * CTX(gc) to give you back the ctx * LIBXL_TAILQ_INSERT_SORTED for inserting things into sorted lists These will be used by later patches. Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com> Acked-by: Ian Campbell <ian.campbell@citrix.com> Committed-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
-rw-r--r--tools/libxl/libxl_internal.h48
1 files changed, 48 insertions, 0 deletions
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index c462c0d3ef..bab6f62503 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -647,6 +647,54 @@ _hidden libxl__json_object *libxl__json_parse(libxl__gc *gc, const char *s);
_hidden libxl_device_model_version
libxl__device_model_version_running(libxl__gc *gc, uint32_t domid);
+
+/*
+ * Convenience macros.
+ */
+
+
+/*
+ * All of these assume (or define)
+ * libxl__gc *gc;
+ * as a local variable.
+ */
+
+#define GC_INIT(ctx) libxl__gc gc[1] = { LIBXL_INIT_GC(ctx) }
+#define GC_FREE libxl__free_all(gc)
+#define CTX libxl__gc_owner(gc)
+
+
+/*
+ * Inserts "elm_new" into the sorted list "head".
+ *
+ * "elm_search" must be a loop search variable of the same type as
+ * "elm_new". "new_after_search_p" must be an expression which is
+ * true iff the element "elm_new" sorts after the element
+ * "elm_search".
+ *
+ * "search_body" can be empty, or some declaration(s) and statement(s)
+ * needed for "new_after_search_p".
+ */
+#define LIBXL_TAILQ_INSERT_SORTED(head, entry, elm_new, elm_search, \
+ search_body, new_after_search_p) \
+ do { \
+ for ((elm_search) = LIBXL_TAILQ_FIRST((head)); \
+ (elm_search); \
+ (elm_search) = LIBXL_TAILQ_NEXT((elm_search), entry)) { \
+ search_body; \
+ if (!(new_after_search_p)) \
+ break; \
+ } \
+ /* now elm_search is either the element before which we want \
+ * to place elm_new, or NULL meaning we want to put elm_new at \
+ * the end */ \
+ if ((elm_search)) \
+ LIBXL_TAILQ_INSERT_BEFORE((elm_search), (elm_new), entry); \
+ else \
+ LIBXL_TAILQ_INSERT_TAIL((head), (elm_new), entry); \
+ } while(0)
+
+
#endif
/*