Browse Source

Z991239-5647 #comment 优化共享内存库跨平台实现方式

80274480 1 year ago
parent
commit
301753a1f0

+ 1 - 0
Other/CMakeLists.txt

@@ -41,6 +41,7 @@ add_subdirectory(libvideoqueue)
 add_subdirectory(libaudions)
 add_subdirectory(libvideorender)
 add_subdirectory(libvideorecord)
+add_subdirectory(libsharememory)
 
 if(MSVC)
    add_subdirectory(win)

+ 1 - 1
Other/libaudioqueue/CMakeLists.txt

@@ -22,7 +22,7 @@ endif(MSVC)
 
 target_include_directories(${MODULE_NAME} PRIVATE
 	${RVC_COMMON_INCLUDE_DIR}
-	${OTHER_LIB_PLATFORM_BASE_DIR}/libsharememory
+	${OTHER_LIB_BASE_DIR}/libsharememory
 	)
 
 target_link_libraries(${MODULE_NAME} PRIVATE ${${MODULE_PREFIX}_LIBS}	

+ 0 - 0
Other/win/libsharememory/CMakeLists.txt → Other/libsharememory/CMakeLists.txt


+ 0 - 0
Other/unix/libsharememory/dllmain.cpp → Other/libsharememory/dllmain.cpp


+ 64 - 86
Other/unix/libsharememory/libsharememory.cpp → Other/libsharememory/libsharememory.cpp

@@ -1,28 +1,20 @@
 // libsharememory.cpp : 定义 DLL 应用程序的导出函数。
 //
 
+#ifdef _WIN32
 #include "stdafx.h"
-#include "libsharememory.h"
-#include <stdio.h>
-//#include "SpBase.h"
-
-
-//#define TESTSHAREMEM 0
+#include <windows.h>
+#else
+#include<string.h>
+#include<errno.h>
+#include <sys/mman.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <semaphore.h>
+#include <time.h>
+#endif
 
-void Debug(const char* fmt, ...)
-{
-//	char strfmt[512] = { 0 };
-//	va_list args;
-//	va_start(args, fmt);
-//	vsprintf(strfmt, fmt, args);
-//#ifdef TESTSHAREMEM
-//	printf("%s\n", strfmt);
-//#else
-//	Dbg("%s", strfmt);
-//#endif
-//	va_end(args);
-//	fflush(stdout);
-}
+#include "libsharememory.h"
 
 
 class libsharememory_impl
@@ -32,24 +24,22 @@ protected:
 
 	bool m_bLocked;
 	void* m_pData;
-	//HANDLE m_hFile;
-#ifdef RVC_OS_WIN
+#ifdef _WIN32
 	HANDLE m_hFileMap;
 	HANDLE m_hMutex;
 #else
-	//void* m_hFileMap;
 	int m_shid;
 	sem_t* m_semt;
 	char m_strsemname[MAX_PATH];
 	char m_strshmname[MAX_PATH];
-#endif // RVC_OS_WIN
+#endif // _WIN32
 
 public:
 	libsharememory_impl()
 	{
 		m_pData=NULL;
 		m_bLocked = false;
-#ifdef RVC_OS_WIN
+#ifdef _WIN32
 		m_hFileMap = NULL;
 		m_hMutex = NULL;
 #else
@@ -57,7 +47,7 @@ public:
 		m_semt = NULL;
 		memset(m_strsemname, 0, MAX_PATH);
 		memset(m_strshmname, 0, MAX_PATH);
-#endif // RVC_OS_WIN
+#endif // _WIN32
 		m_dwBytes=0;
 	}
 
@@ -66,13 +56,46 @@ public:
 		CloseShareMem();
 	}
 
-
-#ifdef RVC_OS_WIN
-#else
-	bool CreateShareMemLinux(const char* szName, unsigned int dwBytes)
+	//创建共享内存区
+	bool CreateShareMem(const char* szName, unsigned int dwBytes)
 	{
 		bool bRet = false;
-
+#ifdef _WIN32
+		char szBuf[MAX_PATH];
+		const char* szFile;
+		if (szName != NULL && dwBytes > 0)
+		{
+			CloseShareMem();
+			szFile = tmpnam(szBuf);
+			if (szFile != NULL)
+			{
+				m_hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, dwBytes + sizeof(unsigned int) + sizeof(int), szName);
+				if (m_hFileMap != NULL)
+				{
+					m_dwBytes = dwBytes;
+					m_pData = MapViewOfFile(m_hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
+					if (m_pData != NULL)
+					{
+						*((LPDWORD)m_pData) = dwBytes;
+						//*((int*)((LPDWORD)m_pData+1))= ++m_nEntityNum;
+						sprintf_s(szBuf, "Mutex<%s>", szName);
+						m_hMutex = CreateMutex(NULL, false, szBuf);
+						if (m_hMutex != NULL)
+						{
+							if (GetLastError() != ERROR_ALREADY_EXISTS)
+							{
+								bRet = true;
+							}
+						}
+					}
+				}
+				if (!bRet)
+				{
+					CloseShareMem();
+				}
+			}
+		}
+#else
 		if (szName != NULL && dwBytes > 0) {
 			char szBuf[MAX_PATH] = {0};
 			const char* szFile = tmpnam(szBuf);
@@ -95,7 +118,7 @@ public:
 						ftruncate(m_shid, dwBytes);
 						m_pData = mmap(NULL, dwBytes, PROT_READ | PROT_WRITE, MAP_SHARED, m_shid, 0);
 						if (MAP_FAILED != m_pData) {
-							*((LPDWORD)m_pData) = dwBytes;
+							*((unsigned int*)m_pData) = dwBytes;
 							m_dwBytes = dwBytes;
 							sem_t* semt = sem_open(m_strsemname, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, 1);
 							if (NULL == semt) {
@@ -117,60 +140,15 @@ public:
 				}
 			}
 		}
+#endif // _WIN32
 		return bRet;
 	}
-#endif
-
-	//创建共享内存区
-	bool CreateShareMem(const char* szName, unsigned int dwBytes)
-	{
-		bool T =false;
-#ifdef RVC_OS_WIN
-		char szBuf[MAX_PATH];
-		const char* szFile;
-		if (szName != NULL && dwBytes > 0)
-		{
-			CloseShareMem();
-			szFile = tmpnam(szBuf);
-			if (szFile != NULL)
-			{
-				m_hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, dwBytes + sizeof(unsigned int) + sizeof(int), szName);
-				if (m_hFileMap != NULL)
-				{
-					m_dwBytes = dwBytes;
-					m_pData = MapViewOfFile(m_hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
-					if (m_pData != NULL)
-					{
-						*((LPDWORD)m_pData) = dwBytes;
-						//*((int*)((LPDWORD)m_pData+1))= ++m_nEntityNum;
-						sprintf_s(szBuf, "Mutex<%s>", szName);
-						m_hMutex = CreateMutex(NULL, false, szBuf);
-						if (m_hMutex != NULL)
-						{
-							if (GetLastError() != ERROR_ALREADY_EXISTS)
-							{
-								T = true;
-							}
-						}
-					}
-				}
-				if (!T)
-				{
-					CloseShareMem();
-				}
-			}
-		}
-#else
-		T = CreateShareMemLinux(szName, dwBytes);
-#endif // RVC_OS_WIN
-		return T;
-	}
 
 	//打开已有的共享内存区
 	bool OpenShareMem(const char* szName)
 	{
 		bool T=false;
-#ifdef RVC_OS_WIN
+#ifdef _WIN32
 		char szBuf[MAX_PATH];
 		if (szName != NULL)
 		{
@@ -214,7 +192,7 @@ public:
 					m_pData = mmap(NULL, m_dwBytes, PROT_READ | PROT_WRITE, MAP_SHARED, shid, 0);
 					if (MAP_FAILED != m_pData) {
 						if (LockShareMem()){
-							m_dwBytes = *((LPDWORD)m_pData);
+							m_dwBytes = *((unsigned int*)m_pData);
 							UnlockShareMem();
 							if (m_dwBytes > 0)
 							{
@@ -236,7 +214,7 @@ public:
 	//释放共享内存区
 	void CloseShareMem()
 	{
-#ifdef RVC_OS_WIN
+#ifdef _WIN32
 		if (m_bLocked)
 		{
 			UnlockShareMem();
@@ -283,18 +261,18 @@ public:
 	//是否有可用的内存区
 	bool IsShareMemValid()
 	{
-#ifdef RVC_OS_WIN
+#ifdef _WIN32
 		return (m_hFileMap != NULL && m_hMutex != NULL);
 #else
 		return (m_shid != -1 && m_semt != NULL);
-#endif // RVC_OS_WIN
+#endif // _WIN32
 	}
 
 	//锁定访问内存区
 	void* LockShareMem(unsigned int dwWaitTimeout=INFINITE)
 	{
 		void* pData=NULL;
-#ifdef RVC_OS_WIN
+#ifdef _WIN32
 		if (IsShareMemValid() && m_pData != NULL && !m_bLocked)
 		{
 			if (WaitForSingleObject(m_hMutex, dwWaitTimeout) != WAIT_TIMEOUT)
@@ -326,7 +304,7 @@ public:
 
 			if (m_bLocked)
 			{
-				pData = (void*)((LPDWORD)m_pData + 1);
+				pData = (void*)((unsigned int*)m_pData + 1);
 			}
 		}
 #endif // _WIN32
@@ -340,7 +318,7 @@ public:
 	//解锁内存区
 	void UnlockShareMem()
 	{
-#ifdef RVC_OS_WIN
+#ifdef _WIN32
 		if (m_bLocked)
 		{
 			ReleaseMutex(m_hMutex);

+ 4 - 15
Other/unix/libsharememory/libsharememory.h → Other/libsharememory/libsharememory.h

@@ -6,7 +6,7 @@
 // 符号视为是被导出的。
 #pragma once
 
-#ifdef RVC_OS_WIN
+#ifdef _WIN32
 #ifdef LIBSHAREMEMORY_EXPORTS
 #define LIBSHAREMEMORY_API __declspec(dllexport)
 #else
@@ -14,20 +14,11 @@
 #endif
 # elif ( defined(__GNUC__) &&  __GNUC__ >= 4 )
 #define LIBSHAREMEMORY_API __attribute__((visibility("default")))
-#else // RVC_OS_WIN
+#else // _WIN32
 #define LIBSHAREMEMORY_API
-#endif // RVC_OS_WIN
-
-#ifdef RVC_OS_WIN
-#include <windows.h>
-#else
-#include <sys/mman.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <semaphore.h>
-#include <time.h>
-#endif // RVC_OS_WIN
+#endif // _WIN32
 
+#include <stdio.h>
 
 #ifndef MAX_PATH
 #define MAX_PATH 260
@@ -37,8 +28,6 @@
 #define INFINITE            0xFFFFFFFF  // Infinite timeout
 #endif // !INFINITE
 
-
-
 using namespace std ;
 
 class libsharememory_impl;  //桥接

+ 0 - 1
Other/unix/CMakeLists.txt

@@ -1,6 +1,5 @@
 add_subdirectory(libbizchan)
 
-add_subdirectory(libsharememory)
 add_subdirectory(libaudioframework)
 add_subdirectory(libvideoframework)
 add_subdirectory(libfacecapture)

+ 0 - 19
Other/unix/libsharememory/CMakeLists.txt

@@ -1,19 +0,0 @@
-set(MODULE_NAME "sharememory")
-set(MODULE_PREFIX "LIB_SHAREMEMORY_FUNC")
-
-set(${MODULE_PREFIX}_SRCS
-	libsharememory.h
-	libsharememory.cpp
-)
-
-add_library(${MODULE_NAME} SHARED ${${MODULE_PREFIX}_SRCS})
-
-
-target_include_directories(${MODULE_NAME} PRIVATE
-	${RVC_COMMON_INCLUDE_DIR}
-    ${RVC_WINPR_INCLUDE_DIR}
-	)
-
-target_compile_definitions(${MODULE_NAME} PUBLIC "LIBSHAREMEMORY_EXPORTS")
-
-deploy_others(${MODULE_PREFIX} ${MODULE_NAME})

+ 0 - 1
Other/win/CMakeLists.txt

@@ -1,6 +1,5 @@
 add_subdirectory(libvideohorflip)
 
-add_subdirectory(libsharememory)
 add_subdirectory(libfacecapture)
 add_subdirectory(libvideoframework)
 add_subdirectory(libbizchan)

+ 1 - 1
Other/win/libfacecapture/CMakeLists.txt

@@ -17,7 +17,7 @@ add_library(${MODULE_NAME} SHARED ${${MODULE_PREFIX}_SRCS})
 target_include_directories(${MODULE_NAME} PRIVATE
 	${RVC_COMMON_INCLUDE_DIR}
     ${OTHER_LIB_BASE_DIR}/libvideoqueue
-	${OTHER_LIB_PLATFORM_BASE_DIR}/libsharememory
+	${OTHER_LIB_BASE_DIR}/libsharememory
     ${CUSTOM_OPENCV_INCLUDES_DIR}
     ${CUSTOM_OPENCV_INCLUDES_DIR}/opencv
 

+ 0 - 19
Other/win/libsharememory/dllmain.cpp

@@ -1,19 +0,0 @@
-// dllmain.cpp : 定义 DLL 应用程序的入口点。
-#include "stdafx.h"
-
-BOOL APIENTRY DllMain( HMODULE hModule,
-                       DWORD  ul_reason_for_call,
-                       LPVOID lpReserved
-					 )
-{
-	switch (ul_reason_for_call)
-	{
-	case DLL_PROCESS_ATTACH:
-	case DLL_THREAD_ATTACH:
-	case DLL_THREAD_DETACH:
-	case DLL_PROCESS_DETACH:
-		break;
-	}
-	return TRUE;
-}
-

+ 0 - 259
Other/win/libsharememory/libsharememory.cpp

@@ -1,259 +0,0 @@
-// libsharememory.cpp : 定义 DLL 应用程序的导出函数。
-//
-
-#include "stdafx.h"
-#include "libsharememory.h"
-#include <stdio.h>
-
-class libsharememory_impl
-{
-protected:
-	DWORD m_dwBytes;
-	HANDLE m_hFileMap;
-	BOOL m_bLocked;
-	LPVOID m_pData;
-	//HANDLE m_hFile;
-	HANDLE m_hMutex;
-	//int m_nEntityNum;
-
-public:
-	libsharememory_impl()
-	{
-		//m_hFile=INVALID_HANDLE_VALUE;
-		m_hMutex=NULL;
-		m_pData=NULL;
-		m_hFileMap=NULL;
-		m_dwBytes=0;
-		//m_nEntityNum = 0;
-	}
-
-	~libsharememory_impl()
-	{
-		CloseShareMem();
-	}
-
-	//创建共享内存区
-	BOOL CreateShareMem(LPCTSTR szName, DWORD dwBytes)
-	{
-		BOOL T=FALSE;
-		char szBuf[MAX_PATH];
-		LPCTSTR szFile;
-		if(szName!=NULL&&dwBytes>0)
-		{
-			CloseShareMem();
-			szFile=tmpnam(szBuf);
-			if(szFile!=NULL)
-			{
-				m_hFileMap=CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, dwBytes+sizeof(DWORD)+sizeof(int), szName);
-				if(m_hFileMap!=NULL)
-				{
-					m_dwBytes=dwBytes;
-					m_pData=MapViewOfFile(m_hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
-					if(m_pData!=NULL)
-					{
-						*((LPDWORD)m_pData)=dwBytes;
-						//*((int*)((LPDWORD)m_pData+1))= ++m_nEntityNum;
-						sprintf_s(szBuf, "Mutex<%s>", szName);
-						m_hMutex=CreateMutex(NULL, FALSE, szBuf);
-						if(m_hMutex!=NULL)
-						{
-							if(GetLastError()!=ERROR_ALREADY_EXISTS)
-							{
-								T=TRUE;
-							}
-						}
-					}
-				}
-				if(!T)
-				{
-					CloseShareMem();
-				}
-			}
-		}
-		return T;
-	}
-	//打开已有的共享内存区
-	BOOL OpenShareMem(LPCTSTR szName)
-	{
-		BOOL T=FALSE;
-		char szBuf[MAX_PATH];
-		if(szName!=NULL)
-		{
-			CloseShareMem();
-			m_hFileMap=OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szName);
-			if(m_hFileMap!=NULL)
-			{
-				sprintf_s(szBuf, "Mutex<%s>", szName);
-				m_hMutex=OpenMutex(MUTEX_ALL_ACCESS, FALSE, szBuf);
-				if(m_hMutex!=NULL)
-				{
-					m_pData=MapViewOfFile(m_hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
-					if(LockShareMem())
-					{
-						m_dwBytes=*((LPDWORD)m_pData);
-						//m_nEntityNum = *((int*)((LPDWORD)m_pData+1));
-						//*((int*)((LPDWORD)m_pData+1)) = ++m_nEntityNum;
-						UnlockShareMem();
-						if(m_dwBytes>0)
-						{
-							T=TRUE;
-						}
-					}
-				}
-			}
-			if(!T)
-			{
-				CloseShareMem();
-			}
-		}
-		return T;
-	}
-
-	//释放共享内存区
-	VOID CloseShareMem()
-	{
-		if(m_bLocked)
-		{
-			UnlockShareMem();
-		}
-		if(m_pData!=NULL)
-		{
-			UnmapViewOfFile(m_pData);
-			m_pData=NULL;
-		}
-		if(m_hFileMap!=NULL)
-		{
-			CloseHandle(m_hFileMap);
-			m_hFileMap=NULL;
-		}
-		
-		if(m_hMutex!=NULL)
-		{
-			CloseHandle(m_hMutex);
-			m_hMutex=NULL;
-		}
-		m_dwBytes=0;
-	}
-
-	//获取共享内存区大小
-	DWORD GetShareMemBytes()
-	{
-		return m_dwBytes;
-	}
-
-	//int GetEntityNum()
-	//{
-		//LPVOID pdata = LockShareMem();
-		//m_nEntityNum = *(int*)((LPDWORD)pdata+1);
-		//return m_nEntityNum;
-	//}
-
-	//void DeleteEntityNum()
-	//{
-		//m_nEntityNum--;
-	//}
-	//是否有可用的内存区
-	BOOL IsShareMemValid()
-	{
-		return (m_hFileMap!=NULL&&m_hMutex!=NULL);
-	}
-	//锁定访问内存区
-	LPVOID LockShareMem(DWORD dwWaitTimeout=INFINITE)
-	{
-		LPVOID pData=NULL;
-		if(IsShareMemValid()&&m_pData!=NULL&&!m_bLocked)
-		{
-			if(WaitForSingleObject(m_hMutex, dwWaitTimeout)!=WAIT_TIMEOUT)
-			{
-				m_bLocked=TRUE;
-			}
-			if(m_bLocked)
-			{
-				pData=(LPVOID)((LPDWORD)m_pData+1);
-			}
-		}
-		return pData;
-	}
-	//内存区是否互斥锁定
-	BOOL IsShareMemLocked()
-	{
-		return m_bLocked;
-	}
-	//解锁内存区
-	VOID UnlockShareMem()
-	{
-		if(m_bLocked)
-		{
-			ReleaseMutex(m_hMutex);
-			m_bLocked=FALSE;
-		}
-	}
-};
-
-
-// 这是已导出类的构造函数。
-// 有关类定义的信息,请参阅 libsharememory.h
-Clibsharememory::Clibsharememory()
-{
-	m_pImpl = new libsharememory_impl;
-	return;
-}
-
-Clibsharememory::~Clibsharememory()
-{
-	delete m_pImpl;
-}
-
-VOID Clibsharememory::Unlock()
-{
-	m_pImpl->UnlockShareMem();
-	return;
-}
-
-BOOL Clibsharememory::IsLocked()
-{
-	 BOOL bRst = m_pImpl->IsShareMemLocked();
-	 return bRst;
-}
-
-LPVOID Clibsharememory::Lock(DWORD dwWaitTimeout)
-{
-	 LPVOID lpVoid = m_pImpl->LockShareMem(dwWaitTimeout);
-	 return lpVoid;
-}
-
-BOOL Clibsharememory::IsValid()
-{
-	BOOL bRst = m_pImpl->IsShareMemValid();
-	return bRst;
-}
-
-DWORD Clibsharememory::GetBytes()
-{
-	DWORD TotalBytes =  m_pImpl->GetShareMemBytes();
-	return TotalBytes;
-}
-
-VOID Clibsharememory::Close()
-{
-	m_pImpl->CloseShareMem();
-	return;
-}
-
-BOOL Clibsharememory::Open(LPCTSTR szName)
-{
-	BOOL bRst = m_pImpl->OpenShareMem(szName);
-	return bRst;
-}
-
-BOOL Clibsharememory::Create(LPCTSTR szName, DWORD dwBytes)
-{
-	BOOL bRst = m_pImpl->CreateShareMem(szName,dwBytes);
-	return bRst;
-}
-
-int Clibsharememory::GetEntityNum()
-{
-	//return m_pImpl->GetEntityNum();
-	return 0;
-}

+ 0 - 41
Other/win/libsharememory/libsharememory.h

@@ -1,41 +0,0 @@
-// 下列 ifdef 块是创建使从 DLL 导出更简单的
-// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 LIBSHAREMEMORY_EXPORTS
-// 符号编译的。在使用此 DLL 的
-// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
-// LIBSHAREMEMORY_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
-// 符号视为是被导出的。
-#ifndef LIBSHAREMEMRY
-#define LIBSHAREMEMRY
-
-#ifdef LIBSHAREMEMORY_EXPORTS
-#define LIBSHAREMEMORY_API __declspec(dllexport)
-#else
-#define LIBSHAREMEMORY_API __declspec(dllimport)
-#endif
-
-#include <windows.h>
-using namespace std ;
-
-class libsharememory_impl;  //桥接
-
-// 此类是从 libsharememory.dll 导出的
-class LIBSHAREMEMORY_API Clibsharememory 
-{
-public:
-	Clibsharememory(void);
-	~Clibsharememory();
-	// TODO: 在此添加您的方法。
-	VOID Unlock();
-	BOOL IsLocked();
-	LPVOID Lock(DWORD dwWaitTimeout=INFINITE);
-	BOOL IsValid();
-	DWORD GetBytes();
-	VOID Close();
-	BOOL Open(LPCTSTR szName);
-	BOOL Create(LPCTSTR szName, DWORD dwBytes);
-	int GetEntityNum();
-private:
-	libsharememory_impl*m_pImpl;
-};
-
-#endif