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