xenstore: cleanups
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.
Signed-off-by Christoph Egger <[email protected]>
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
@@ -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
@@ -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