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