Quellcode durchsuchen

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

80274480 vor 1 Jahr
Ursprung
Commit
63c9789206
1 geänderte Dateien mit 82 neuen und 102 gelöschten Zeilen
  1. 82 102
      Other/libsharememory/libsharememory.cpp

+ 82 - 102
Other/libsharememory/libsharememory.cpp

@@ -12,11 +12,11 @@
 #include <fcntl.h>
 #include <semaphore.h>
 #include <time.h>
+#include <sys/stat.h>
 #endif
 
 #include "libsharememory.h"
 
-
 class libsharememory_impl
 {
 protected:
@@ -37,18 +37,20 @@ protected:
 public:
 	libsharememory_impl()
 	{
-		m_pData=NULL;
-		m_bLocked = false;
+
 #ifdef _WIN32
-		m_hFileMap = NULL;
 		m_hMutex = NULL;
+		m_hFileMap = NULL;
+		
 #else
 		m_shid = -1;
-		m_semt = NULL;
+		m_semt = SEM_FAILED;
 		memset(m_strsemname, 0, MAX_PATH);
 		memset(m_strshmname, 0, MAX_PATH);
 #endif // _WIN32
 		m_dwBytes=0;
+		m_pData=NULL;
+		m_bLocked = false;
 	}
 
 	~libsharememory_impl()
@@ -61,7 +63,7 @@ public:
 	{
 		bool bRet = false;
 #ifdef _WIN32
-		char szBuf[MAX_PATH];
+		char szBuf[MAX_PATH] = {0};
 		const char* szFile;
 		if (szName != NULL && dwBytes > 0)
 		{
@@ -77,8 +79,7 @@ public:
 					if (m_pData != NULL)
 					{
 						*((LPDWORD)m_pData) = dwBytes;
-						//*((int*)((LPDWORD)m_pData+1))= ++m_nEntityNum;
-						sprintf_s(szBuf, "Mutex<%s>", szName);
+						_snprintf(szBuf, MAX_PATH, "Mutex<%s>", szName);
 						m_hMutex = CreateMutex(NULL, false, szBuf);
 						if (m_hMutex != NULL)
 						{
@@ -97,47 +98,41 @@ public:
 		}
 #else
 		if (szName != NULL && dwBytes > 0) {
-			char szBuf[MAX_PATH] = {0};
-			const char* szFile = tmpnam(szBuf);
-			if (szFile != NULL) {
-				snprintf(m_strshmname, MAX_PATH, "%s", szName);
-				snprintf(m_strsemname, MAX_PATH, "/mutex.%s", szName);
-				m_shid = shm_open(szName, O_CREAT | O_RDWR | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
-				if (m_shid >= 0) {
-					//Debug("%s:%d shm_open O_CREAT|O_RDWR|O_EXCL success and share memory %s and size is %d", __FUNCTION__, __LINE__, szName, dwBytes);
-				}
-				else {
-					//Debug("%s:%d shm_open O_CREAT|O_RDWR|O_EXCL %s failed for %s, and errno is %d", __FUNCTION__, __LINE__, m_strshmname, strerror(errno), errno);
-					if (EEXIST == errno) {
-						m_shid = shm_open(szName, O_RDWR, 0);
-					}
-				}
-	
-				if (m_shid >= 0){
-					if (NULL == m_pData){
-						ftruncate(m_shid, dwBytes);
-						m_pData = mmap(NULL, dwBytes, PROT_READ | PROT_WRITE, MAP_SHARED, m_shid, 0);
-						if (MAP_FAILED != m_pData) {
-							*((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) {
-								if (EEXIST == errno) {
-									semt = sem_open(m_strsemname, 0);
-									sem_init(semt,32, 1);
-								}
-							}
-
-
-							if (NULL != semt) {
-								m_semt = semt;
-								int ivalue = -1;
-								sem_getvalue(m_semt, &ivalue);
-								bRet = true;
-							}
-						}
-					}
-				}
+            snprintf(m_strshmname, MAX_PATH, "%s", szName);
+            snprintf(m_strsemname, MAX_PATH, "/mutex.%s", szName);
+			mode_t fm = umask(0);
+            m_shid = shm_open(m_strshmname, O_CREAT | O_TRUNC | O_RDWR, 0777);
+			umask(fm);	
+            if (m_shid >= 0) {
+                //aos_debug_log((LB, "shm_open O_CREAT | O_TRUNC | O_RDWR, 0777) success and share memory %s and size is %d", m_strshmname, dwBytes));
+            } else {
+                //aos_error_log((LB, "shm_open O_CREAT | O_TRUNC | O_RDWR, 0777) %s failed for %s, and errno is %d", m_strshmname, strerror(errno), errno));
+                if (EEXIST == errno) {
+                    //m_shid = shm_open(m_strshmname, O_RDWR, 0);
+                }
+            }
+            if (m_shid != -1) {
+                ftruncate(m_shid, dwBytes);
+                m_pData = mmap(NULL, dwBytes, PROT_READ | PROT_WRITE, MAP_SHARED, m_shid, 0);
+                if (MAP_FAILED != m_pData) {
+                    *((unsigned int*)m_pData) = dwBytes;
+                    m_dwBytes = dwBytes;
+					m_semt = sem_open(m_strsemname, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, 1);
+                    if (SEM_FAILED == m_semt && EEXIST == errno) {
+						m_semt = sem_open(m_strsemname, 0);
+                        sem_init(m_semt, 32, 1);
+                        int ivalue = -1;
+                        sem_getvalue(m_semt, &ivalue);
+						bRet = true;
+					} else if (SEM_FAILED != m_semt) {
+                        int ivalue = -1;
+                        sem_getvalue(m_semt, &ivalue);
+						bRet = true;
+					} 
+                } 
+            }
+			if (!bRet) {
+				CloseShareMem();
 			}
 		}
 #endif // _WIN32
@@ -181,25 +176,27 @@ public:
 		}
 #else
 		if (szName != NULL) {
-			int shid = shm_open(szName, O_RDWR, 0);
-			if (-1 != shid) {
-				m_shid = shid;
-				sem_t* semt = sem_open(m_strsemname, 0);
-				if (SEM_FAILED != semt){
-					m_semt = semt;
+			snprintf(m_strshmname, MAX_PATH, "%s", szName);
+			snprintf(m_strsemname, MAX_PATH, "/mutex.%s", szName);
+			mode_t fm = umask(0);
+			m_shid = shm_open(m_strshmname, O_RDWR, 0777);
+			umask(fm);
+			if (m_shid != -1) {
+				m_semt = sem_open(m_strsemname, 0);
+				if (SEM_FAILED != m_semt) {
 					int ivalue = -1;
-					sem_getvalue(semt, &ivalue);
-					m_pData = mmap(NULL, m_dwBytes, PROT_READ | PROT_WRITE, MAP_SHARED, shid, 0);
+					sem_getvalue(m_semt, &ivalue);
+					lseek(m_shid, 0, SEEK_SET);
+					m_pData = mmap(NULL, m_dwBytes, PROT_READ | PROT_WRITE, MAP_SHARED, m_shid, 0);
 					if (MAP_FAILED != m_pData) {
-						if (LockShareMem()){
+						if (LockShareMem()) {
 							m_dwBytes = *((unsigned int*)m_pData);
 							UnlockShareMem();
-							if (m_dwBytes > 0)
-							{
+							if (m_dwBytes > 0) {
 								T = true;
 							}
 						}
-					}
+					} 
 				}
 			}
 			
@@ -214,42 +211,38 @@ public:
 	//释放共享内存区
 	void CloseShareMem()
 	{
-#ifdef _WIN32
-		if (m_bLocked)
-		{
+		if (m_bLocked){
 			UnlockShareMem();
 		}
-		if (m_pData != NULL)
-		{
+#ifdef _WIN32
+		if (m_pData != NULL){
 			UnmapViewOfFile(m_pData);
 			m_pData = NULL;
 		}
-		if (m_hFileMap != NULL)
-		{
+		if (m_hFileMap != NULL){
 			CloseHandle(m_hFileMap);
 			m_hFileMap = NULL;
 		}
 
-		if (m_hMutex != NULL)
-		{
+		if (m_hMutex != NULL){
 			CloseHandle(m_hMutex);
 			m_hMutex = NULL;
 		}
-		m_dwBytes = 0;
 #else
-		if (m_bLocked){
-			UnlockShareMem();
-		}
-		if (NULL != m_semt){
+		if (SEM_FAILED != m_semt){
 			sem_unlink(m_strsemname);
+			m_semt = SEM_FAILED;
 		}
 
 		if (m_pData != NULL){
 			munmap(m_pData, m_dwBytes);
 		}
-		shm_unlink(m_strshmname);
+		if (m_shid >= 0) {
+            shm_unlink(m_strshmname);
+			m_shid = -1;
+		}
+#endif //_MSC_VER
 		m_dwBytes = 0;
-#endif // _WIN32
 	}
 
 	//获取共享内存区大小
@@ -272,22 +265,17 @@ public:
 	void* LockShareMem(unsigned int dwWaitTimeout=INFINITE)
 	{
 		void* pData=NULL;
-#ifdef _WIN32
+
 		if (IsShareMemValid() && m_pData != NULL && !m_bLocked)
 		{
-			if (WaitForSingleObject(m_hMutex, dwWaitTimeout) != WAIT_TIMEOUT)
-			{
+#ifdef _WIN32
+			if (WaitForSingleObject(m_hMutex, dwWaitTimeout) != WAIT_TIMEOUT){
 				m_bLocked = true;
 			}
-			if (m_bLocked)
-			{
+			if (m_bLocked){
 				pData = (void*)((LPDWORD)m_pData + 1);
 			}
-		}
 #else
-		//Debug("IsShareMemValid flag is %d, m_pData = 0x%08x, m_bLocked flag is %s.", IsShareMemValid(), m_pData, m_bLocked ? "true" : "false");
-		if (IsShareMemValid() && m_pData != NULL && !m_bLocked)
-		{
 			struct timespec ts;
 			clock_gettime(CLOCK_REALTIME, &ts);
 			long unsec = ts.tv_nsec + (1000*1000*dwWaitTimeout);
@@ -296,18 +284,16 @@ public:
 
 			int ivalue = -1;
 			sem_getvalue(m_semt, &ivalue);
-			if (0 == sem_timedwait(m_semt,&ts))
-			{
+			if (0 == sem_timedwait(m_semt,&ts))	{
 				sem_getvalue(m_semt, &ivalue);
 				m_bLocked = true;
 			}
-
-			if (m_bLocked)
-			{
+#endif // _WIN32
+			if (m_bLocked){
 				pData = (void*)((unsigned int*)m_pData + 1);
 			}
 		}
-#endif // _WIN32
+
 		return pData;
 	}
 	//内存区是否互斥锁定
@@ -318,19 +304,15 @@ public:
 	//解锁内存区
 	void UnlockShareMem()
 	{
-#ifdef _WIN32
 		if (m_bLocked)
 		{
+#ifdef _WIN32
 			ReleaseMutex(m_hMutex);
-			m_bLocked = false;
-		}
 #else
-		if (m_bLocked)
-		{
 			sem_post(m_semt);
+#endif // _WIN32
 			m_bLocked = false;
 		}
-#endif // _WIN32
 	}
 };
 
@@ -386,13 +368,11 @@ void Clibsharememory::Close()
 
 bool Clibsharememory::Open(const char* szName)
 {
-	bool bRst = m_pImpl->OpenShareMem(szName);
-	return bRst;
+	return m_pImpl->OpenShareMem(szName);
 }
 
 bool Clibsharememory::Create(const char* szName, unsigned int dwBytes)
 {
-	bool bRst = m_pImpl->CreateShareMem(szName,dwBytes);
-	return bRst;
+	return m_pImpl->CreateShareMem(szName,dwBytes);
 }