?? apiht.h
字號:
/*---------------------------------------------------------------* * File: apiht.h * Desc: 實現內存哈希表的定義 * * copyright@Wenyz Aspire Co. * 2002/11/09 *-------------------------changeLog ----------------------------* * DATE Author Description * *2002/11/09 wenyz Created *--------------------------------------------------------------- *2002/11/09 wenyz 整理代碼,用于貨架技術 *2002/11/26 wenyz ANSIC 版本 *---------------------------------------------------------------*/ #ifndef HASH_TABLE_HPP#define HASH_TABLE_HPP#include "os.h"#define SHMHT_OK 0 /* 返回成功 */#define SHMHT_FAILED -1 /* 失敗 */#define SHMHT_NOSPACE -3 /* 沒有空間 */#define SHMHT_NOFOUND -3 /* 沒有該內容包 *//**一個包的內容*包括 下一個指針,key值,包內容*/struct tagrecHashCell{ struct tagrecHashCell* pNext; /*下一個結點*/ struct tagrecHashCell* pPrev; /*前一個結點*/ time_t tMsgTime; /*消息操作時間*/ int nKeySize; /*key的長度*/ void* pvKey; /*key的內容地址*/ int nPckSize; /*包體長度*/ void* pvPck; /*包體內容地址*/};typedef struct tagrecHashCell recHashCell;/**內存的管理在這個隊列實現, *申請空間從這個隊列讀一個包,*釋放空間往這個隊列寫一個包*在初始化時候往這個對列寫入最多的包*/typedef struct tagrecFreeQCell{ int nHead; /*內存管理隊列的頭*/ int nTail; /*內存管理隊列的尾*/ recHashCell** pvAddr; /* 地址空間數組 */}recFreeQCell; typedef struct tagHTCell{ int nInitFlag; /*是否初始化標志*/ int nShmSize; /*申請的總共內容包內存大小*/ int nMsgMaxNum; /*哈希表中包最多個數*/ int nBucket; /*哈希表的桶數*/ int nSize; /*哈希表中包長度*/ int nKeySize; /*哈希表中key的長度*/ int nIterFlag ; /* for iterator */ recHashCell* pMarkCell; /* for iterator */ recHashCell* pCurrCell; /* for iterator */ int nCurrentBucket; /* for iterator */ void* pSAddr; /*內容包的開始地址*/ void* pEAddr; /*內容包的結束地址*/ time_t tMsgTime; /*哈希表中最后一條操作消息時間*/ pid_t nMsgPid; /*哈希表最后一條操作消息進程ID*/ recHashCell** pBucket; /*哈希表的桶的首指針數組*/ recFreeQCell RecFreeQ; /*空閑的內存管理隊列*/}recHTCell; /**function 調試工具*/void vDumpHTApi( FILE* fp, void* pAddr );/*描述: 得到HASH表內存的負載系數和包的個數輸入: pvHLink HT表句柄, 輸出: pnCellNum 包的個數返回: 0-100負載的百分比系數*/int nGetHTLoadApi( void* pvHTLink, int* pnCellNum ); /*描述: 得到HASH表內存的pBucket指針數組的首地址輸入: pvHLink HT表句柄, 輸出: recHashCell*** pppBucket, int* pnCount 指針數組個數返回: SHMHT_OK 成功 SHMHT_FAILED 錯誤, */int nGetHTpBucketApi( void* pvHTLink, recHashCell*** pppBucket, int* pnCount );/*描述: 通過KEY得到HASH表內存的pBucket指針的首地址輸入: pvHLink HT表句柄, pvKeyAddr, KEY的地址, nKeySize KEY的長度 輸出: recHashCell** ppBucket返回: SHMHT_OK 成功 SHMHT_FAILED 錯誤,*/int nGetHTpBucketByKeyApi( void* pvHTLink, void* pvKeyAddr, int nKeySize, recHashCell** ppBucket );/**描述: 添加一條記錄進入HASH表內存*輸入: pHLink HT表句柄, pvKeyAddr KEY值指針, nKeySize KEY長度, pvCellAddr 要添加的包指針,nCellSize 包的長度。 *輸出: SHMHT_OK 成功 , SHMHT_FAILED 失敗 SHMHT_NOSPACE 沒有空間*/int nAddACellApi( void* pvHTLink, void* pvKeyAddr, int nKeySize, void* pvCellAddr, int nCellSize );/**描述: 添加一條記錄進入HASH表內存, 如果已經有一條的話,就update,如果沒有就添加*輸入: pHLink HT表句柄, pvKeyAddr KEY值指針, nKeySize KEY長度, pvCellAddr 要添加的包指針,nCellSize 包的長度。 *輸出: SHMHT_OK, 成功, SHMHT_FAILED 失敗 SHMHT_NOSPACE 空間不夠*/int nAddACellAndUpdateApi( void* pvHTLink, void* pvKeyAddr, int nKeySize, void* pvCellAddr, int nCellSize );/*描述:刪除HASH表內存一條記錄輸入:pHLink HT表句柄,pvKeyAddr KEY值指針, nKeySize KEY長度,nCellSize 包的長度。 輸出:pvCellAddr 刪除的包指針*返回:SHMHT_OK, 成功, SHMHT_FAILED 失敗 SHMHT_NOFOUND 沒有該包,*/int nDelACellApi( void* pvHTLink, void* pvKeyAddr, int nKeySize, void* pvCellAddr, int nCellSize );/**描述:查找HASH表內存一條記錄*輸入:pHLink HT表句柄,pvKeyAddr KEY值指針, nKeySize KEY長度, nCellSize 包的長度。 *輸出:pvCellAddr 查找的包指針*返回:SHMHT_OK, 成功, SHMHT_FAILED 失敗 SHMHT_NOFOUND 沒有該包,*/int nSerACellApi( void* pvHTLink, void* pvKeyAddr, int nKeySize, void* pvCellAddr, int nCellSize );/**描述:更新HASH表內存一條記錄*輸入:pHLink HT表句柄,pvKeyAddr KEY值指針, nKeySize KEY長度, pvCellAddr 更新的包指針,nCellSize 包的長度。 *輸出: 無*返回:SHMHT_OK, 成功, SHMHT_FAILED 失敗 SHMHT_NOFOUND 沒有該包,*/int nUpdateACellApi( void* pvHTLink, void* pvKeyAddr, int nKeySize, void* pvCellAddr, int nCellSize );/**描述:通過函數指針更新HASH表一條記錄*輸入:pHLink HT表句柄,pvKeyAddr KEY值指針, nKeySize KEY長度, int (*pfnPckFunc)( void*, size_t )更新函數的函數指針 void* 為包指針, size_t為包的長度 注意 pfnPckFunc()為外部使用的更改內存內容的函數, 可以任意修改內存中數據*輸出: 無*返回:SHMHT_OK, 成功, SHMHT_FAILED 失敗 SHMHT_NOFOUND 沒有該包,*/int nUpdateACellByFunc( void* pvHTLink, void* pvKeyAddr, int nKeySize, int (*pfnPckFunc)( void*, size_t ) );/**描述:通過函數指針更新HASH表一條記錄, * 如果沒有該KEY的包,添加進去*輸入:pHLink HT表句柄,pvKeyAddr KEY值指針, nKeySize KEY長度, int (*pfnPckFunc)( void*, size_t )更新函數的函數指針 void* 為包指針, size_t為包的長度 注意 pfnPckFunc()為外部使用的更改內存內容的函數, 可以任意修改內存中數據*輸出: 無*返回:SHMHT_OK, 成功, SHMHT_FAILED 失敗 SHMHT_NOSPACE 沒有內存空間*/int nAddOrUpdateACellByFunc( void* pvHTLink, void* pvKeyAddr, int nKeySize, void* pvCellAddr, int nCellSize, int (*pfnPckFunc)( void*, size_t ) );/**描述: 取出一個超時的記錄*輸入: pHLink HT表句柄, nTimeOut 超過時間間隔*輸出pvKeyAddr KEY值指針, nKeySize KEY長度, pvCellAddr 查找的包指針,nCellSize 包的長度。 *返回:>=0 成功 , <0 失敗*/int nGetTimeOutACellApi( void* pHTLink, int nTimeOut, void* pvKeyAddr, int nKeySize, void* pvCellAddr, int nCellSize );/**描述: 刪除HASH表內存一條記錄(通過包內容)*輸入: pHLink HT表句柄 pvCellAddr 刪除的包指針,nCellSize 包的長度。 *輸出: pvKeyAddr KEY值指針, nKeySize KEY長度*返回: SHMHT_OK 成功 SHMHT_FAILED 錯誤,*/int nDelACellByPckApi( void* pvHTLink, void* pvKeyAddr, int nKeySize, void* pvCellAddr, int nCellSize );/*描述: 復位HASH表內存輸入: pvHLink HT表句柄, 輸出: 返回: 0 成功,-1 輸入參數錯誤,-2 內部函數錯誤*/int nResetShmHTApi( void* pvHLink );/*--------------------------* *內存表的三個函數定義 * ---------------------------*//*描述: 初始化固定長度的HASH表內存輸入: nKeySize KEY值的長度。 nPckSize 包體長度 nBucket 桶的個數, nPckCount 包的個數 *返回:HT表句柄 >0 成功 , NULL 失敗*/void* pvInitMemHT( int nKeySize, int nPckSize, int nBucket, int nPckCount );/**描述: 釋放該HASH表的內存*輸入: pvHLink HT表句柄*輸出: 無 返回: SHMHT_OK 成功,SHMHT_FAILED 錯誤*/int nRemoveMemHT( void* pvHLink );/**描述: 復位HASH表內存*輸入: pvHLink HT表句柄, *輸出: *返回: SHMHT_OK 成功,SHMHT_FAILED 錯誤*/int nResetMemHT( void* pvHLink );/**描述: 檢查輸入參數合法性*輸入: pHLink HT表句柄 nKeySize KEY 長度 nCellSize 包的長度。 *輸出: *返回: SHMHT_OK 成功 SHMHT_FAILED 錯誤,*/int nCheckInputSize( int nKeySize, int nCellSize, const recHTCell* pHTLink );/**描述: 從一個桶中取出一個超時的記錄*輸入: pHLink HT表句柄,nBucket 桶的下標, nTimeOut 超過時間間隔 輸出pvKeyAddr KEY值指針, nKeySize KEY長度, pvCellAddr 查找的包指針,nCellSize 包的長度。 如果pvKeyAddr, nKeySize , pvCellAddr, nCellSize 為空的話, 清除所有超時的包 *輸出:>=0 成功 清除的包的個數, SHMHT_FAILED 失敗 */int nGetABucketTimeOutCell( void* pvHTLink, int nBucket, int nTimeOut, void* pvKeyAddr, int nKeySize, void* pvCellAddr, int nCellSize );#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -