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