www.pudn.com > ccache.rar > ccache.h


/******************************************************************** 
	created:	2008/01/23 
	filename: 	ccache.h 
	author:		Lichuang 
                 
	purpose:     
*********************************************************************/ 
 
#ifndef __CCACHE_H__ 
#define __CCACHE_H__ 
 
#include  
 
#define USE_LIST 
 
#ifdef __cplusplus 
extern "C" { 
#endif /* __cplusplus */ 
 
typedef struct ccache_t 
{ 
    int hashitemnum;            /* hash表的数量 */ 
    int nodenum;                /* cache中存放的节点的总数量 */ 
    int usednodenum;            /* cache中已经存放的节点的数量 */ 
    int nodesize;               /* 一个节点的总大小 = 数据大小 + key大小 */ 
    int datasize;               /* 数据大小 */ 
    int keysize;                /* key大小 */ 
    int hashitemtolsize;        /* 所有hash表的总大小 */ 
 
    int mapfilesize;            /* 共享内存map文件的大小 */ 
 
    int firstfreenode;          /* 空闲节点链表的头节点, 小于0时表示不存在空闲节点了 */ 
    int lrufirst, lrulast;      /* lru链表的头,尾节点 */ 
 
    pthread_mutex_t  mutex;     /* 线程锁对象 */ 
 
    char data[0];               /* 数据区, 以下就是cache存放的数据和hash表所在 */ 
}ccache_t; 
 
/** 
 * @brief 用于比较两个数据的函数指针类型 
 * @param  
 * @return > 0 data1 > data2, = 0 data1 = data2, < 0 data1 < data2 
 */ 
typedef     int (*cmpfun)(const void* data1, const void* data2); 
 
/** 
 * @brief 用于在淘汰节点时对节点数据进行处理的函数指针类型 
 * @param  
 * @return  
 */ 
typedef     void (*delfun)(const void* key, const void* data); 
 
/** 
 * @brief 用于在更新节点数据的函数指针类型, 该函数将对org和updatedata进行操作,结果存放在updatedata中 
 * @param   org 原有的数据  
 * @param   updatedata 更新的数据 
 * @return  
 */ 
typedef     void (*updatefun)(const void* org, void* updatedata); 
 
/** 
 * @brief 用于访问cache所有节点的函数 
 * @param   key 节点的key 
 * @param   data 节点的data 
 * @return  
 */ 
typedef     void (*visitfun)(const void* key, void* data); 
 
/** 
 * @brief 创建一个ccache_t对象指针 
 * @param nodenum cache中保存的数据数量 
 * @param datasize cache中保存的数据大小 
 * @param hashitemnum cache中保存的hash表数量 
 * @param key cache中保存的key大小 
 * @param mapfilename 共享文件名 
 * @param init 是否对共享内存文件进行初始化, 如果文件不存在或者大小与实际要求大小不一致, 那么忽略init参数都会对文件进行初始化 
 * @return > 0 data1 > data2, = 0 data1 = data2, < 0 data1 < data2 
 */ 
ccache_t*    create_cache(int nodenum, int datasize, int hashitemnum, int keysize, const char* mapfilename, int init); 
 
/** 
 * @brief 创建一个ccache_t对象指针 
 * @param cache 需要销毁的cache 
 * @return 0表示成功, 否则失败 
 */ 
int         destroy_cache(ccache_t* cache); 
 
/** 
 * @brief 向cache中插入一个数据 
 * @param key   数据的key 
 * @param data  数据 
 * @param cache 操作共享内存的数据结构 
 * @param cmp   用于比较key的函数指针 
 * @param del   用于在淘汰节点时对节点数据进行处理的函数指针, 为NULL时则不进行处理直接淘汰 
 * @return 插入之后的index, 小于0表示出错 
 */ 
int         insert_data(const void* key, const void* data, ccache_t* cache, cmpfun cmp, delfun del); 
 
/** 
 * @brief 在cache中查找一个数据 
 * @param key   数据的key 
 * @param data  如果查找成功, 数据的value将存放在这里 
 * @param cache 操作共享内存的数据结构 
 * @param cmp   用于比较key的函数指针 
 * @return 数据的index, 小于0表示出错 
 */ 
int         find_data(const void* key, void* data, ccache_t* cache, cmpfun cmp); 
 
/** 
 * @brief 向cache中更新一个数据 
 * @param key   数据的key 
 * @param data  新的数据 
 * @param cache 操作共享内存的数据结构 
 * @param cmp   用于比较key的函数指针 
 * @return 数据的index, 小于0表示出错 
 */ 
int         update_data(const void* key, const void* data, ccache_t* cache, cmpfun cmp); 
 
/** 
 * @brief 向cache中删除一个数据 
 * @param key   数据的key 
 * @param data  如果删除成功, 这里存放删除的数据 
 * @param cache 操作共享内存的数据结构 
 * @param cmp   用于比较key的函数指针 
 * @return 已经被删除数据的index, 小于0表示出错 
 */ 
int         delete_data(const void* key, void* data, ccache_t* cache, cmpfun cmp); 
 
/** 
 * @brief 向cache中更新一个数据, 如果cache中没有,就用更新的数据插入进去, 否则调用updatefun进行更新 
 * @param key   数据的key 
 * @param data  更新的数据, 更新之后的结果保存在该数据中 
 * @param cache 操作共享内存的数据结构 
 * @param cmp   用于比较key的函数指针 
 * @param del   用于在淘汰节点时对节点数据进行处理的函数指针, 为NULL时则不进行处理直接淘汰 
 * @param update  用于操作原有数据和更新数据生成新的数据的函数指针 
 * @return 数据的index, 小于0表示出错 
 */ 
int         update_or_insert_data(const void* key, void* data, ccache_t* cache, cmpfun cmp, delfun del, updatefun update); 
 
/** 
 * @brief 使用visit函数指针访问cache中的所有节点 
 * @param cache 操作共享内存的数据结构 
 * @param visit  用于访问节点数据的函数指针 
 * @return 成功返回0, 失败返回-1 
 */ 
int        visit_cache(ccache_t* cache, visitfun visit); 
 
#ifdef __cplusplus 
} 
#endif /* __cplusplus */ 
 
#endif /* __CCACHE_H__ */