79 lines
2.7 KiB
C++
Executable File
79 lines
2.7 KiB
C++
Executable File
//#pragma once
|
|
#ifndef __HIT_DATAQUEUE_H
|
|
#define __HIT_DATAQUEUE_H
|
|
#include <pthread.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#include <cstring>
|
|
|
|
#define MAX_BLOCK_BYTES (1024*1024*2)
|
|
#define QUEUE_IS_FULL (-1)
|
|
#define EMPTY_QUEUE_NO_DATA (0)
|
|
|
|
class DataQueue
|
|
{
|
|
public:
|
|
DataQueue(int64_t iSizeInKB = 0, int64_t iMaxBlockSize = MAX_BLOCK_BYTES, bool bUseMutex = true, int iReadThreadCnt=1);
|
|
~DataQueue();
|
|
|
|
//private:
|
|
void* m_pDataBuf; //[DATA_BUF_LEN]
|
|
int64_t m_iBufOutPos;
|
|
int64_t m_iBufInPos;
|
|
int64_t m_iFreeBytes;
|
|
int64_t m_iQueueBufBytes;
|
|
int64_t m_iRcvBlocks;//total count
|
|
int64_t m_iRcvBytes;//total Bytes
|
|
int64_t m_iProcBlocks;
|
|
int64_t m_iPaddingBlocks;//padding block cnt in enqueue
|
|
int64_t m_iProcPaddingBlocks;//processed padding block cnt in dequeue
|
|
|
|
int64_t m_iMaxBlockByte;
|
|
int64_t m_iReservedBufBytes;
|
|
int64_t m_iReservedBlockNum;
|
|
int64_t m_iEmptyTimes;
|
|
int64_t m_iFullTimes;
|
|
bool m_bUseMutex;
|
|
pthread_mutex_t m_BufMutex;//pthread_mutex_init(&m_BufMutex, NULL);
|
|
|
|
bool IsEmpty(); //
|
|
bool IsFull();
|
|
inline bool CanRcv(int iNeedBytes);
|
|
|
|
public:
|
|
|
|
int64_t EnQueue(void* pdata, int64_t iDataBytes = 0, void* extradata = NULL, int64_t iExtraDataBytes = 0, void* extradata2 = NULL, int64_t iExtraDataBytes2 = 0);
|
|
int64_t DeQueue(void** pdata);//return value: Bytes, >0 if sucess, =0 no data, < 0 error. No data copy, only return the pointer of data area
|
|
|
|
uint64_t GetBlockCnt() {
|
|
return m_iRcvBlocks - m_iProcBlocks;
|
|
};
|
|
int64_t GetProcBlockCnt() {
|
|
return m_iProcBlocks;
|
|
};
|
|
int64_t GetTotalRcvBlockCnt() {
|
|
return m_iRcvBlocks;
|
|
};
|
|
int64_t GetFreeBytes();
|
|
int64_t GetBufBytes();
|
|
inline int64_t GetQueueFreeBytes();
|
|
|
|
|
|
int InitQueue(int64_t iTotalKB4QueueBuf, int iMaxBlockKB = MAX_BLOCK_BYTES, int iReadThreadCnt = 1);//KB
|
|
bool CheckQueue(int iLineNo, int iNeedBytes);
|
|
void OutPutStatus(char* strBuf, int iLen);
|
|
void ResetDataQueue();
|
|
};
|
|
|
|
#define LOG_QUEUE_INFO 0
|
|
typedef void* voidPtr;
|
|
extern "C" voidPtr __attribute__((visibility("default"))) OpenDataQueue(int64_t iTotalKB4QueueBuf, int iMaxBlockBytes, int iReadThreadCnt);
|
|
extern "C" bool __attribute__((visibility("default"))) GetDataQueueInfo(void* pQueue, int64_t iSize[5]);
|
|
extern "C" int64_t __attribute__((visibility("default"))) EnDataQueue(void* pQueue, void* e, int64_t iDataBytes, void* extradata1, int64_t iExtraDataBytes1, void* extradata2, int64_t iExtraDataBytes2);
|
|
extern "C" int64_t __attribute__((visibility("default"))) DeDataQueue(void* pQueue, void** e);
|
|
extern "C" bool __attribute__((visibility("default"))) DataQueueIsFull(void* pQueue);
|
|
extern "C" void __attribute__((visibility("default"))) ResetDataQueue(void* pQueue);
|
|
extern "C" void __attribute__((visibility("default"))) CloseDataQueue(void*& pQueue);
|
|
#endif
|