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