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