From: William Lallemand Date: Tue, 27 Sep 2022 13:53:53 +0000 (+0200) Subject: MINOR: ring: ring_cast_from_area() cast from an allocated area X-Git-Tag: v2.7-dev8~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9e4ead30953f964cf2f9f6738e432a267d857cb7;p=thirdparty%2Fhaproxy.git MINOR: ring: ring_cast_from_area() cast from an allocated area Cast an unified ring + storage area to a ring from area, without reinitializing the data buffer. Reinitialize the waiters and the lock. It helps retrieving a previously allocated ring, from an mmap for example. --- diff --git a/include/haproxy/ring.h b/include/haproxy/ring.h index bab18c6791..d6c527c5bc 100644 --- a/include/haproxy/ring.h +++ b/include/haproxy/ring.h @@ -30,6 +30,7 @@ struct appctx; struct ring *ring_new(size_t size); struct ring *ring_make_from_area(void *area, size_t size); +struct ring *ring_cast_from_area(void *area); void ring_init(struct ring *ring, void* area, size_t size); struct ring *ring_resize(struct ring *ring, size_t size); void ring_free(struct ring *ring); diff --git a/src/ring.c b/src/ring.c index da987c5d5f..91157a90b3 100644 --- a/src/ring.c +++ b/src/ring.c @@ -99,6 +99,25 @@ struct ring *ring_make_from_area(void *area, size_t size) return ring; } +/* Cast an unified ring + storage area to a ring from , without + * reinitializing the data buffer. + * + * Reinitialize the waiters and the lock. + */ +struct ring *ring_cast_from_area(void *area) +{ + struct ring *ring = NULL; + + ring = area; + ring->buf.area = area + sizeof(*ring); + + HA_RWLOCK_INIT(&ring->lock); + LIST_INIT(&ring->waiters); + ring->readers_count = 0; + + return ring; +} + /* Resizes existing ring to which must be larger, without losing * its contents. The new size must be at least as large as the previous one or * no change will be performed. The pointer to the ring is returned on success,