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

📄 memory.cpp

📁 具有工业强度的内存池动态库
💻 CPP
📖 第 1 页 / 共 5 页
字号:
										   OUT LPVOID pData, 
										   IN OPTIONAL WORD wOffset, 
										   IN OPTIONAL BOOL bIgnoreBytesInUse)
{
	// get a pointer to the list of blocks
	DATA_AREA_LINK  *pBlockLink;// = (DATA_AREA_LINK *)m_pBlockList->GetAddress();

	char *pDataArea;// = (char *)m_pDataArea->GetAddress();

	DWORD dwStatus = ERROR_SUCCESS;
	
	// Check for a NULL pointer
	if (NULL == pData)
		return(ERROR_INVALID_PARAMETER);

	
	WAITFOR(m_hDataLock);

	pBlockLink = (DATA_AREA_LINK *)m_pBlockList->GetAddress();
	pDataArea = (char *)m_pDataArea->GetAddress();
	__try
	{
		// jump to the requested block
		pBlockLink += wBlockNumber;

		if ((pBlockLink->bInUse == BLOCK_FREE) || 
			(pBlockLink->wBlockSize < wNumBytes) || 
			(pBlockLink->wBlockSize < wNumBytes + wOffset))
		{
			dwStatus = ERROR_INVALID_BLOCK;
		}
		else if (((pBlockLink->wBytesInUse < wNumBytes) || 
	 			 (pBlockLink->wBytesInUse < wNumBytes + wOffset)) && 
				 (FALSE == bIgnoreBytesInUse))
		{
			dwStatus = ERROR_NOT_ENOUGH_MEMORY;
		}
		else
		{
			// Copy the data
			__try
			{
				pDataArea += (pBlockLink->dwBlockOffset + wOffset);
				memcpy(pData, pDataArea, wNumBytes);
			}
			__except(MemoryExcFilter(GetExceptionInformation(),DATA_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_hDataLock);
				return(dwStatus);
			}
		}
	}
	__except(MemoryExcFilter(GetExceptionInformation(),BLOCK_LIST))
	{
		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_hDataLock);
		return(dwStatus);
	}

	LETGO(m_hDataLock);

	return(dwStatus);
}



//----(Member Function)-------------------------------------------------------
//
// @mfunc This function Sets a block of real time data
//
// @parm  IN WORD | wBlockNumber | Number of block to access
//
// @parm  IN WORD | wNumBytes | Number of bytes to Set
//
// @parm  OUT LPVOID | pData | Buffer holding data
//
// @rvalue ERROR_SUCCESS | If successful
//
// @rvalue ERROR_INVALID_BLOCK | If block not in use
//
// @rvalue ERROR_INVALID_BLOCK_LENGTH | if wNumBytes is greater than block size
//
EXPORT32 DWORD CCommonMemory::SetDataBlock(IN WORD wBlockNumber, 
										   IN WORD wNumBytes, 
										   IN LPVOID pData, 
										   IN OPTIONAL WORD wOffset)
{
	// get a pointer to the list of blocks
	DATA_AREA_LINK  *pBlockLink;// = (DATA_AREA_LINK *)m_pBlockList->GetAddress();

	char *pDataArea;// = (char *)m_pDataArea->GetAddress();
	
	DWORD dwStatus = ERROR_SUCCESS;
	
	// Check for a NULL pointer
	if (NULL == pData)
		return(ERROR_INVALID_PARAMETER);
	
	WAITFOR(m_hDataLock);

	pBlockLink = (DATA_AREA_LINK *)m_pBlockList->GetAddress();

	pDataArea = (char *)m_pDataArea->GetAddress();


	__try
	{
		// jump to the requested block
		pBlockLink += wBlockNumber;

		if ((pBlockLink->bInUse == BLOCK_FREE) || 
			(pBlockLink->wBlockSize < wNumBytes) ||
			(pBlockLink->wBlockSize < wNumBytes + wOffset))
		{
			dwStatus = ERROR_INVALID_BLOCK;
		}
		else
		{
			__try
			{
				pDataArea += (pBlockLink->dwBlockOffset + wOffset);
				memcpy(pDataArea, pData, wNumBytes);
				dwStatus = ERROR_SUCCESS;
			}
			__except(MemoryExcFilter(GetExceptionInformation(),DATA_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_hDataLock);
				return(dwStatus);
			}
		}
	}
	__except(MemoryExcFilter(GetExceptionInformation(),BLOCK_LIST))
	{
		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_hDataLock);
		return(dwStatus);
	}

	
	LETGO(m_hDataLock);

	return(dwStatus);
}

//----(Member Function)-------------------------------------------------------
//
// @mfunc This function returns the number of Data Blocks
//
// @parm  None
//
// @rvalue Number of Data Blocks
//
EXPORT32 DWORD CCommonMemory::GetDataBlockCount(void)
{
	return(m_pBlockList->GetElements());
}

//----(Member Function)-------------------------------------------------------
//
// @mfunc This function returns the current size of the data block, and Link area
//
// @parm None
//
// @rvalue Size of Data block area
//
EXPORT32 void CCommonMemory::GetDataBlockSize(OUT OPTIONAL DWORD *dwDataSize, 
											  OUT OPTIONAL DWORD *dwListSize)
{
	if (dwListSize != NULL)
		*dwListSize = m_pBlockList->GetCurrentSize();

	if (dwDataSize != NULL)
		*dwDataSize = m_pDataArea->GetCurrentSize();
}



//----(Member Function)-------------------------------------------------------
//
// @mfunc This function returns the current status of the data block
//
// @parm IN WORD | wBlockNumber| Block number to return information for
// @parm OUT WORD * | pStatus | Status of the data  
// @parm OUT OPTIONAL DWORD * | pDataBlockHandle | Handle of owning DataBlock
//
// @rvalue ERROR_SUCCESS | If successful
//
// @rvalue ERROR_INVALID_BLOCK | If block not in use
//
EXPORT32 DWORD CCommonMemory::GetDataBlockStatus(IN WORD wBlockNumber, OUT WORD *pStatus,
												 OUT OPTIONAL DWORD *pDataBlockHandle /* = NULL */)
{
	// get a pointer to the list of blocks
	DATA_AREA_LINK  *pBlockLink;// = (DATA_AREA_LINK *)m_pBlockList->GetAddress();

	DWORD dwStatus = ERROR_SUCCESS;
	
	WAITFOR(m_hDataLock);
	pBlockLink = (DATA_AREA_LINK *)m_pBlockList->GetAddress();

	__try
	{
		// jump to the requested block
		pBlockLink += wBlockNumber;

		if (pBlockLink->bInUse == BLOCK_FREE)
		{
			dwStatus = ERROR_INVALID_BLOCK;
		}
		else
		{
			// Get the data
			__try
			{
				*pStatus = pBlockLink->wDataStatus;

				// if requested, also return the datablock handle
				if (NULL != pDataBlockHandle)
					*pDataBlockHandle = pBlockLink->dwDataBlockHandle;
			}
			__except(MemoryExcFilter(GetExceptionInformation(),DATA_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_hDataLock);
				return(dwStatus);
			}
		}
	}
	__except(MemoryExcFilter(GetExceptionInformation(),BLOCK_LIST))
	{
		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_hDataLock);
		return(dwStatus);
	}
	LETGO(m_hDataLock);
	return(dwStatus);
}


//----(Member Function)-------------------------------------------------------
//
// @mfunc This function sets the current status of the data block
//
// @parm IN WORD | wBlockNumber| Block number to return information for
// @parm IN WORD | wStatus | New Status of the data
//
// @rvalue ERROR_SUCCESS | If successful
//
// @rvalue ERROR_INVALID_BLOCK | If block not in use
//
EXPORT32 DWORD CCommonMemory::SetDataBlockStatus(IN WORD wBlockNumber, IN WORD wStatus)
{
	// get a pointer to the list of blocks
	DATA_AREA_LINK  *pBlockLink;// = (DATA_AREA_LINK *)m_pBlockList->GetAddress();

	DWORD dwStatus = ERROR_SUCCESS;
	
	WAITFOR(m_hDataLock);

	pBlockLink = (DATA_AREA_LINK *)m_pBlockList->GetAddress();


	__try
	{
		// jump to the requested block
		pBlockLink += wBlockNumber;

		if (pBlockLink->bInUse == BLOCK_FREE)
		{
			dwStatus = ERROR_INVALID_BLOCK;
		}
		else
		{
			// Set the data
			__try
			{
				pBlockLink->wDataStatus = wStatus;
			}
			__except(MemoryExcFilter(GetExceptionInformation(),DATA_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_hDataLock);
				return(dwStatus);
			}
		}
	}
	__except(MemoryExcFilter(GetExceptionInformation(),BLOCK_LIST))
	{
		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_hDataLock);
		return(dwStatus);
	}
	LETGO(m_hDataLock);
	return(dwStatus);
}


//----(Member Function)-------------------------------------------------------
//
// @mfunc This function returns the NIO Access state of the data block
//
// @parm IN WORD | wBlockNumber| Block number to return information for
// @parm OUT WORD * | pState | NIO Access state
// @parm IN BOOL | bReset | Set to zero after reading if set to TRUE
//
// @rvalue ERROR_SUCCESS | If successful
// @rvalue ERROR_INVALID_BLOCK | If block not in use
//
EXPORT32 DWORD CCommonMemory::GetNIOAccess(IN WORD wBlockNumber, OUT BOOL *pState, IN BOOL bReset)
{
	// get a pointer to the list of blocks
	DATA_AREA_LINK  *pBlockLink;// = (DATA_AREA_LINK *)m_pBlockList->GetAddress();

	DWORD dwStatus = ERROR_SUCCESS;
	
	WAITFOR(m_hDataLock);

	pBlockLink = (DATA_AREA_LINK *)m_pBlockList->GetAddress();

	__try
	{
		// jump to the requested block
		pBlockLink += wBlockNumber;

		if (pBlockLink->bInUse == BLOCK_FREE)
		{
			dwStatus = ERROR_INVALID_BLOCK;
		}
		else
		{
			// Get the data
			__try
			{
				*pState = pBlockLink->bNIOAccess;

				if (TRUE == bReset)
					pBlockLink->bNIOAccess = FALSE;
			}
			__except(MemoryExcFilter(GetExceptionInformation(),DATA_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_hDataLock);
				return(dwStatus);
			}
		}
	}
	__except(MemoryExcFilter(GetExceptionInformation(),BLOCK_LIST))
	{
		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_hDataLock);
		return(dwStatus);
	}
	LETGO(m_hDataLock);
	return(dwStatus);
}


//----(Member Function)-------------------------------------------------------
//

⌨️ 快捷键说明

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