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 int 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( 26 void *data __attribute__((unused)), 27 size_t force_len __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 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 69 void 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 98