common: make sure *alloc(0) returns NULL.
authorKrisztian Litkey <kli@iki.fi>
Sat, 16 Mar 2013 11:16:23 +0000 (13:16 +0200)
committerKrisztian Litkey <krisztian.litkey@intel.com>
Wed, 27 Mar 2013 09:14:16 +0000 (11:14 +0200)
The C standard allows [mc]alloc(0) to return a unique non-NULL pointer
instead of NULL and indeed the stock allocator in recent versions of
glibc does behave this way. We prefer our zero-sized chunks of memory
to be represented by NULL, so we take care of this in the allocator
wrappers.

src/common/mm.c

index 030d7ad..4b9222f 100644 (file)
@@ -284,23 +284,27 @@ static memblk_t *memblk_alloc(size_t size, const char *file, int line,
 {
     memblk_t *blk;
 
-    if ((blk = malloc(__mm.hdrsize + size)) != NULL) {
-        mrp_list_init(&blk->hook);
-        mrp_list_init(&blk->more);
-        mrp_list_append(&__mm.blocks, &blk->hook);
+    if (MRP_UNLIKELY(size == 0))
+        blk = NULL;
+    else {
+        if ((blk = malloc(__mm.hdrsize + size)) != NULL) {
+            mrp_list_init(&blk->hook);
+            mrp_list_init(&blk->more);
+            mrp_list_append(&__mm.blocks, &blk->hook);
 
-        blk->file = file;
-        blk->line = line;
-        blk->func = func;
-        blk->size = size;
+            blk->file = file;
+            blk->line = line;
+            blk->func = func;
+            blk->size = size;
 
-        memcpy(blk->bt, bt, __mm.depth * sizeof(*bt));
+            memcpy(blk->bt, bt, __mm.depth * sizeof(*bt));
 
-        __mm.cur_blocks++;
-        __mm.cur_alloc += size;
+            __mm.cur_blocks++;
+            __mm.cur_alloc += size;
 
-        __mm.max_blocks = MRP_MAX(__mm.max_blocks, __mm.cur_blocks);
-        __mm.max_alloc  = MRP_MAX(__mm.max_alloc , __mm.cur_alloc);
+            __mm.max_blocks = MRP_MAX(__mm.max_blocks, __mm.cur_blocks);
+            __mm.max_alloc  = MRP_MAX(__mm.max_alloc , __mm.cur_alloc);
+        }
     }
 
     return blk;
@@ -487,7 +491,10 @@ static void *__passthru_alloc(size_t size, const char *file, int line,
     MRP_UNUSED(line);
     MRP_UNUSED(func);
 
-    return malloc(size);
+    if (MRP_UNLIKELY(size == 0))
+        return NULL;
+    else
+        return malloc(size);
 }