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

📄 memory.cpp

📁 具有工业强度的内存池动态库
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		// Make sure outputs exist
		if (pOutputInfo->dwOutputHead != pOutputInfo->dwOutputTail) 
		{
			// jump to the head
			pOutputArea += dwOutputNumber;

			// check for block not in use
			if (pOutputArea->bInUse)
			{
				// copy to return value
				memcpy(pOutput, pOutputArea, sizeof(OUTPUT_DESC));

				// if this block is also the head, update the head
				if (dwOutputNumber == pOutputInfo->dwOutputHead)
				{
					pOutputInfo->dwOutputHead = (pOutputInfo->dwOutputHead + 1) % 
						(m_pOutputArea->GetCurrentSize() / sizeof(OUTPUT_DESC));
				}
				else if (dwOutputNumber == pOutputInfo->dwOutputTail)
				{
					if (pOutputInfo->dwOutputTail == 0)
					{
						pOutputInfo->dwOutputTail = (m_pOutputArea->GetCurrentSize() / sizeof(OUTPUT_DESC));
					}
					else
					{
						pOutputInfo->dwOutputTail--;
					}
				}

				pOutputArea->bInUse = BLOCK_FREE;
			}
			else
			{
				dwStatus = ERROR_INVALID_BLOCK;
			}
		}
		else
		{
			dwStatus = ERROR_NO_MORE_ITEMS;
		}

	}
	__except(MemoryExcFilter(GetExceptionInformation(),OUTPUT_AREA))
	{
		dwStatus = GetExceptionCode();

		switch (dwStatus)
		{
		case EXCEPTION_GMMF_DISKFULL:		dwStatus = MEM_DISKFULL;	break;
		case EXCEPTION_GMMF_CORRUPTEDRGN:	dwStatus = MEM_CORRUPT;	break;
		case EXCEPTION_GMMF_WRITEPAST:		dwStatus = MEM_WRITEPAST;	break;
		default:							dwStatus = MEM_UNKNOWN;	break;
		}

		LETGO(m_hOutputLock);
		return(dwStatus);
	}

	LETGO(m_hOutputLock);

	return(dwStatus);
}


//----(Member Function)-------------------------------------------------------
//
// @mfunc This function returns the number of elements in the output queue
//
// @parm  None
//
// @rvalue ERROR_SUCCESS | If successful
//
EXPORT32 DWORD CCommonMemory::GetOutputCount(OUT DWORD *dwCurrentSize)
{
	DWORD dwStatus = ERROR_SUCCESS;

	// get a pointer to the Output area
	// first part of output area is the information part containing
	// the head and tail, and statistics
	OUTPUT_INFO *pOutputInfo;// = (OUTPUT_INFO *)m_pOutputArea->GetAddress();
	OUTPUT_DESC *pOutputArea;// = (OUTPUT_DESC *)(pOutputInfo + 1);
	
	// Check for a NULL pointer
	if (NULL == dwCurrentSize)
		return(ERROR_INVALID_PARAMETER);
	
	WAITFOR(m_hOutputLock);

	pOutputInfo = (OUTPUT_INFO *)m_pOutputArea->GetAddress();
	pOutputArea = (OUTPUT_DESC *)(pOutputInfo + 1);


	__try
	{
		// if the tail is greater than the head, no overlap 
		// is in effect
		if (pOutputInfo->dwOutputTail > pOutputInfo->dwOutputHead)
		{
			*dwCurrentSize = pOutputInfo->dwOutputTail - pOutputInfo->dwOutputHead;
		}
		else
		{
			// calculate head to end
			*dwCurrentSize = (m_pOutputArea->GetCurrentSize() / 
				sizeof(OUTPUT_DESC)) - pOutputInfo->dwOutputHead;

			// add in tail
			*dwCurrentSize += pOutputInfo->dwOutputTail;
 		}
	}
	__except(MemoryExcFilter(GetExceptionInformation(),OUTPUT_AREA))
	{
		dwStatus = GetExceptionCode();

		switch (dwStatus)
		{
		case EXCEPTION_GMMF_DISKFULL:		dwStatus = MEM_DISKFULL;  break;
		case EXCEPTION_GMMF_CORRUPTEDRGN:	dwStatus = MEM_CORRUPT;   break;
		case EXCEPTION_GMMF_WRITEPAST:		dwStatus = MEM_WRITEPAST; break;
		default:							dwStatus = MEM_UNKNOWN;   break;
		}

		LETGO(m_hOutputLock);
		return(dwStatus);
	}


	LETGO(m_hOutputLock);

	return(ERROR_SUCCESS);
}


//
// Start of Exception Area access functions
//
//----(Member Function)-------------------------------------------------------
//
// @mfunc This function adds an Exception to the Exception queue
//
// @parm  IN LPVOID | pException | Pointer to Exception information
//
// @rvalue ERROR_SUCCESS | If successful
//
// @rvalue ERROR_INVALID_BLOCK | If block not in use
//
//
EXPORT32 LONG CCommonMemory::AddException(IN LPVOID pException)
{
	// get a pointer to the Exception area
	// first part of Exception area is the information part containing
	// the head and tail, and statistics
	EXCEPTION_INFO *pExceptionInfo;// = (EXCEPTION_INFO *)m_pExceptionArea->GetAddress();
	EXCEPTION_DESC *pExceptionArea;// = (EXCEPTION_DESC *)(pExceptionInfo + 1);
	DWORD dwCurrentSize,
		  dwStatus = ERROR_SUCCESS;
	
	// Check for a NULL po
	if (NULL == pException)
		return(ERROR_INVALID_PARAMETER);
	
	WAITFOR(m_hExceptionLock);

	pExceptionInfo = (EXCEPTION_INFO *)m_pExceptionArea->GetAddress();
	pExceptionArea = (EXCEPTION_DESC *)(pExceptionInfo + 1);


	__try
	{
		DWORD dwTempTail;

		// jump to the tail, make sure to jump passed info at beginning
		pExceptionArea += pExceptionInfo->dwExceptionTail;

		// Check if this will cause an overrun
		if (m_pExceptionArea->GetCurrentSize() == 0)
			dwTempTail = 1;
		else
			dwTempTail = (pExceptionInfo->dwExceptionTail + 1) % 
				(m_pExceptionArea->GetCurrentSize() / sizeof(EXCEPTION_DESC));

		if (dwTempTail == pExceptionInfo->dwExceptionHead)
		{
			// Do overrun stuff
			memcpy((CHAR *)m_pExceptionArea->GetAddress() + m_pExceptionArea->GetCurrentSize(), 
				m_pExceptionArea->GetAddress(), 
				pExceptionInfo->dwExceptionTail * sizeof(EXCEPTION_DESC));
		
			dwTempTail = (pExceptionInfo->dwExceptionTail + 1) % 
				(m_pExceptionArea->GetCurrentSize() / sizeof(EXCEPTION_DESC));
		}

		// now add our new Exception at the tail 
		memcpy(pExceptionArea, pException, sizeof(EXCEPTION_DESC));

		// update the tail pointer
		pExceptionInfo->dwExceptionTail = dwTempTail;
		pExceptionArea->bInUse = BLOCK_INUSE;

	}
	__except(MemoryExcFilter(GetExceptionInformation(),EXCEPTION_AREA))
	{
		dwStatus = GetExceptionCode();

		switch (dwStatus)
		{
		case EXCEPTION_GMMF_DISKFULL:		dwStatus = MEM_DISKFULL;	break;
		case EXCEPTION_GMMF_CORRUPTEDRGN:	dwStatus = MEM_CORRUPT;		break;
		case EXCEPTION_GMMF_WRITEPAST:		dwStatus = MEM_WRITEPAST;	break;
		default:							dwStatus = MEM_UNKNOWN;		break;
		}
		
		LETGO(m_hExceptionLock);
		return(dwStatus);
	}

	// keep track of statistics on this area
	// if the tail is greater than the head, no overlap 
	// is in effect
	if (pExceptionInfo->dwExceptionTail > pExceptionInfo->dwExceptionHead)
	{
		dwCurrentSize = pExceptionInfo->dwExceptionTail - pExceptionInfo->dwExceptionHead;
	}
	else
	{
		// calculate head to end
		dwCurrentSize = (m_pExceptionArea->GetCurrentSize() / 
			sizeof(EXCEPTION_DESC)) - pExceptionInfo->dwExceptionHead;

		// add in tail
		dwCurrentSize += pExceptionInfo->dwExceptionTail;
 	}

	if (pExceptionInfo->dwMaxNumExceptions <= dwCurrentSize)
		pExceptionInfo->dwMaxNumExceptions = dwCurrentSize;

	LETGO(m_hExceptionLock);

	return(dwStatus);
}


//----(Member Function)-------------------------------------------------------
//
// @mfunc This function Removes an Exception from the Exception queue
//
// @parm  IN LPVOID | pException | Pointer to Exception information
//
// @rvalue ERROR_SUCCESS | If successful
//
// @rvalue ERROR_INVALID_BLOCK | If block not in use
//
// @rvalue ERROR_NO_MORE_ITEMS | if no Exceptions in queue
//
EXPORT32 LONG CCommonMemory::GetExceptionHead(OUT LPVOID pException)
{
	// get a pointer to the Exception area
	// first part of Exception area is the information part containing
	// the head and tail, and statistics
	EXCEPTION_INFO *pExceptionInfo;// = (EXCEPTION_INFO *)m_pExceptionArea->GetAddress();
	EXCEPTION_DESC *pExceptionArea;// = (EXCEPTION_DESC *)(pExceptionInfo + 1);
	DWORD dwStatus = ERROR_SUCCESS;
	
	// Check for a NULL pointer
	if (NULL == pException)
		return(ERROR_INVALID_PARAMETER);

	WAITFOR(m_hExceptionLock);

	pExceptionInfo = (EXCEPTION_INFO *)m_pExceptionArea->GetAddress();
	pExceptionArea = (EXCEPTION_DESC *)(pExceptionInfo + 1);


	__try
	{
		// Make sure Exceptions exist
		if (pExceptionInfo->dwExceptionHead != pExceptionInfo->dwExceptionTail) 
		{
			// XXXX need to check for block not in use....

			// jump to the head
			pExceptionArea += pExceptionInfo->dwExceptionHead;

			// copy to return value
			memcpy(pException, pExceptionArea, sizeof(EXCEPTION_DESC));

			// update the head
			pExceptionInfo->dwExceptionHead = (pExceptionInfo->dwExceptionHead + 1) % 
				(m_pExceptionArea->GetCurrentSize() / sizeof(EXCEPTION_DESC));
			pExceptionArea->bInUse = BLOCK_FREE;

			// for performance reasons, if the head and tail are the same, go back to beginning
			// of memory so that the increment to correct location is less
			if (pExceptionInfo->dwExceptionHead == pExceptionInfo->dwExceptionTail) 
				pExceptionInfo->dwExceptionHead = pExceptionInfo->dwExceptionTail = 1;

		}
		else
		{
			dwStatus = ERROR_NO_MORE_ITEMS;
		}
	}
	__except(MemoryExcFilter(GetExceptionInformation(),EXCEPTION_AREA))
	{
		dwStatus = GetExceptionCode();

		switch (dwStatus)
		{
		case EXCEPTION_GMMF_DISKFULL:		dwStatus = MEM_DISKFULL;	break;
		case EXCEPTION_GMMF_CORRUPTEDRGN:	dwStatus = MEM_CORRUPT;	break;
		case EXCEPTION_GMMF_WRITEPAST:		dwStatus = MEM_WRITEPAST;	break;
		default:							dwStatus = MEM_UNKNOWN;	break;
		}

		LETGO(m_hExceptionLock);
		return(dwStatus);
	}

	LETGO(m_hExceptionLock);

	return(dwStatus);
}


//----(Member Function)-------------------------------------------------------
//
// @mfunc This function Removes a specific Exception from a the Exception queue
//
// @parm  IN LPVOID | pException | Pointer to Exception information
//
// @parm  IN DWORD	| dwExceptionNumber | Exception to retrieve
//
// @rvalue ERROR_SUCCESS | If successful
//
// @rvalue ERROR_INVALID_BLOCK | If block not in use
//
// @rvalue ERROR_NO_MORE_ITEMS | if no Exceptions in queue
//
EXPORT32 LONG CCommonMemory::GetExceptionAt(OUT LPVOID pException, 
											IN DWORD dwExceptionNumber)
{
	// get a pointer to the Exception area
	// first part of Exception area is the information part containing
	// the head and tail, and statistics
	EXCEPTION_INFO *pExceptionInfo;// = (EXCEPTION_INFO *)m_pExceptionArea->GetAddress();
	EXCEPTION_DESC *pExceptionArea;// = (EXCEPTION_DESC *)(pExceptionInfo + 1);
	DWORD dwStatus = ERROR_SUCCESS;
	
	// Check for a NULL pointer
	if (NULL == pException)
		return(ERROR_INVALID_PARAMETER);
	
	WAITFOR(m_hExceptionLock);

	pExceptionInfo = (EXCEPTION_INFO *)m_pExceptionArea->GetAddress();
	pExceptionArea = (EXCEPTION_DESC *)(pExceptionInfo + 1);

	__try
	{
		// Make sure Exceptions exist
		if (pExceptionInfo->dwExceptionHead != pExceptionInfo->dwExceptionTail) 
		{
			// jump to the head
			pExceptionArea += dwExceptionNumber;

			// check for block not in use
			if (pExceptionArea->bInUse)
			{
				// copy to return value
				memcpy(pException, pExceptionArea, sizeof(EXCEPTION_DESC));

				// if this block is also the head, update the head
				if (dwExceptionNumber == pExceptionInfo->dwExceptionHead)
				{
					pExceptionInfo->dwExceptionHead = (pExceptionInfo->dwExceptionHead + 1) % 
						(m_pExceptionArea->GetCurrentSize() / sizeof(EXCEPTION_DESC));
				}
				else if (dwExceptionNumber == pExceptionInfo->dwExceptionTail)
				{
					if (pExceptionInfo->dwExceptionTail == 0)
					{
						pExceptionInfo->dwExceptionTail = (m_pExceptionArea->GetCurrentSize() / sizeof(EXCEPTION_DESC));
					}
					else
					{
						pExceptionInfo->dwExceptionTail--;
					}
				}

				pExceptionArea->bInUse = BLOCK_FREE;
			}
			else
			{
				dwStatus = ERROR_INVALID_BLOCK;
			}
		}
		else
		{
			dwStatus = ERROR_NO_MORE_ITEMS;
		}

	}
	__except(MemoryExcFilter(GetExceptionInformation(),EXCEPTION_AREA))
	{
		dwStatus = GetExceptionCode();

		switch (dwStatus)
		{
		case EXCEPTION_GMMF_DISKFULL:		dwStatus = MEM_DISKFULL;	break;
		case EXCEPTION_GMMF_CORRUPTEDRGN:	dwStatus = MEM_CORRUPT;		break;
		case EXCEPTION_GMMF_WRITEPAST:		dwStatus = MEM_WRITEPAST;	break;
		default:							dwStatus = MEM_UNKNOWN;		break;
		}

		LETGO(m_hExceptionLock);
		return(dwStatus);
	}

	LETGO(m_hExceptionLock);

	return(dwStatus);
}


//----(Member Function)-------------------------------------------------------
//
// @mfunc This function returns the number of elements in the Exception queue
//
// @parm  None
//
// @rvalue ERROR_SUCCESS | If successful
//
EXPORT32 DWORD CCommonMemory::GetExceptionCount(OUT DWORD *dwCurrentSize)
{
	DWORD dwStatus = ERROR_SUCCESS;
	
	// get a pointer to the Exception area
	// first part of Exception area is the information part containing
	// the head and tail, and statistics
	EXCEPTION_INFO *pExceptionInfo;// = (EXCEPTION_INFO *)m_pExceptionArea->GetAddress();
	EXCEPTION_DESC *pExceptionArea;// = (EXCEPTION_DESC *)(pExceptionInfo + 1);

	// Check for a NULL pointer
	if (NULL == dwCurrentSize)
		return(ERROR_INVALID_PARAMETER);

	WAITFOR(m_hExceptionLock);

	pExceptionInfo = (EXCEPTION_INFO *)m_pExceptionArea->GetAddress();
	pExceptionArea = (EXCEPTION_DESC *)(pExceptionInfo + 1);

⌨️ 快捷键说明

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