⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cbuffer.cpp.bak

📁 一个vxworks开发的snmp的程序
💻 BAK
字号:
/********************************************************
	CBuffer.c -- Main File of Buffer Class
********************************************************/
#include "stdafx.h"
#include "CBuffer.h"

CBuffer::CBuffer(int nUnitSize,int nUnitNum, BOOL bSem)
{
	m_nUnitSize = nUnitSize;
	m_nUnitNum = nUnitNum;
	if(bSem)
		m_hSemaphore = CreateSemaphore(NULL,0,m_nUnitNum,NULL);
	else
		m_hSemaphore = 0;
	m_hMutexRead = CreateMutex(NULL,TRUE,NULL);
	m_hMutexWrite = CreateMutex(NULL,TRUE,NULL);
	m_nCurrent = m_nHead = m_nTail = 0;
	m_chBody = new unsigned char[nUnitSize * (nUnitNum + 1)];
}

CBuffer::~CBuffer()
{
	if(m_hRead)
		CloseHandle(m_hRead);
	if(m_hWrite)
		CloseHandle(m_hWrite);
	if(m_hSemaphore)
		CloseHandle(m_hSemaphore);
	delete(m_chBody);
}

int CBuffer::PutTo(unsigned char * Source, int nSourceSize)
{
	int nLength = 0;
	WaitForSingleObject(m_hMutexWrite,1000);
	if(!IsFull())//不满
	{
		nLength = (nSourceSize < m_nUnitSize)?nSourceSize:m_nUnitSize;
		memcpy((m_chBody+(m_nUnitSize * m_nHead)),Source,nLength);
		m_nHead = INC(m_nHead);
		ReleaseSemaphore(m_hSemaphore,1,NULL);
	}
	ReleaseMutex(m_hMutexWrite);
	return nLength;
}
int CBuffer::Append(unsigned char * Source, int nSourceSize, BOOL bFinish)
{//从上一次填充指针继续填写,到bFinish和溢出更新指针
	int nLength;
	nLength = (nSourceSize < (m_nUnitSize - m_nCurrent))?nSourceSize:(m_nUnitSize - m_nCurrent);		
	WaitForSingleObject(m_hMutexWrite,1000);
	if(m_nCurrent == 0)//当前指向0表示是新的一帧
	{
		if(!IsFull())//不满
		{
			memcpy((m_chBody+(m_nUnitSize * m_nHead)),Source,nLength);
			m_nCurrent += nLength;
		}else
			nLength = 0;
	}else//表示从前次中间开始向后加
	{
		memcpy((m_chBody+(m_nUnitSize*m_nHead)+m_nCurrent),Source,nLength);
		m_nCurrent += nLength;
	}
	if(m_nCurrent >= (m_nUnitSize - 1))
	{
		m_nHead = INC(m_nHead);
		ReleaseSemaphore(m_hSemaphore,1,NULL);
	}
	ReleaseMutex(m_hMutexWrite);
	return nLength;
}
int CBuffer::GetFrom(unsigned char *Dest, int nDestSize)
{
	int nLength = 0;
	if(m_hSemaphore)
		WaitForSingleObject(m_hSemaphore,-1);
	WaitForSingleObject(m_hMutexRead,1000);
	if(!IsEmpty())//不空
	{
		nLength = (nDestSize < m_nUnitSize)?nDestSize:m_nUnitSize;
		memcpy(Dest,m_chBody+(m_nUnitSize * m_nTail),nLength);
		m_nTail = INC(m_nTail);
	}
	ReleaseMutex(m_hMutexRead);
	return nLength;
}

BOOL CBuffer::Unlock()
{
	return ReleaseSemaphore(m_hSemaphore,1,NULL);
}

BOOL CBuffer::Clear()
{
	BOOL bRtnValue = TRUE;
	if(WaitForSingleObject(m_hMutexRead,1000) == WAIT_OBJECT_0)	
	{
		if(WaitForSingleObject(m_hMutexWrite,1000) == WAIT_OBJECT_0)
		{
			//Clear the Buffer
			m_nHead = m_nTail = 0;
			ReleaseMutex(m_hMutexWrite);
		}
		else
			bRtnValue = FALSE;
		ReleaseMutex(m_hMutexRead);
	}
	else
		bRtnValue = FALSE;
	return bRtnValue;
}

BOOL CBuffer::NewSize(int nNewUnitSize, int nNewUnitNum)
{
	BOOL bRtnValue = TRUE;
	if(WaitForSingleObject(m_hMutexRead,1000) == WAIT_OBJECT_0)	
	{
		if(WaitForSingleObject(m_hMutexWrite,1000) == WAIT_OBJECT_0)
		{
			//Clear the Buffer and adjust Size
			m_nHead = m_nTail = 0;
			delete(m_chBody);
			m_nUnitNum = nNewUnitNum;
			m_nUnitSize = nNewUnitSize;
			m_chBody = new unsigned char[nNewUnitSize * (nNewUnitNum + 1)]; 
			ReleaseMutex(m_hMutexWrite);
		}
		else
			bRtnValue = FALSE;
		ReleaseMutex(m_hMutexRead);
	}
	else
		bRtnValue = FALSE;
	return bRtnValue;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -