no message
parent
298480b9f1
commit
3b3a50a07c
|
@ -10,7 +10,8 @@
|
||||||
"thread": "cpp",
|
"thread": "cpp",
|
||||||
"vector": "cpp",
|
"vector": "cpp",
|
||||||
"xmemory": "cpp",
|
"xmemory": "cpp",
|
||||||
"xtree": "cpp"
|
"xtree": "cpp",
|
||||||
|
"ostream": "cpp"
|
||||||
},
|
},
|
||||||
"cmake.buildDirectory": "${workspaceFolder}/build",
|
"cmake.buildDirectory": "${workspaceFolder}/build",
|
||||||
"cmake.mingwSearchDirs": [
|
"cmake.mingwSearchDirs": [
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
#ifndef __RINGBUFFER__
|
#ifndef __RINGBUFFER__
|
||||||
#define __RINGBUFFER__
|
#define __RINGBUFFER__
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
|
||||||
#include<stdint.h>
|
#include<stdint.h>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
template <typename T> class RingBuffer{
|
template <typename T> class RingBuffer{
|
||||||
public:
|
public:
|
||||||
T At(uint64_t pos);
|
T At(uint64_t pos);
|
||||||
RingBuffer(uint64_t size);
|
RingBuffer(uint64_t size,bool ts);
|
||||||
int Add(T *data,uint64_t len);
|
int Add(T *data,uint64_t len);
|
||||||
int TakeBack(T *data,uint64_t len);
|
int TakeBack(T *data,uint64_t len);
|
||||||
int TakeFront(T *data,uint64_t len);
|
int TakeFront(T *data,uint64_t len);
|
||||||
|
@ -22,15 +22,17 @@ public:
|
||||||
~RingBuffer();
|
~RingBuffer();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
bool m_threadsafe;
|
||||||
T *m_data;
|
T *m_data;
|
||||||
T *m_data_end;
|
T *m_data_end;
|
||||||
uint64_t m_size; // 容量
|
uint64_t m_size; // 容量
|
||||||
uint32_t m_len; // 数据长度
|
uint32_t m_len; // 数据长度
|
||||||
T *m_head;
|
T *m_head; // 数组头
|
||||||
|
std::mutex m_mutex; // 互斥锁
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
RingBuffer<T>::RingBuffer(uint64_t size) :
|
RingBuffer<T>::RingBuffer(uint64_t size,bool ts) :
|
||||||
m_data(nullptr),
|
m_data(nullptr),
|
||||||
m_size(0),
|
m_size(0),
|
||||||
m_head(0)
|
m_head(0)
|
||||||
|
@ -40,6 +42,7 @@ RingBuffer<T>::RingBuffer(uint64_t size) :
|
||||||
m_data_end = &m_data[size - 1];
|
m_data_end = &m_data[size - 1];
|
||||||
m_head = m_data;
|
m_head = m_data;
|
||||||
m_len = 0;
|
m_len = 0;
|
||||||
|
m_threadsafe = ts;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
@ -103,6 +106,8 @@ T RingBuffer<T>::At(uint64_t pos){
|
||||||
if(p > m_data_end){
|
if(p > m_data_end){
|
||||||
p = p - m_size;
|
p = p - m_size;
|
||||||
}
|
}
|
||||||
|
// printf("\r\n at %u: %d\r\n",p,*p);
|
||||||
|
|
||||||
return *p;
|
return *p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,12 +118,20 @@ int RingBuffer<T>::Add(T *data,uint64_t len){
|
||||||
}
|
}
|
||||||
if(m_len == m_size)
|
if(m_len == m_size)
|
||||||
return 0;
|
return 0;
|
||||||
|
int left = m_size - m_len;
|
||||||
|
if(len > left){
|
||||||
|
len = left;
|
||||||
|
}
|
||||||
|
|
||||||
T *tail = nullptr;
|
T *tail = nullptr;
|
||||||
|
// like 1023 0 1 2 or 0 1 2 3
|
||||||
if((m_head + m_len) > m_data_end){
|
if((m_head + m_len) > m_data_end){
|
||||||
tail = m_head + m_len - m_size;
|
tail = m_head + m_len - m_size;
|
||||||
}else{
|
}else{
|
||||||
tail = m_head + m_len;
|
tail = m_head + m_len;
|
||||||
}
|
}
|
||||||
|
printf("head %u len %u tail %u\r\n",m_head,len,tail);
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for(i = 0;i < len;i++){
|
for(i = 0;i < len;i++){
|
||||||
T* tmp = tail;
|
T* tmp = tail;
|
||||||
|
@ -129,12 +142,13 @@ int RingBuffer<T>::Add(T *data,uint64_t len){
|
||||||
tmp = m_data;
|
tmp = m_data;
|
||||||
}
|
}
|
||||||
if(tmp == m_head) {
|
if(tmp == m_head) {
|
||||||
(*tail) = data[i];
|
printf("break %u %u\r\n",m_head,tmp);
|
||||||
i++;
|
i++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
(*tail) = data[i];
|
(*tail) = data[i];
|
||||||
tail = tmp;
|
tail = tmp;
|
||||||
|
// printf("add %u:%d\r\n",tail,data[i]);
|
||||||
}
|
}
|
||||||
m_len += i;
|
m_len += i;
|
||||||
return i;
|
return i;
|
||||||
|
@ -151,17 +165,16 @@ int RingBuffer<T>::TakeBack(T *data,uint64_t len){
|
||||||
if(m_len == 0)
|
if(m_len == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if((m_data + (m_len - 1)) > m_data_end){
|
if((m_head + (m_len - 1)) > m_data_end){
|
||||||
tail = m_data + (m_len - 1) - m_size;
|
tail = m_head + (m_len - 1) - m_size;
|
||||||
printf("m_data_end:%u m_head + m_len:%u m_head: %u m_len:%ld tail: %u m_size: %ld m_data:%u\r\n",m_data_end,(m_head + m_len),m_head,m_len,tail,m_size,m_data);
|
printf("m_data_end:%u m_head + m_len:%u m_head: %u m_len:%ld tail: %u m_size: %ld m_data:%u\r\n",m_data_end,(m_head + m_len),m_head,m_len,tail,m_size,m_data);
|
||||||
}else{
|
}else{
|
||||||
tail = m_data + m_len - 1;
|
tail = m_head + m_len - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
for(i = 0;i < len;i++) {
|
for(i = 0;i < len;i++) {
|
||||||
// std::cout<<"take" <<i<<std::endl;
|
|
||||||
data[len - 1 - i] = (*tail) ;
|
data[len - 1 - i] = (*tail) ;
|
||||||
if((tail == m_head)) {
|
if((tail == m_head)) {
|
||||||
i++;
|
i++;
|
||||||
|
@ -185,11 +198,10 @@ int RingBuffer<T>::TakeFront(T *data,uint64_t len){
|
||||||
T *tail = nullptr;
|
T *tail = nullptr;
|
||||||
if(m_len == 0)
|
if(m_len == 0)
|
||||||
return 0;
|
return 0;
|
||||||
if((m_head + m_len) > m_data_end){
|
if(len > m_len){
|
||||||
tail = m_head + m_len - m_size;
|
len = m_len;
|
||||||
}else{
|
|
||||||
tail = m_head + m_len - 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for(i = 0;i < len;i++) {
|
for(i = 0;i < len;i++) {
|
||||||
data[i] = (*m_head);
|
data[i] = (*m_head);
|
||||||
|
|
|
@ -21,6 +21,7 @@ include_directories("./third/jsoncpp/include/json")
|
||||||
include_directories("../../../obj/inc/")
|
include_directories("../../../obj/inc/")
|
||||||
include_directories("./third/gtest/include")
|
include_directories("./third/gtest/include")
|
||||||
|
|
||||||
|
add_executable(ringbuffer ringbuffer_test.cpp )
|
||||||
add_executable(cpp11 cpp11_test.cpp )
|
add_executable(cpp11 cpp11_test.cpp )
|
||||||
add_executable(gtest gtest.cpp )
|
add_executable(gtest gtest.cpp )
|
||||||
add_executable(thread_test thread_usage.cpp threadpool.cpp)
|
add_executable(thread_test thread_usage.cpp threadpool.cpp)
|
||||||
|
|
|
@ -23,6 +23,7 @@ void clearBuffer(int *dat,int len){
|
||||||
dat[i] = 0;
|
dat[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestRingBuffer(){
|
void TestRingBuffer(){
|
||||||
int in[1024];
|
int in[1024];
|
||||||
int out[1024];
|
int out[1024];
|
||||||
|
|
Loading…
Reference in New Issue