CLEANUP: ring/cli: use a locally-defined context instead of using ctx.cli
The ring code was using ctx.cli.i0/p0/o0 to store its context during CLI
dumps via "show events" or "show errors". Let's use a locally defined
context and drop that.
diff --git a/src/ring.c b/src/ring.c
index 0314233..d2c1c4a 100644
--- a/src/ring.c
+++ b/src/ring.c
@@ -28,6 +28,13 @@
#include <haproxy/ring.h>
#include <haproxy/thread.h>
+/* context used to dump the contents of a ring via "show events" or "show errors" */
+struct show_ring_ctx {
+ struct ring *ring; /* ring to be dumped */
+ size_t ofs; /* offset to restart from, ~0 = end */
+ uint flags; /* set of RING_WF_* */
+};
+
/* Initialize a pre-allocated ring with the buffer area
* of size */
void ring_init(struct ring *ring, void *area, size_t size)
@@ -252,6 +259,8 @@
*/
int ring_attach_cli(struct ring *ring, struct appctx *appctx, uint flags)
{
+ struct show_ring_ctx *ctx = applet_reserve_svcctx(appctx, sizeof(*ctx));
+
if (!ring_attach(ring))
return cli_err(appctx,
"Sorry, too many watchers (255) on this ring buffer. "
@@ -261,9 +270,11 @@
appctx->io_handler = cli_io_handler_show_ring;
if (!appctx->io_release)
appctx->io_release = cli_io_release_show_ring;
- appctx->ctx.cli.p0 = ring;
- appctx->ctx.cli.o0 = ~0; // start from the oldest event
- appctx->ctx.cli.i0 = flags;
+
+ memset(ctx, 0, sizeof(*ctx));
+ ctx->ring = ring;
+ ctx->ofs = ~0; // start from the oldest event
+ ctx->flags = flags;
return 0;
}
@@ -278,10 +289,11 @@
*/
int cli_io_handler_show_ring(struct appctx *appctx)
{
+ struct show_ring_ctx *ctx = appctx->svcctx;
struct conn_stream *cs = appctx->owner;
- struct ring *ring = appctx->ctx.cli.p0;
+ struct ring *ring = ctx->ring;
struct buffer *buf = &ring->buf;
- size_t ofs = appctx->ctx.cli.o0;
+ size_t ofs = ctx->ofs;
uint64_t msg_len;
size_t len, cnt;
int ret;
@@ -307,7 +319,7 @@
ofs = 0;
/* going to the end means looking at tail-1 */
- if (appctx->ctx.cli.i0 & RING_WF_SEEK_NEW)
+ if (ctx->flags & RING_WF_SEEK_NEW)
ofs += b_data(buf) - 1;
HA_ATOMIC_INC(b_peek(buf, ofs));
@@ -355,10 +367,10 @@
HA_ATOMIC_INC(b_peek(buf, ofs));
ofs += ring->ofs;
- appctx->ctx.cli.o0 = ofs;
+ ctx->ofs = ofs;
HA_RWLOCK_RDUNLOCK(LOGSRV_LOCK, &ring->lock);
- if (ret && (appctx->ctx.cli.i0 & RING_WF_WAIT_MODE)) {
+ if (ret && (ctx->flags & RING_WF_WAIT_MODE)) {
/* we've drained everything and are configured to wait for more
* data or an event (keypress, close)
*/
@@ -379,8 +391,9 @@
/* must be called after cli_io_handler_show_ring() above */
void cli_io_release_show_ring(struct appctx *appctx)
{
- struct ring *ring = appctx->ctx.cli.p0;
- size_t ofs = appctx->ctx.cli.o0;
+ struct show_ring_ctx *ctx = appctx->svcctx;
+ struct ring *ring = ctx->ring;
+ size_t ofs = ctx->ofs;
ring_detach_appctx(ring, appctx, ofs);
}