1 #include <stdbool.h>
2 #include <stdlib.h>
3
4 #include "console-server.h"
5
6 struct rb_test_ctx {
7 struct ringbuffer_consumer *rbc;
8 bool ignore_poll;
9 bool force_only;
10 int count;
11 uint8_t *data;
12 size_t len;
13 };
14
ringbuffer_test_context_init(struct rb_test_ctx * ctx)15 void ringbuffer_test_context_init(struct rb_test_ctx *ctx)
16 {
17 ctx->count = 0;
18 ctx->data = NULL;
19 ctx->len = 0;
20 ctx->ignore_poll = false;
21 ctx->force_only = false;
22 }
23
ringbuffer_test_context_fini(struct rb_test_ctx * ctx)24 void ringbuffer_test_context_fini(struct rb_test_ctx *ctx)
25 {
26 free(ctx->data);
27 }
28
ringbuffer_poll_nop(void * data,size_t force_len)29 enum ringbuffer_poll_ret ringbuffer_poll_nop(void *data __attribute__((unused)),
30 size_t force_len
31 __attribute__((unused)))
32 {
33 return RINGBUFFER_POLL_OK;
34 }
35
ringbuffer_poll_append_all(void * data,size_t force_len)36 enum ringbuffer_poll_ret ringbuffer_poll_append_all(void *data,
37 size_t force_len)
38 {
39 struct rb_test_ctx *ctx = data;
40 size_t len;
41 size_t total_len;
42 uint8_t *buf;
43
44 if (ctx->ignore_poll) {
45 return RINGBUFFER_POLL_OK;
46 }
47
48 if (ctx->force_only && !force_len) {
49 return RINGBUFFER_POLL_OK;
50 }
51
52 ctx->count++;
53
54 total_len = 0;
55 for (;;) {
56 len = ringbuffer_dequeue_peek(ctx->rbc, total_len, &buf);
57 if (!len) {
58 break;
59 }
60
61 if (ctx->force_only && total_len + len > force_len) {
62 len = force_len - total_len;
63 }
64
65 ctx->data = realloc(ctx->data, ctx->len + len);
66 memcpy(ctx->data + ctx->len, buf, len);
67 ctx->len += len;
68 total_len += len;
69
70 if (ctx->force_only && total_len >= force_len) {
71 break;
72 }
73 }
74 ringbuffer_dequeue_commit(ctx->rbc, total_len);
75
76 return RINGBUFFER_POLL_OK;
77 }
78
ringbuffer_dump(struct ringbuffer * rb)79 void ringbuffer_dump(struct ringbuffer *rb)
80 {
81 struct ringbuffer_consumer *rbc;
82 size_t i;
83 int j;
84
85 printf("---- ringbuffer (%d consumer%s)\n", rb->n_consumers,
86 rb->n_consumers == 1 ? "" : "s");
87
88 for (i = 0; i < rb->size; i++) {
89 bool has_consumer = false;
90 const char *prefix = "";
91
92 if (rb->tail == i) {
93 prefix = "tail=>";
94 }
95
96 printf("%6s %02x", prefix, rb->buf[i]);
97 for (j = 0; j < rb->n_consumers; j++) {
98 rbc = rb->consumers[j];
99 if (rbc->pos != i) {
100 continue;
101 }
102 if (!has_consumer) {
103 printf(" <=");
104 }
105 printf("c[%d],len=%zd ", j, ringbuffer_len(rbc));
106 has_consumer = true;
107 }
108 printf("\n");
109 }
110 }
111