slab: clarify init func input, make _destroy() accept NULL
authorMarko Kreen <markokr@gmail.com>
Fri, 23 Oct 2009 09:11:57 +0000 (12:11 +0300)
committerMarko Kreen <markokr@gmail.com>
Tue, 8 Dec 2009 12:03:18 +0000 (14:03 +0200)
usual/slab.c

index bfba6d0603ad3ea77e9bd1bccd1c4bf7f2b08651..3beffa95b2ef9a95c4d3905da30791781efcb62e 100644 (file)
@@ -20,6 +20,8 @@
  * Basic behaviour:
  * - On each alloc initializer is called.
  * - if init func is not given, memset() is done
+ * - init func gets either zeroed obj or old obj from _free().
+ *   'struct List' on obj start is non-zero.
  *
  * ATM custom 'align' larger than malloc() alignment does not work.
  */
@@ -109,6 +111,9 @@ void slab_destroy(struct Slab *slab)
        struct List *item, *tmp;
        struct SlabFrag *frag;
 
+       if (!slab)
+               return;
+
        statlist_for_each_safe(item, &slab->fraglist, tmp) {
                frag = container_of(item, struct SlabFrag, head);
                free(frag);
@@ -134,12 +139,11 @@ static void grow(struct Slab *slab)
        size = count * slab->final_size;
 
        /* allocate & init */
-       frag = malloc(size + sizeof(struct SlabFrag));
+       frag = calloc(1, size + sizeof(struct SlabFrag));
        if (!frag)
                return;
        list_init(&frag->head);
        area = (char *)frag + sizeof(struct SlabFrag);
-       memset(area, 0, size);
 
        /* init objects */
        for (i = 0; i < count; i++) {