From 7fb497083463b0d4be8df52b54219232bb14ebc8 Mon Sep 17 00:00:00 2001 From: zcy <290198252@qq.com> Date: Tue, 18 May 2021 00:05:39 +0800 Subject: [PATCH] =?UTF-8?q?ringbuffer=E6=B7=BB=E5=8A=A0copy=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- general/src/pattern/lockfree.hpp | 9 +++++++- general/src/pattern/ringbuffer.hpp | 37 ++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/general/src/pattern/lockfree.hpp b/general/src/pattern/lockfree.hpp index 4a64c09..02344af 100644 --- a/general/src/pattern/lockfree.hpp +++ b/general/src/pattern/lockfree.hpp @@ -17,7 +17,14 @@ class LockfreeList int lock; int unlock; public: - LockfreeList():mutex(0),lock(0),unlock(1){}; + LockfreeList(): + mutex(0), + lock(0), + unlock(1) + { + + }; + ~LockfreeList(){}; void Lock() { diff --git a/general/src/pattern/ringbuffer.hpp b/general/src/pattern/ringbuffer.hpp index 7b91af2..2f80440 100644 --- a/general/src/pattern/ringbuffer.hpp +++ b/general/src/pattern/ringbuffer.hpp @@ -13,6 +13,8 @@ public: RingBuffer(uint64_t size); int Add(T *data,uint64_t len); int Take(T *data,uint64_t len); + int Copy(T *data,uint64_t len); + void SetEmpty(); uint32_t CanReadCount(); uint32_t CanWriteCount(); @@ -48,12 +50,47 @@ template RingBuffer::~RingBuffer(){ delete[] mData; } + template void RingBuffer::SetEmpty(){ this->mCurrentHead = this->mCurrentTail; this->mRemain = this->mSize; } +template +int RingBuffer::Copy(T *data,uint64_t len){ + if(data == nullptr) + return -1; + if(mRemain == mSize) + return 0; + int bytes_read = 0; + if(len > (mSize - mRemain)){ + bytes_read = mSize - mRemain; + }else{ + bytes_read = len; + } + /// |start|head|.....|tail|end| + if(mCurrentTail >= mCurrentHead){ + memcpy(data,&mData[mCurrentHead],sizeof(T)*bytes_read); + return bytes_read; + } + /// |start|...|tail|.....|head|...|end| + if(mCurrentHead > mCurrentTail){ + int off = mCurrentHead + bytes_read; + if(off > mSize){ + int tmp = mSize - mCurrentHead; + memcpy(data,&mData[mCurrentHead],(mSize - mCurrentHead)*sizeof(T)); + memcpy(&data[mSize - mCurrentHead],&mData[0],(bytes_read - tmp)*sizeof(T)); + return bytes_read; + } + if(off <= mSize){ + memcpy(data,&mData[mCurrentHead],sizeof(T)*bytes_read); + return bytes_read; + } + } + +} + template uint32_t RingBuffer::Size(){ return mSize;