175 lines
3.0 KiB
Plaintext
175 lines
3.0 KiB
Plaintext
|
|
/************************************************
|
||
|
|
* Memory Queue is a special linear table,
|
||
|
|
* which is a first in,
|
||
|
|
* first out (FIFO) data structure
|
||
|
|
*
|
||
|
|
* create zoufuzhou 20201001
|
||
|
|
*
|
||
|
|
************************************************/
|
||
|
|
#ifndef _MEM_QUEUE_CACHE_HPP_
|
||
|
|
#define _MEM_QUEUE_CACHE_HPP_
|
||
|
|
|
||
|
|
|
||
|
|
#include <glob/GlobMem.h>
|
||
|
|
#include <mutex>
|
||
|
|
|
||
|
|
template <typename T> class CMemQueue
|
||
|
|
{
|
||
|
|
typedef struct{
|
||
|
|
unsigned int maxsize;
|
||
|
|
unsigned int size;
|
||
|
|
unsigned int head;
|
||
|
|
unsigned int tail;
|
||
|
|
}HEAD;
|
||
|
|
|
||
|
|
//Local variable
|
||
|
|
private:
|
||
|
|
std::mutex m_mutex;
|
||
|
|
|
||
|
|
//Memory variable
|
||
|
|
private:
|
||
|
|
HEAD* p_head;
|
||
|
|
T* p_ptr;
|
||
|
|
|
||
|
|
private:
|
||
|
|
void init(const string& tableName)
|
||
|
|
{
|
||
|
|
char* ptr = (char*)GlobMem::GetInstancePtr()->GetTablePtr(tableName);
|
||
|
|
if(ptr == nullptr)
|
||
|
|
{
|
||
|
|
p_ptr = nullptr;
|
||
|
|
p_head = nullptr;
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
p_head = (HEAD*)(ptr);
|
||
|
|
p_ptr = (T*)(ptr+sizeof(HEAD));
|
||
|
|
|
||
|
|
};
|
||
|
|
|
||
|
|
public:
|
||
|
|
CMemQueue(const string& tableName)
|
||
|
|
{
|
||
|
|
this->init(tableName);
|
||
|
|
//assert(p_head->maxsize>1);
|
||
|
|
|
||
|
|
// p_head->size = p_head->size%p_head->maxsize;
|
||
|
|
// p_head->head = p_head->head%p_head->maxsize;
|
||
|
|
// p_head->tail = p_head->tail%p_head->maxsize;
|
||
|
|
};
|
||
|
|
|
||
|
|
CMemQueue(const string& tableName,unsigned int maxsize)
|
||
|
|
{
|
||
|
|
//assert(maxsize>1);
|
||
|
|
this->init(tableName);
|
||
|
|
|
||
|
|
m_mutex.lock();
|
||
|
|
p_head->maxsize = maxsize;
|
||
|
|
if(p_head->size != p_head->maxsize)
|
||
|
|
{
|
||
|
|
p_head->size = 0;
|
||
|
|
p_head->head = 0;
|
||
|
|
p_head->tail = 0;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
p_head->size = p_head->size%p_head->maxsize;
|
||
|
|
p_head->head = p_head->head%p_head->maxsize;
|
||
|
|
p_head->tail = p_head->tail%p_head->maxsize;
|
||
|
|
}
|
||
|
|
m_mutex.unlock();
|
||
|
|
};
|
||
|
|
|
||
|
|
~CMemQueue(){};
|
||
|
|
|
||
|
|
T* operator()(void)
|
||
|
|
{
|
||
|
|
return p_ptr;
|
||
|
|
};
|
||
|
|
|
||
|
|
unsigned int max_size(void)
|
||
|
|
{
|
||
|
|
return p_head->maxsize;
|
||
|
|
}
|
||
|
|
|
||
|
|
unsigned int size(void)
|
||
|
|
{
|
||
|
|
if(p_head == nullptr)return 0;
|
||
|
|
return p_head->size;
|
||
|
|
}
|
||
|
|
|
||
|
|
T* operator[](unsigned int i)
|
||
|
|
{
|
||
|
|
if(p_ptr == nullptr)return nullptr;
|
||
|
|
return p_ptr+i;
|
||
|
|
};
|
||
|
|
|
||
|
|
void push(T* t)
|
||
|
|
{
|
||
|
|
if(p_ptr == nullptr)return;
|
||
|
|
if (p_head->size < p_head->maxsize)
|
||
|
|
{
|
||
|
|
m_mutex.lock();
|
||
|
|
p_head->size++;
|
||
|
|
m_mutex.unlock();
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
this->pop();
|
||
|
|
}
|
||
|
|
|
||
|
|
memcpy(p_ptr+p_head->tail,t,sizeof(T));
|
||
|
|
p_head->tail = (p_head->tail+1)%p_head->maxsize;
|
||
|
|
};
|
||
|
|
|
||
|
|
T* pop(void)
|
||
|
|
{
|
||
|
|
if(this->empty())return nullptr;
|
||
|
|
else
|
||
|
|
{
|
||
|
|
unsigned int itmp = p_head->head;
|
||
|
|
p_head->head = (p_head->head+1)%p_head->maxsize;
|
||
|
|
m_mutex.lock();
|
||
|
|
p_head->size--;
|
||
|
|
m_mutex.unlock();
|
||
|
|
return p_ptr+itmp;
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
bool empty(void)
|
||
|
|
{
|
||
|
|
if(p_head == nullptr)return true;
|
||
|
|
return !p_head->size;
|
||
|
|
};
|
||
|
|
|
||
|
|
T* back(void)
|
||
|
|
{
|
||
|
|
if(this->empty())return nullptr;
|
||
|
|
else
|
||
|
|
{
|
||
|
|
if(p_head->tail == 0)
|
||
|
|
{
|
||
|
|
return p_ptr+p_head->maxsize;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return p_ptr+(p_head->tail-1)%p_head->maxsize;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
T* front(void)
|
||
|
|
{
|
||
|
|
if(this->empty())return nullptr;
|
||
|
|
else return p_ptr+p_head->head;
|
||
|
|
};
|
||
|
|
|
||
|
|
void clear(void)
|
||
|
|
{
|
||
|
|
if(p_head == nullptr)return;
|
||
|
|
p_head->size = 0;
|
||
|
|
p_head->head = 0;
|
||
|
|
p_head->tail = 0;
|
||
|
|
};
|
||
|
|
};
|
||
|
|
#endif
|