ucx/mempool.c

changeset 17
11dffb40cd91
parent 5
88625853ae74
child 40
a95ee94b9204
--- a/ucx/mempool.c	Fri Aug 16 12:41:30 2013 +0200
+++ b/ucx/mempool.c	Sat Aug 17 12:04:04 2013 +0200
@@ -36,13 +36,23 @@
 
 #include "mempool.h"
 
+/** Capsule for destructible memory chunks. */
 typedef struct {
+    /** The destructor for the memory chunk. */
     ucx_destructor destructor;
+    /**
+     * First byte of the memory chunk.
+     * Note, that the address <code>&amp;c</code> is also the address
+     * of the whole memory chunk.
+     */
     char c;
 } ucx_memchunk;
 
+/** Capsule for data and its destructor. */
 typedef struct {
+    /** The destructor for the data. */
     ucx_destructor destructor;
+    /** A pointer to the data. */
     void           *ptr;
 } ucx_regdestr;
 
@@ -80,16 +90,18 @@
 }
 
 void *ucx_mempool_malloc(UcxMempool *pool, size_t n) {
+    if (pool->ndata >= pool->size) {
+        // The hard coded 16 is documented for this function and ucx_mempool_new
+        if (ucx_mempool_chcap(pool, pool->size + 16) == EXIT_FAILURE) {
+            return NULL;
+        }
+    }
+
     ucx_memchunk *mem = (ucx_memchunk*)malloc(sizeof(ucx_destructor) + n);
     if (!mem) {
         return NULL;
     }
 
-    if (pool->ndata >= pool->size) {
-        // The hard coded 16 is documented for this function and ucx_mempool_new
-        ucx_mempool_chcap(pool, pool->size + 16);
-     }
-
     mem->destructor = NULL;
     pool->data[pool->ndata] = mem;
     pool->ndata++;
@@ -121,7 +133,7 @@
         }
         fprintf(stderr, "FATAL: 0x%08" PRIxPTR" not in mpool 0x%08" PRIxPTR"\n",
           (intptr_t)ptr, (intptr_t)pool);
-        exit(1);
+        exit(EXIT_FAILURE);
     } else {
         return newm + sizeof(ucx_destructor);
     }
@@ -132,12 +144,13 @@
     for(size_t i=0 ; i<pool->ndata ; i++) {
         if(chunk == pool->data[i]) {
             if(chunk->destructor != NULL) {
-                chunk->destructor(&chunk->c);
+                chunk->destructor(&(chunk->c));
             }
             free(chunk);
             size_t last_index = pool->ndata - 1;
             if(i != last_index) {
                 pool->data[i] = pool->data[last_index];
+                pool->data[last_index] = NULL;
             }
             pool->ndata--;
             return;

mercurial