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