apilockht.c
来自「用c/c++实现的一个CMPP API」· C语言 代码 · 共 368 行
C
368 行
/*---------------------------------------------------------------* * File: apilockht.h * Desc: 实现内存哈希表的实现文件,带互斥 * * copyright@Wenyz Aspire Co. * 2002/11/28 *-------------------------changeLog ----------------------------* * DATE Author Description * *2002/11/28 wenyz Created * *---------------------------------------------------------------*/ #include "apilockht.h" // 函数原型定义/**描述: 添加一条记录进入HASH表内存*输入: pHLink HT表句柄, pvKeyAddr KEY值指针, nKeySize KEY长度, pvCellAddr 要添加的包指针,nCellSize 包的长度。 *输出: SHMHT_OK 成功 , SHMHT_FAILED 失败 SHMHT_NOSPACE 没有空间*/int nLockAddACell( recBufFd* prBufFd, void* pvKeyAddr, int nKeySize, void* pvCellAddr, int nCellSize ){ int nRet; int nWriteRet; nRet = nMutexLock( &(prBufFd->BufLock) ); if( nRet != 0 ) { return SHMHT_FAILED; } nWriteRet = nAddACellApi( prBufFd->pvBufPtr, pvKeyAddr, nKeySize, pvCellAddr, nCellSize ); nRet = nMutexUnlock( &(prBufFd->BufLock) ); if( nRet != 0 ) { return SHMHT_FAILED; } return nWriteRet;}/**描述: 添加一条记录进入HASH表内存, 如果已经有一条的话,就update,如果没有就添加*输入: pHLink HT表句柄, pvKeyAddr KEY值指针, nKeySize KEY长度, pvCellAddr 要添加的包指针,nCellSize 包的长度。 *输出: SHMHT_OK, 成功, SHMHT_FAILED 失败 SHMHT_NOSPACE 空间不够*/int nLockAddACellAndUpdate( recBufFd* prBufFd, void* pvKeyAddr, int nKeySize, void* pvCellAddr, int nCellSize ){ int nRet; int nFuncRet; nRet = nMutexLock( &(prBufFd->BufLock) ); if( nRet != 0 ) { return SHMHT_FAILED; } nFuncRet = nAddACellAndUpdateApi( prBufFd->pvBufPtr, pvKeyAddr, nKeySize, pvCellAddr, nCellSize ); nRet = nMutexUnlock( &(prBufFd->BufLock) ); if( nRet != 0 ) { return SHMHT_FAILED; } return nFuncRet;}/*描述:删除HASH表内存一条记录输入:pHLink HT表句柄,pvKeyAddr KEY值指针, nKeySize KEY长度,nCellSize 包的长度。 输出:pvCellAddr 删除的包指针*返回:SHMHT_OK, 成功, SHMHT_FAILED 失败 SHMHT_NOFOUND 没有该包,*/int nLockDelACell( recBufFd* prBufFd, void* pvKeyAddr, int nKeySize, void* pvCellAddr, int nCellSize ){ int nRet; int nFuncRet; nRet = nMutexLock( &(prBufFd->BufLock) ); if( nRet != 0 ) { return SHMHT_FAILED; } nFuncRet = nDelACellApi( prBufFd->pvBufPtr, pvKeyAddr, nKeySize, pvCellAddr, nCellSize ); nRet = nMutexUnlock( &(prBufFd->BufLock) ); if( nRet != 0 ) { return SHMHT_FAILED; } return nFuncRet;}/**描述:查找HASH表内存一条记录*输入:pHLink HT表句柄,pvKeyAddr KEY值指针, nKeySize KEY长度, nCellSize 包的长度。 *输出:pvCellAddr 查找的包指针*返回:SHMHT_OK, 成功, SHMHT_FAILED 失败 SHMHT_NOFOUND 没有该包,*/int nLockSerACell( recBufFd* prBufFd, void* pvKeyAddr, int nKeySize, void* pvCellAddr, int nCellSize ){ int nRet; int nFuncRet; nRet = nMutexLock( &(prBufFd->BufLock) ); if( nRet != 0 ) { return SHMHT_FAILED; } nFuncRet = nSerACellApi( prBufFd->pvBufPtr, pvKeyAddr, nKeySize, pvCellAddr, nCellSize ); nRet = nMutexUnlock( &(prBufFd->BufLock) ); if( nRet != 0 ) { return SHMHT_FAILED; } return nFuncRet; } /**描述:更新HASH表内存一条记录*输入:pHLink HT表句柄,pvKeyAddr KEY值指针, nKeySize KEY长度, pvCellAddr 更新的包指针,nCellSize 包的长度。 *输出: 无*返回:SHMHT_OK, 成功, SHMHT_FAILED 失败 SHMHT_NOFOUND 没有该包,*/int nLockUpdateACell( recBufFd* prBufFd, void* pvKeyAddr, int nKeySize, void* pvCellAddr, int nCellSize ){ int nRet; int nFuncRet; nRet = nMutexLock( &(prBufFd->BufLock) ); if( nRet != 0 ) { return SHMHT_FAILED; } nFuncRet = nUpdateACellApi( prBufFd->pvBufPtr, pvKeyAddr, nKeySize, pvCellAddr, nCellSize ); nRet = nMutexUnlock( &(prBufFd->BufLock) ); if( nRet != 0 ) { return SHMHT_FAILED; } return nFuncRet; } /**描述: 取出一个超时的记录*输入: pHLink HT表句柄, nTimeOut 超过时间间隔*输出pvKeyAddr KEY值指针, nKeySize KEY长度, pvCellAddr 查找的包指针,nCellSize 包的长度。 *返回:>=0 成功 , <0 失败*/int nLockGetTimeOutACell( recBufFd* prBufFd, int nTimeOut, void* pvKeyAddr, int nKeySize, void* pvCellAddr, int nCellSize ){ int nRet; int nFuncRet; nRet = nMutexLock( &(prBufFd->BufLock) ); if( nRet != 0 ) { return SHMHT_FAILED; } nFuncRet = nGetTimeOutACellApi( prBufFd->pvBufPtr, nTimeOut, pvKeyAddr, nKeySize, pvCellAddr, nCellSize ); nRet = nMutexUnlock( &(prBufFd->BufLock) ); if( nRet != 0 ) { return SHMHT_FAILED; } return nFuncRet; }/*--------------------------* *内存表的三个函数定义 * ---------------------------*//*描述: 初始化固定长度的HASH表内存输入: nKeySize KEY值的长度。 nPckSize 包体长度 nBucket 桶的个数, nPckCount 包的个数 *输出:recBufFd* prBufFd *返回:SHMHT_OK 成功,SHMHT_FAILED 错误*/int nLockInitMemHT( int nKeySize, int nPckSize, int nBucket, int nPckCount, recBufFd* prBufFd ){ void* ptr; int nRet; // return value if ( nKeySize <= 0 || nPckSize <= 0 || nBucket <= 0 || nPckCount <= 0 || prBufFd == NULL) return SHMHT_FAILED; /* * init queue */ ptr = pvInitMemHT( nKeySize, nPckSize, nBucket, nPckCount ); if( ptr == NULL ) return SHMHT_FAILED; prBufFd->pvBufPtr = ptr; /* * init mutex */ nRet = nMutexInit( &(prBufFd->BufLock) ); if( nRet != 0 ) return SHMHT_FAILED; /* * set block flag; */ //prBufFd->bBlock = bBlock; return SHMHT_OK; } /**描述: 释放该HASH表的内存*输入: prBufFd HT表句柄*输出: 无 返回: SHMHT_OK 成功,SHMHT_FAILED 错误*/int nLockRemoveMemHT( recBufFd* prBufFd ){ int nRet ; nRet = nMutexDestroy( &(prBufFd->BufLock) ); if( nRet != 0 ) return SHMHT_FAILED; return nRemoveMemHT( prBufFd->pvBufPtr ); }/**描述: 复位HASH表内存*输入: prBufFd HT表句柄, *输出: *返回: SHMHT_OK 成功,SHMHT_FAILED 错误*/int nLockResetMemHT( recBufFd* prBufFd ){ int nRet; int nFuncRet; nRet = nMutexLock( &(prBufFd->BufLock) ); if( nRet != 0 ) { return SHMHT_FAILED; } nFuncRet = nResetMemHT( prBufFd->pvBufPtr ); nRet = nMutexUnlock( &(prBufFd->BufLock) ); if( nRet != 0 ) { return SHMHT_FAILED; } return nFuncRet; } /**function 调试工具*/void vLockDumpHT( FILE* fp, recBufFd* prBufFd ){ vDumpHTApi( fp, prBufFd->pvBufPtr ); return ;}/*描述: 得到HASH表内存的负载系数和包的个数输入: prBufFd HT表句柄, 输出: pnCellNum 包的个数返回: 0-100负载的百分比系数*/int nLockGetHTLoad( recBufFd* prBufFd, int* pnCellNum ){ int nRet; int nFuncRet; nRet = nMutexLock( &(prBufFd->BufLock) ); if( nRet != 0 ) { return SHMHT_FAILED; } nFuncRet = nGetHTLoadApi( prBufFd->pvBufPtr, pnCellNum ); nRet = nMutexUnlock( &(prBufFd->BufLock) ); if( nRet != 0 ) { return SHMHT_FAILED; } return nFuncRet; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?