diff --git a/include/haproxy/ring.h b/include/haproxy/ring.h index d6c527c5b..71217d523 100644 --- a/include/haproxy/ring.h +++ b/include/haproxy/ring.h @@ -41,6 +41,8 @@ int ring_attach_cli(struct ring *ring, struct appctx *appctx, uint flags); int cli_io_handler_show_ring(struct appctx *appctx); void cli_io_release_show_ring(struct appctx *appctx); +size_t ring_max_payload(const struct ring *ring); + #endif /* _HAPROXY_RING_H */ /* diff --git a/src/ring.c b/src/ring.c index 2b8e3c85e..9b8863afe 100644 --- a/src/ring.c +++ b/src/ring.c @@ -457,6 +457,22 @@ void cli_io_release_show_ring(struct appctx *appctx) ring_detach_appctx(ring, appctx, ofs); } +/* Returns the MAXIMUM payload len that could theoretically fit into the ring + * based on ring buffer size. + * + * Computation logic relies on implementation details from 'ring-t.h'. + */ +size_t ring_max_payload(const struct ring *ring) +{ + size_t max; + + /* initial max = bufsize - 1 (initial RC) - 1 (payload RC) */ + max = b_size(&ring->buf) - 1 - 1; + + /* substract payload VI (varint-encoded size) */ + max -= varint_bytes(max); + return max; +} /* * Local variables: