aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel P. Berrange <berrange@redhat.com>2008-05-08 14:49:53 +0000
committerDaniel P. Berrange <berrange@redhat.com>2008-05-08 14:49:53 +0000
commitd9691ab277a590f47c151b2d93e27858885b0b21 (patch)
tree30c2f832be23f5ac1f80ffd94bd7b1a8f99121be /HACKING
parentAdded disk target bus type to Xen driver (diff)
downloadlibvirt-d9691ab277a590f47c151b2d93e27858885b0b21.tar.gz
libvirt-d9691ab277a590f47c151b2d93e27858885b0b21.tar.bz2
libvirt-d9691ab277a590f47c151b2d93e27858885b0b21.zip
Added some notes about libvirt string/memory/buffer functions
Diffstat (limited to 'HACKING')
-rw-r--r--HACKING115
1 files changed, 115 insertions, 0 deletions
diff --git a/HACKING b/HACKING
index a90addc8b..e780ce779 100644
--- a/HACKING
+++ b/HACKING
@@ -43,3 +43,118 @@ Note that sometimes you'll have to postprocess that output further, by
piping it through "expand -i", since some leading TABs can get through.
Usually they're in macro definitions or strings, and should be converted
anyhow.
+
+
+Low level memory management
+===========================
+
+Use of the malloc/free/realloc/calloc APIs is deprecated in the libvirt
+codebase, because they encourage a number of serious coding bugs and do
+not enable compile time verification of checks for NULL. Instead of these
+routines, use the macros from memory.h
+
+ - eg to allocate a single object:
+
+ virDomainPtr domain;
+
+ if (VIR_ALLOC(domain) < 0) {
+ __virRaiseError(VIR_ERROR_NO_MEMORY)
+ return NULL;
+ }
+
+
+ - eg to allocate an array of objects
+
+ virDomainPtr domains;
+ int ndomains = 10;
+
+ if (VIR_ALLOC_N(domains, ndomains) < 0) {
+ __virRaiseError(VIR_ERROR_NO_MEMORY)
+ return NULL;
+ }
+
+ - eg to allocate an array of object pointers
+
+ virDomainPtr *domains;
+ int ndomains = 10;
+
+ if (VIR_ALLOC_N(domains, ndomains) < 0) {
+ __virRaiseError(VIR_ERROR_NO_MEMORY)
+ return NULL;
+ }
+
+ - eg to re-allocate the array of domains to be longer
+
+ ndomains = 20
+
+ if (VIR_REALLOC_N(domains, ndomains) < 0) {
+ __virRaiseError(VIR_ERROR_NO_MEMORY)
+ return NULL;
+ }
+
+ - eg to free the domain
+
+ VIR_FREE(domain);
+
+
+
+String comparisons
+==================
+
+Do not use the strcmp, strncmp, etc functions directly. Instead use
+one of the following semantically named macros
+
+ - For strict equality:
+
+ STREQ(a,b)
+ STRNEQ(a,b)
+
+ - For case sensitive equality:
+ STRCASEEQ(a,b)
+ STRCASENEQ(a,b)
+
+ - For strict equality of a substring:
+
+ STREQLEN(a,b,n)
+ STRNEQLEN(a,b,n)
+
+ - For case sensitive equality of a substring:
+
+ STRCASEEQLEN(a,b,n)
+ STRCASENEQLEN(a,b,n)
+
+ - For strict equality of a prefix:
+
+ STRPREFIX(a,b)
+
+
+
+Variable length string buffer
+=============================
+
+If there is a need for complex string concatenations, avoid using
+the usual sequence of malloc/strcpy/strcat/snprintf functions and
+make use of the virBuffer API described in buf.h
+
+eg typical usage is as follows:
+
+ char *
+ somefunction(...) {
+ virBuffer buf = VIR_BUFFER_INITIALIZER;
+
+ ...
+
+ virBufferAddLit(&buf, "<domain>\n");
+ virBufferVSprint(&buf, " <memory>%d</memory>\n", memory);
+ ...
+ virBufferAddLit(&buf, "</domain>\n");
+
+ ....
+
+ if (virBufferError(&buf)) {
+ __virRaiseError(...);
+ return NULL;
+ }
+
+ return virBufferContentAndReset(&buf);
+ }