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