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,