diff --git a/include/haproxy/ring.h b/include/haproxy/ring.h index bab18c679..d6c527c5b 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 da987c5d5..91157a90b 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,