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