From 94ae9a95d70a91960d61905da0f5d28885e03e73 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Fri, 9 Jul 2021 01:53:06 +1000 Subject: [PATCH] [common] added new ringbuffer helper for metrics collection --- common/CMakeLists.txt | 1 + common/include/common/ringbuffer.h | 32 +++++++++++ common/src/ringbuffer.c | 85 ++++++++++++++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 common/include/common/ringbuffer.h create mode 100644 common/src/ringbuffer.c diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 0ca13347..8f2ceffe 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -29,6 +29,7 @@ set(COMMON_SOURCES src/KVMFR.c src/countedbuffer.c src/runningavg.c + src/ringbuffer.c ) add_library(lg_common STATIC ${COMMON_SOURCES}) diff --git a/common/include/common/ringbuffer.h b/common/include/common/ringbuffer.h new file mode 100644 index 00000000..152f59e9 --- /dev/null +++ b/common/include/common/ringbuffer.h @@ -0,0 +1,32 @@ +/** + * Looking Glass + * Copyright (C) 2017-2021 The Looking Glass Authors + * https://looking-glass.io + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 59 + * Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +typedef struct RingBuffer * RingBuffer; + +RingBuffer ringbuffer_new(int length, size_t valueSize); +void ringbuffer_free(RingBuffer * rb); +void ringbuffer_push(RingBuffer rb, const void * value); +void ringbuffer_reset(RingBuffer rb); + +int ringbuffer_getStart (const RingBuffer rb); +int ringbuffer_getCount (const RingBuffer rb); +void * ringbuffer_getValues(const RingBuffer rb); diff --git a/common/src/ringbuffer.c b/common/src/ringbuffer.c new file mode 100644 index 00000000..57092f87 --- /dev/null +++ b/common/src/ringbuffer.c @@ -0,0 +1,85 @@ +/** + * Looking Glass + * Copyright (C) 2017-2021 The Looking Glass Authors + * https://looking-glass.io + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 59 + * Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "common/ringbuffer.h" + +#include +#include + +struct RingBuffer +{ + int length; + size_t valueSize; + int start, pos, count; + char values[0]; +}; + +RingBuffer ringbuffer_new(int length, size_t valueSize) +{ + struct RingBuffer * rb = calloc(1, sizeof(*rb) + valueSize * length); + rb->length = length; + rb->valueSize = valueSize; + return rb; +} + +void ringbuffer_free(RingBuffer * rb) +{ + if (!*rb) + return; + + free(*rb); + *rb = NULL; +} + +void ringbuffer_push(RingBuffer rb, const void * value) +{ + if (rb->count < rb->length) + ++rb->count; + else + if (++rb->start == rb->length) + rb->start = 0; + + memcpy(rb->values + rb->pos * rb->valueSize, value, rb->valueSize); + + if (++rb->pos == rb->length) + rb->pos = 0; +} + +void ringbuffer_reset(RingBuffer rb) +{ + rb->start = 0; + rb->pos = 0; + rb->count = 0; +} + +int ringbuffer_getStart(const RingBuffer rb) +{ + return rb->start; +} + +int ringbuffer_getCount(const RingBuffer rb) +{ + return rb->count; +} + +void * ringbuffer_getValues(const RingBuffer rb) +{ + return rb->values; +}