From 4c0940828c2fe352707b0df576ace894a4cade00 Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 3 Jun 2024 21:54:13 -0300 Subject: [PATCH] ringbuffer: size and peek --- kernel-src/include/ringbuffer.h | 2 ++ kernel-src/lib/ringbuffer.c | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/kernel-src/include/ringbuffer.h b/kernel-src/include/ringbuffer.h index ba1f58c4..53847fd4 100644 --- a/kernel-src/include/ringbuffer.h +++ b/kernel-src/include/ringbuffer.h @@ -16,7 +16,9 @@ void ringbuffer_destroy(ringbuffer_t *ringbuffer); size_t ringbuffer_read(ringbuffer_t* ringbuffer, void *buffer, size_t count); size_t ringbuffer_write(ringbuffer_t* ringbuffer, void *buffer, size_t count); size_t ringbuffer_truncate(ringbuffer_t *ringbuffer, size_t count); +size_t ringbuffer_peek(ringbuffer_t *ringbuffer, void *buffer, uintmax_t offset, size_t count); #define RINGBUFFER_DATACOUNT(x) ((x)->write - (x)->read) +#define RINGBUFFER_SIZE(x) (x)->size #endif diff --git a/kernel-src/lib/ringbuffer.c b/kernel-src/lib/ringbuffer.c index ed6f041d..8d89e385 100644 --- a/kernel-src/lib/ringbuffer.c +++ b/kernel-src/lib/ringbuffer.c @@ -38,6 +38,33 @@ size_t ringbuffer_read(ringbuffer_t *ringbuffer, void *buffer, size_t count) { return readc; } +size_t ringbuffer_peek(ringbuffer_t *ringbuffer, void *buffer, uintmax_t offset, size_t count) { + uint8_t *ptr = buffer; + + uintmax_t read = ringbuffer->read; + uintmax_t write = ringbuffer->write; + + uintmax_t curroff = 0; + for (; curroff < offset; ++curroff) { + if (read == write) + return 0; + + ++read; + } + + size_t readc = 0; + for (; readc < count; ++readc) { + if (read == write) + break; + + uintmax_t readoffset = read % ringbuffer->size; + *ptr++ = *((uint8_t *)ringbuffer->data + readoffset); + ++read; + } + + return readc; +} + size_t ringbuffer_write(ringbuffer_t *ringbuffer, void *buffer, size_t count) { uint8_t *ptr = buffer; size_t writec = 0;