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 + -
显示快捷键?