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

📄 xfilemap.cpp

📁 最短路径的并行算法 采用TBB 需要intel编译器 速度很快
💻 CPP
字号:
/*/////////////////////////////////////////
// 版权所有(C)  2000-2008 邓辉           //
// Email:      denghui0815@hotmail.com  //
// 说明:       Intel线程优化大赛参赛作品//
/////////////////////////////////////////*/

#ifdef XCODE_WIN
	#include <windows.h>
#endif

#ifdef XCODE_LINUX
	#include <sys/mman.h>  /* for mmap and munmap */
	#include <fcntl.h>     /* for open */
	#include <unistd.h>    /* for lseek and write */
#endif

#include <string.h>
#include "XFileMap.h"

// 打开文件映射
XFILEMAPHANDLE XFileMapOpen(const char* szFile, int nMode, unsigned int& nFileSize)
{
	XFILEMAPHANDLE hFileMap = XFILEMAPINVALID;
	
	if(szFile != NULL && strlen(szFile) > 0)
	{
#ifdef XCODE_WIN
		HANDLE hFile = NULL;

		if(nMode == XFILEMAP_READONLY)
		{
			// 使用内存映射打开文件
			hFile = CreateFile(szFile,
				GENERIC_READ,
				0, 
				NULL,
				OPEN_EXISTING, 
				FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 
				NULL);

			if(hFile != NULL)
			{
				hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY, 0, 0 , NULL);

				// 获取文件大小
				DWORD  nFileSizeH;

				nFileSize = GetFileSize(hFile, &nFileSizeH);
			}
		}
		else if(nMode == XFILEMAP_WRITE)
		{
			// 使用内存映射打开文件
			hFile = CreateFile(szFile,
				GENERIC_WRITE | GENERIC_READ,
				0, 
				NULL,
				CREATE_ALWAYS, 
				FILE_FLAG_RANDOM_ACCESS | FILE_FLAG_SEQUENTIAL_SCAN, 
				NULL);

			if(hFile != NULL)
			{
				hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, nFileSize, NULL);
			}
		}

		if(hFile != NULL) CloseHandle(hFile);
#endif

#ifdef XCODE_LINUX
		if(nMode == XFILEMAP_READONLY)
		{
			struct stat buf ={0};

			if(stat(szFile, &buf) == 0) 
			{
				nFileSize = buf.st_size;

				hFileMap = open(szFile, O_RDONLY, S_IRUSR | S_IWUSR);
			}
		}
		else if(nMode == XFILEMAP_WRITE)
		{
			hFileMap = open(szFile, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);

			if(hFileMap != XFILEMAPINVALID)
			{
				lseek(hFileMap, nFileSize - 1, SEEK_SET);
				write(hFileMap, "\0", 1);
				lseek(hFileMap, 0, SEEK_SET);
			}
		}
#endif
	}

	return hFileMap;
}

// 关闭文件映射
void XFileMapClose(XFILEMAPHANDLE* pFileMap)
{
	if(pFileMap != NULL && *pFileMap != XFILEMAPINVALID)
	{
#ifdef XCODE_WIN
		CloseHandle(*pFileMap);
#endif

#ifdef XCODE_LINUX
		close(*pFileMap);
#endif

		*pFileMap = XFILEMAPINVALID;
	}
}

// 文件映射
void* XFileMapView(XFILEMAPHANDLE hFileMap, int nMode, unsigned int nMapOff,  unsigned int nMapSize)
{		
	void* pMemory = XMAPMEMINVALID;
#ifdef XCODE_WIN
	if(nMode == XFILEMAP_READONLY)
	{
		pMemory = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, nMapOff, nMapSize);
	}
	else if(nMode == XFILEMAP_WRITE)
	{
		pMemory = MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, nMapOff, nMapSize);
	}
#endif

#ifdef XCODE_LINUX
	if(nMode == XFILEMAP_READONLY)
	{
		pMemory = mmap(NULL, nMapSize, PROT_READ, MAP_PRIVATE, hFileMap, nMapOff);
	}
	else if(nMode == XFILEMAP_WRITE)
	{
		pMemory = mmap(NULL, nMapSize, PROT_WRITE, MAP_SHARED, hFileMap, nMapOff);
	}
#endif

	return pMemory;
}

// 解除映射
void XFileMapUnView(void* pMemory,  unsigned int nMapSize)
{
#ifdef XCODE_WIN
	UnmapViewOfFile(pMemory);
#endif

#ifdef XCODE_LINUX
	munmap(pMemory, nMapSize);
#endif
}

⌨️ 快捷键说明

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