diff options
author | Andrew Tridgell <tridge@samba.org> | 2013-09-09 17:37:29 +1000 |
---|---|---|
committer | Lorenz Meier <lm@inf.ethz.ch> | 2013-09-12 00:51:34 +0200 |
commit | 3329e3c38c6c566fd8833d862ecf06c07ce4279e (patch) | |
tree | 7c0a9c3d3acc524156391ceb469c981303ea0686 | |
parent | 1828b57c581dda473d03c9c00cdbf354c7927f23 (diff) | |
download | px4-firmware-3329e3c38c6c566fd8833d862ecf06c07ce4279e.tar.gz px4-firmware-3329e3c38c6c566fd8833d862ecf06c07ce4279e.tar.bz2 px4-firmware-3329e3c38c6c566fd8833d862ecf06c07ce4279e.zip |
ringbuffer: added resize() and print_info() methods
this simplifies the drivers
-rw-r--r-- | src/drivers/device/ringbuffer.h | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/src/drivers/device/ringbuffer.h b/src/drivers/device/ringbuffer.h index c859be647..e3c5a20bd 100644 --- a/src/drivers/device/ringbuffer.h +++ b/src/drivers/device/ringbuffer.h @@ -131,9 +131,25 @@ public: */ void flush(); + /* + * resize the buffer. This is unsafe to be called while + * a producer or consuming is running. Caller is responsible + * for any locking needed + * + * @param new_size new size for buffer + * @return true if the resize succeeds, false if + * not (allocation error) + */ + bool resize(unsigned new_size); + + /* + * printf() some info on the buffer + */ + void print_info(const char *name); + private: - T *const _buf; - const unsigned _size; + T *_buf; + unsigned _size; volatile unsigned _head; /**< insertion point */ volatile unsigned _tail; /**< removal point */ @@ -305,3 +321,27 @@ unsigned RingBuffer<T>::count(void) */ return _size - space(); } + +template <typename T> +bool RingBuffer<T>::resize(unsigned new_size) +{ + T *old_buffer; + T *new_buffer = new T[new_size + 1]; + if (new_buffer == nullptr) { + return false; + } + old_buffer = _buf; + _buf = new_buffer; + _size = new_size; + _head = new_size; + _tail = new_size; + delete[] old_buffer; + return true; +} + +template <typename T> +void RingBuffer<T>::print_info(const char *name) +{ + printf("%s %u (%u/%u @ %p)\n", + name, _size, _head, _tail, _buf); +} |