From ac6c8805be9a29cb3c64c2fee6efffae516cf7d8 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 18 Oct 2018 16:12:28 +0200 Subject: [PATCH] BUILD: memory: fix pointer declaration for atomic CAS The calls to HA_ATOMIC_CAS() on the lockfree version of the pool allocator were mistakenly done on (void*) for the old value instead of (void **). While this has no impact on "recent" gcc, it does have one for gcc < 4.7 since the CAS was open coded and it's not possible to assign a temporary variable of type "void". No backport is needed, this only affects 1.9. --- include/common/memory.h | 2 +- src/memory.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/common/memory.h b/include/common/memory.h index a0b6d62031..da96b82926 100644 --- a/include/common/memory.h +++ b/include/common/memory.h @@ -272,7 +272,7 @@ static inline void __pool_free(struct pool_head *pool, void *ptr) do { *POOL_LINK(pool, ptr) = (void *)free_list; __ha_barrier_store(); - } while (!HA_ATOMIC_CAS(&pool->free_list, (void *)&free_list, ptr)); + } while (!HA_ATOMIC_CAS(&pool->free_list, (void **)&free_list, ptr)); HA_ATOMIC_SUB(&pool->used, 1); } diff --git a/src/memory.c b/src/memory.c index 51c623a851..d75dc7e6e0 100644 --- a/src/memory.c +++ b/src/memory.c @@ -168,7 +168,7 @@ void *__pool_refill_alloc(struct pool_head *pool, unsigned int avail) do { *POOL_LINK(pool, ptr) = free_list; __ha_barrier_store(); - } while (HA_ATOMIC_CAS(&pool->free_list, (void *)&free_list, ptr) == 0); + } while (HA_ATOMIC_CAS(&pool->free_list, (void **)&free_list, ptr) == 0); } HA_ATOMIC_ADD(&pool->allocated, allocated - allocated_orig); @@ -199,7 +199,7 @@ void pool_flush(struct pool_head *pool) return; do { next = pool->free_list; - } while (!HA_ATOMIC_CAS(&pool->free_list, (void *)&next, NULL)); + } while (!HA_ATOMIC_CAS(&pool->free_list, (void **)&next, NULL)); while (next) { temp = next; next = *POOL_LINK(pool, temp); -- 2.39.5