Skip to contentSkip to conversation

xenstore: cleanups

PATCH New Christoph Egger 1 participant 1 message Jun 10, 2008

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 xenstore: cleanups

Hi!

Attached patch uses calloc() for hash allocation. This makes sure, the allocated memory is always initialized. Also cleanup error handling a bit.

On *BSD avoid conflicts with BSD list macros.

Signature · 12 lines
AMD Saxony, Dresden, Germany
Operating System Research Center

Legal Information:
AMD Saxony Limited Liability Company & Co. KG
Sitz (Geschäftsanschrift):
   Wilschdorfer Landstr. 101, 01109 Dresden, Deutschland
Registergericht Dresden: HRA 4896
vertretungsberechtigter Komplementär:
   AMD Saxony LLC (Sitz Wilmington, Delaware, USA)
Geschäftsführer der AMD Saxony LLC:
   Dr. Hans-R. Deppe, Thomas McCoy
tools/xenstore/hashtable.c +17 -8
diff -r 7a0f1bf86516 tools/xenstore/hashtable.c
@@ -33,17 +33,22 @@ create_hashtable(unsigned int minsize,
 {
     struct hashtable *h;
     unsigned int pindex, size = primes[0];
+
     /* Check requested hashtable isn't too large */
     if (minsize > (1u << 30)) return NULL;
+
     /* Enforce size as prime */
     for (pindex=0; pindex < prime_table_length; pindex++) {
         if (primes[pindex] > minsize) { size = primes[pindex]; break; }
     }
-    h = (struct hashtable *)malloc(sizeof(struct hashtable));
-    if (NULL == h) return NULL; /*oom*/
-    h->table = (struct entry **)malloc(sizeof(struct entry*) * size);
-    if (NULL == h->table) { free(h); return NULL; } /*oom*/
-    memset(h->table, 0, size * sizeof(struct entry *));
+
+    h = (struct hashtable *)calloc(1, sizeof(struct hashtable));
+    if (NULL == h)
+        goto err0;
+    h->table = (struct entry **)calloc(size, sizeof(struct entry *));
+    if (NULL == h->table)
+        goto err1;
+
     h->tablelength  = size;
     h->primeindex   = pindex;
     h->entrycount   = 0;
@@ -51,6 +56,11 @@ create_hashtable(unsigned int minsize,
     h->eqfn         = eqf;
     h->loadlimit    = (unsigned int)(((uint64_t)size * max_load_factor) / 100);
     return h;
+
+err0:
+   free(h);
+err1:
+   return NULL;
 }
 
 /*****************************************************************************/
@@ -80,10 +90,9 @@ hashtable_expand(struct hashtable *h)
     if (h->primeindex == (prime_table_length - 1)) return 0;
     newsize = primes[++(h->primeindex)];
 
-    newtable = (struct entry **)malloc(sizeof(struct entry*) * newsize);
+    newtable = (struct entry **)calloc(newsize, sizeof(struct entry*));
     if (NULL != newtable)
     {
-        memset(newtable, 0, newsize * sizeof(struct entry *));
         /* This algorithm is not 'stable'. ie. it reverses the list
          * when it transfers entries between the tables */
         for (i = 0; i < h->tablelength; i++) {
@@ -149,7 +158,7 @@ hashtable_insert(struct hashtable *h, vo
          * element may be ok. Next time we insert, we'll try expanding again.*/
         hashtable_expand(h);
     }
-    e = (struct entry *)malloc(sizeof(struct entry));
+    e = (struct entry *)calloc(1, sizeof(struct entry));
     if (NULL == e) { --(h->entrycount); return 0; } /*oom*/
     e->h = hash(h,k);
     index = indexFor(h->tablelength,e->h);
tools/xenstore/list.h +4 -0
diff -r 7a0f1bf86516 tools/xenstore/list.h
@@ -2,6 +2,10 @@
 #define _LINUX_LIST_H
 /* Taken from Linux kernel code, but de-kernelized for userspace. */
 #include <stddef.h>
+
+#undef LIST_HEAD_INIT
+#undef LIST_HEAD
+#undef INIT_LIST_HEAD
 
 /*
  * These are non-NULL pointers that will result in page faults

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel