📄 session_data.h
字号:
#ifndef __TANK_SESSION_PAGE_DATA_H__
#define __TANK_SESSION_PAGE_DATA_H__
/**
* session data 管理: 维护数据块的分配与访问
*
* ---------------------------------------------------
* Head: datanum / datasize / usednum / _used_ptr / _unused_ptr
* ---------------------------------------------------
* dlist区(与data分开是保护该区域)
* ---------------------------------------------------
* Data区
*
* ---------------------------------------------------
* 2005-03-22
* @author casper@tencent.com
* @version 0.1
*/
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/time.h>
#include <stdexcept>
#include <iostream>
#include <assert.h>
using namespace std;
struct session_buf_full: public runtime_error{ session_buf_full(const string& s);};
class CSessionData {
public:
CSessionData();
~CSessionData();
public:
/**
* (会初始化数据区)
*/
void Create(char * pBuf,unsigned buflen,size_t datanum,size_t datasize) throw(runtime_error);
/**
* (不初始化数据区,校验)
*/
void Attach(char * pBuf,unsigned buflen,size_t datanum,size_t datasize) throw(runtime_error);
/**
* 计算数据区空间大小
*/
static unsigned CalBufLen(size_t datanum,size_t datasize)
{return Head_Length + sizeof(DList)*datanum + datasize*datanum;}
/**
* 取数据头指针
*/
// char * GetDataHead();
/**
* @param indx - 取第index块数据指针
* @return NULL - 该块数据为空(未分配), 其他- 数据头指针
*/
char * GetData(unsigned index);
/**
* 分配数据块
* @return 数据块索引
*/
unsigned AllocData() throw(session_buf_full);
/**
* 释放数据块
*/
void FreeData(unsigned index);
void DumpBuf(const char * pBuf,size_t iBufLen);
private:
static const unsigned Head_Length = 128;
#pragma pack(1)
struct Data_Head{
size_t buf_len;
size_t data_num;
size_t data_size;
unsigned used_num;
int unused_head;
};
struct DList {
int previous;
int next;
char stat; // 0-未使用 1-已使用
};
#pragma pack()
Data_Head * _data_head;
DList * _list_arr;
char * _data_ptr;
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -