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