aboutsummaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2013-09-09 17:37:29 +1000
committerLorenz Meier <lm@inf.ethz.ch>2013-09-12 00:51:34 +0200
commit3329e3c38c6c566fd8833d862ecf06c07ce4279e (patch)
tree7c0a9c3d3acc524156391ceb469c981303ea0686 /src/drivers
parent1828b57c581dda473d03c9c00cdbf354c7927f23 (diff)
downloadpx4-firmware-3329e3c38c6c566fd8833d862ecf06c07ce4279e.tar.gz
px4-firmware-3329e3c38c6c566fd8833d862ecf06c07ce4279e.tar.bz2
px4-firmware-3329e3c38c6c566fd8833d862ecf06c07ce4279e.zip
ringbuffer: added resize() and print_info() methods
this simplifies the drivers
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/device/ringbuffer.h44
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);
+}