|
|
@@ -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);
|
|
|
}
|
|
|
|