⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 session_data.h

📁 朋友的作品
💻 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 + -