Improved a confusing sentence in the description of subcomponent
[rsync/rsync.git] / lib / pool_alloc.c
index acb356a..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,
@@ -85,7 +94,8 @@ pool_destroy(alloc_pool_t p)
        free(pool);
 }
 
-void *pool_alloc(alloc_pool_t p, size_t len, char *bomb)
+void *
+pool_alloc(alloc_pool_t p, size_t len, char *bomb)
 {
        struct alloc_pool *pool = (struct alloc_pool *) p;
        if (!pool)
@@ -128,14 +138,14 @@ void *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;
@@ -153,7 +163,7 @@ void *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)
@@ -189,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);
@@ -206,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;
@@ -217,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)
@@ -287,11 +297,8 @@ pool_stats(alloc_pool_t p, int fd, int summarize)
        strcpy(buf, "   FREE    BOUND\n");
        write(fd, buf, strlen(buf));
 
-       cur = pool->free;
-       while (cur)
+       for (cur = pool->free; cur; cur = cur->next)
        {
                FDEXTSTAT(cur);
-               cur = cur->next;
        }
 }
-