Improved a confusing sentence in the description of subcomponent
[rsync/rsync.git] / lib / pool_alloc.c
index 4c93ea1..5cf9fbc 100644 (file)
@@ -32,7 +32,16 @@ struct pool_extent
        struct pool_extent      *next;
 };
 
-#define MINALIGN       (sizeof (void *))
+struct align_test {
+    void *foo;
+    uint64 bar;
+};
+
+#define MINALIGN       offsetof(struct align_test, bar)
+
+/* Temporarily cast a void* var into a char* var when adding an offset (to
+ * keep some compilers from complaining about the pointer arithmetic). */
+#define PTR_ADD(b,o)   ( (void*) ((char*)(b) + (o)) )
 
 alloc_pool_t
 pool_create(size_t size, size_t quantum,
@@ -90,12 +99,7 @@ pool_alloc(alloc_pool_t p, size_t len, char *bomb)
 {
        struct alloc_pool *pool = (struct alloc_pool *) p;
        if (!pool)
-       {
-               char *msg;
-               if (asprintf(&msg, "pool_alloc(%s) on NULL pool", bomb) > 0)
-                       bomb = msg;
-               goto bomb;
-       }
+               return NULL;
 
        if (!len)
                len = pool->quantum;
@@ -134,14 +138,14 @@ pool_alloc(alloc_pool_t p, size_t len, char *bomb)
 
                if (pool->flags & POOL_APPEND)
                {
-                       pool->live = start + free;
+                       pool->live = PTR_ADD(start, free);
                }
                else if (!(pool->live = (struct pool_extent *) malloc(sizeof (struct pool_extent))))
                {
                        goto bomb;
                }
                if (pool->flags & POOL_QALIGN && pool->quantum > 1
-                   && (sqew = (size_t)(start + free) % pool->quantum))
+                   && (sqew = (size_t)PTR_ADD(start, free) % pool->quantum))
                {
                        bound  += sqew;
                        free -= sqew;
@@ -159,7 +163,7 @@ pool_alloc(alloc_pool_t p, size_t len, char *bomb)
 
        pool->live->free -= len;
 
-       return pool->live->start + pool->live->free;
+       return PTR_ADD(pool->live->start, pool->live->free);
 
 bomb:
        if (pool->bomb)
@@ -195,9 +199,9 @@ pool_free(alloc_pool_t p, size_t len, void *addr)
        cur = pool->live;
        if (cur
            && addr >= cur->start
-           && addr < cur->start + pool->size)
+           && addr < PTR_ADD(cur->start, pool->size))
        {
-               if (addr == cur->start + cur->free)
+               if (addr == PTR_ADD(cur->start, cur->free))
                {
                        if (pool->flags & POOL_CLEAR)
                                memset(addr, 0, len);
@@ -212,7 +216,7 @@ pool_free(alloc_pool_t p, size_t len, void *addr)
                        cur->free = pool->size;
                        cur->bound = 0;
                        if (pool->flags & POOL_QALIGN && pool->quantum > 1
-                           && (sqew = (size_t)(cur->start + cur->free) % pool->quantum))
+                           && (sqew = (size_t)PTR_ADD(cur->start, cur->free) % pool->quantum))
                        {
                                cur->bound += sqew;
                                cur->free -= sqew;
@@ -223,7 +227,7 @@ pool_free(alloc_pool_t p, size_t len, void *addr)
        for (prev = NULL, cur = pool->free; cur; prev = cur, cur = cur->next)
        {
                if (addr >= cur->start
-                   && addr < cur->start + pool->size)
+                   && addr < PTR_ADD(cur->start, pool->size))
                        break;
        }
        if (!cur)