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