环形内存,circle memory

typedef struct tagONLY_CIRCLE_MEM
{
 UINT32 nMemSize;
 UINT8 *pBuf;
 UINT8 *pWrite;
 UINT8 *pRead;
 BOOL   bTag; //
是否pWrite是在pRead之后
#ifdef WIN32
 HMUTEX hBufMutex;
#elif _LINUX
 pthread_mutex_t hBufMutex;
#endif
}ONLY_CIRCLE_MEM PACKED;

typedef void* HOCM

 


HOM  ocmAlloc(UINT32 nMemSize)
{
 ONLY_CIRCLE_MEM *pOCM = malloc(sizeof(ONLY_CIRCLE_MEM));
 if(pOCM==NULL)
  return NULL;
 pOCM->pBuf = malloc(nMemSize);
 if(pOCM->pBuf==NULL)
 {
  free(pOCM);
  return NULL;
 }
 pOCM->pWrite = pOCM->pBuf;
 pOCM->pRead = pOCM->pBuf;
 pOCM->nMemSize = nMemSize;
 pOCM->bTag = TRUE;
#ifdef WIN32
 pOCM->hBufMutex=CreateMutex(NULL, FALSE, NULL);
#elif _LINUX
 pOCM->hBufMutex =  (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER;
#endif
 return pOCM;
}

void ocmFree(HOCM hocm)
{
 ONLY_CIRCLE_MEM *pOCM =(ONLY_CIRCLE_MEM*)hocm;
 if(pOCM==NULL)
  return;
#ifdef WIN32
 CloseHandle(pOCM->hBufMutex);
#elif _LINUX
 pthread_mutex_destroy(&pOCM->hBufMutex);
#endif 
 if(pOCM->pBuf!=NULL)
 {
  free(pOCM->pBuf);
 }
 pOCM->pRead = NULL;
 pOCM->pWrite = NULL;
 free(pOCM);
}

UINT32  ocmPut(HOCM hocm, void *pBuf, UINT32 nBufLen)
{
 ONLY_CIRCLE_MEM *pOCM = (ONLY_CIRCLE_MEM*)hocm;
 UINT32 nLeftLen=nBufLen;
 INT32 rc;

 if(pOCM==NULL || pOCM->pBuf ==NULL)
 {
  return 0;
 }

#ifdef WIN32
 WaitForSingleObject(pOCM->hBufMutex, INFINITE);
#elif _LINUX
 rc = pthread_mutex_lock(&pOCM->hBufMutex);
 if(rc)
 {
  printf("Cannot lock the thread mutex\n");
  pthread_exit(NULL);
 }
#endif

 while(nLeftLen>0)
 {
  if(pOCM->bTag)
  {
   if(  
pOCM ->pBuf+pOCM->nMemSize-pOCM->pWrite>nLeftLen)
   {
    memcpy(pOCM->pWrite, (UINT8*)pBuf+(nBufLen-nLeftLen), nLeftLen);
    pOCM->pWrite += nLeftLen;
    nLeftLen = 0;
   }
   else
   {
    memcpy(pOCM->pWrite, (UINT8*)pBuf+(nBufLen-nLeftLen), pOCM->pBuf+pOCM->nMemSize-pOCM->pWrite);
    nLeftLen -= pOCM->pBuf+pOCM->nMemSize-pOCM->pWrite;
    pOCM->pWrite = pOCM->pBuf;
    pOCM->bTag = FALSE;
   }
  }
  else
  {
   if(pOCM->pRead-pOCM->pWrite>nLeftLen)
   {
    memcpy(pOCM->pWrite, (UINT8*)pBuf+(nBufLen-nLeftLen), nLeftLen);
    pOCM->pWrite += nLeftLen;
    nLeftLen=0;
   }
   else
   {
    memcpy(pOCM->pWrite, (UINT8*)pBuf+(nBufLen-nLeftLen), pOCM->pRead-pOCM->pWrite);
    nLeftLen -= pOCM->pRead-pOCM->pWrite;
    pOCM->pWrite = pOCM->pRead;
    break;
   }
   
  }
 }

#ifdef WIN32
 ReleaseMutex(pOCM->hBufMutex);   
#elif _LINUX
 rc = pthread_mutex_unlock(&pOCM->hBufMutex);
 if(rc)
 {
  printf("Cannot unlock the thread mutex\n");
  pthread_exit(NULL);
 }
#endif
 return nBufLen-nLeftLen;
}

UINT32 ocmGet(HOM hocm, void *pBuf, UINT32 nDataLen)
{
 ONLY_CIRCLE_MEM *pOCM = (ONLY_CIRCLE_MEM*)hocm;
 UINT32 nLeftLen=nDataLen;
 INT32 rc;
 if(pOCM==NULL ||pOCM->pBuf==NULL)
 {
  return 0;
 }
#ifdef WIN32
 WaitForSingleObject(pOCM->hBufMutex, INFINITE);
#elif _LINUX
 rc = pthread_mutex_lock(&pOCM->hBufMutex);
 if(rc)
 {
  printf("Cannot lock the thread mutex\n");
  pthread_exit(NULL);
 }
#endif 
 while(nLeftLen>0)
 {
  if(pOCM->bTag)
  {
   if(pOCM->pWrite-pOCM->pRead >nLeftLen)
   {
    memcpy((UINT8*)pBuf+(nDataLen-nLeftLen), pOCM->pRead, nLeftLen);
    pOCM->pRead += nLeftLen;
    nLeftLen = 0;
   }
   else
   {
    memcpy((UINT8*)pBuf+(nDataLen-nLeftLen), pOCM->pRead, pOCM->pWrite-pOCM->pRead);
    nLeftLen -= (pOCM->pWrite-pOCM->pRead);
    pOCM->pRead = pOCM->pWrite;
    break;
   }
  }
  else
  {
   if(pOCM->pBuf+pOCM->nMemSize-pOCM->pRead>nLeftLen)
   {
    memcpy((UINT8*)pBuf+(nDataLen-nLeftLen), pOCM->pRead, nLeftLen);
    pOCM->pRead+=nLeftLen;
    nLeftLen=0;
   }
   else
   {
    memcpy((UINT8*)pBuf+(nDataLen-nLeftLen), pOCM->pRead, pOCM->pBuf+pOCM->nMemSize-pOCM->pRead);
    nLeftLen -= pOCM->pBuf+pOCM->nMemSize-pOCM->pRead;
    pOCM->pRead = pOCM->pBuf;
    pOCM->bTag = TRUE;
   }

  }
 }
#ifdef WIN32
 ReleaseMutex(pOCM->hBufMutex);   
#elif _LINUX
 rc = pthread_mutex_unlock(&pOCM->hBufMutex);
 if(rc)
 {
  printf("Cannot unlock the thread mutex\n");
  pthread_exit(NULL);
 }
#endif
 return nDataLen-nLeftLen;
}

只给出部分代码,不讲解。注意开头的那个结构体中的 BOOL   bTag; 的重要作用
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值