From a94ac6300ae219f7a9d4a27c795cbd3cbac8de07 Mon Sep 17 00:00:00 2001 From: erwin coumans Date: Thu, 4 Jun 2015 15:37:18 -0700 Subject: [PATCH] add Windows version of shared memory, very basic implementation (only allows one single allocation) --- examples/ExampleBrowser/CMakeLists.txt | 1 + examples/ExampleBrowser/premake4.lua | 1 + examples/SharedMemory/PhysicsClient.cpp | 5 + examples/SharedMemory/PhysicsServer.cpp | 7 ++ examples/SharedMemory/Win32SharedMemory.cpp | 106 ++++++++++++++++++++ examples/SharedMemory/Win32SharedMemory.h | 45 +++++++++ 6 files changed, 165 insertions(+) create mode 100644 examples/SharedMemory/Win32SharedMemory.cpp create mode 100644 examples/SharedMemory/Win32SharedMemory.h diff --git a/examples/ExampleBrowser/CMakeLists.txt b/examples/ExampleBrowser/CMakeLists.txt index c15736926..e07ccad94 100644 --- a/examples/ExampleBrowser/CMakeLists.txt +++ b/examples/ExampleBrowser/CMakeLists.txt @@ -18,6 +18,7 @@ SET(App_ExampleBrowser_SRCS ../SharedMemory/PhysicsServer.cpp ../SharedMemory/PhysicsClient.cpp ../SharedMemory/PosixSharedMemory.cpp + ../SharedMemory/Win32SharedMemory.cpp ../BasicDemo/BasicExample.cpp ../BasicDemo/BasicExample.h ../ForkLift/ForkLiftDemo.cpp diff --git a/examples/ExampleBrowser/premake4.lua b/examples/ExampleBrowser/premake4.lua index 0896fc727..6e5762524 100644 --- a/examples/ExampleBrowser/premake4.lua +++ b/examples/ExampleBrowser/premake4.lua @@ -53,6 +53,7 @@ "../SharedMemory/PhysicsServer.cpp", "../SharedMemory/PhysicsClient.cpp", "../SharedMemory/PosixSharedMemory.cpp", + "../SharedMemory/Win32SharedMemory.cpp", "../BasicDemo/BasicExample.*", "../Benchmarks/*", "../CommonInterfaces/*", diff --git a/examples/SharedMemory/PhysicsClient.cpp b/examples/SharedMemory/PhysicsClient.cpp index 3b005898d..0f9ecce61 100644 --- a/examples/SharedMemory/PhysicsClient.cpp +++ b/examples/SharedMemory/PhysicsClient.cpp @@ -3,6 +3,7 @@ #include "../CommonInterfaces/CommonMultiBodyBase.h" #include "PosixSharedMemory.h" +#include "Win32SharedMemory.h" #include "SharedMemoryCommon.h" class PhysicsClient : public SharedMemoryCommon @@ -43,7 +44,11 @@ m_counter(0), m_wantsTermination(false) { b3Printf("Started PhysicsClient"); +#ifdef _WIN32 + m_sharedMemory = new Win32SharedMemoryClient(); +#else m_sharedMemory = new PosixSharedMemory(); +#endif } PhysicsClient::~PhysicsClient() diff --git a/examples/SharedMemory/PhysicsServer.cpp b/examples/SharedMemory/PhysicsServer.cpp index a3595e548..9f56f5036 100644 --- a/examples/SharedMemory/PhysicsServer.cpp +++ b/examples/SharedMemory/PhysicsServer.cpp @@ -2,6 +2,8 @@ #include "PhysicsServer.h" #include "PosixSharedMemory.h" +#include "Win32SharedMemory.h" + #include "../Importers/ImportURDFDemo/MyURDFImporter.h" #include "../Importers/ImportURDFDemo/MyMultiBodyCreator.h" #include "../Importers/ImportURDFDemo/URDF2Bullet.h" @@ -48,7 +50,12 @@ m_testBlock1(0), m_wantsShutdown(false) { b3Printf("Started PhysicsServer\n"); + bool useServer = true; + #ifdef _WIN32 + m_sharedMemory = new Win32SharedMemoryServer(); + #else m_sharedMemory = new PosixSharedMemory(); + #endif } void PhysicsServer::releaseSharedMemory() diff --git a/examples/SharedMemory/Win32SharedMemory.cpp b/examples/SharedMemory/Win32SharedMemory.cpp new file mode 100644 index 000000000..5a1a28194 --- /dev/null +++ b/examples/SharedMemory/Win32SharedMemory.cpp @@ -0,0 +1,106 @@ +#ifdef _WIN32 +#include "Win32SharedMemory.h" +#include "Bullet3Common/b3Logging.h" +#include "Bullet3Common/b3Scalar.h" + +#include + +//see also https://msdn.microsoft.com/en-us/library/windows/desktop/aa366551%28v=vs.85%29.aspx + +//TCHAR szName[]=TEXT("Global\\MyFileMappingObject2"); +TCHAR szName[]=TEXT("MyFileMappingObject2"); + +struct Win32SharedMemoryInteralData +{ + HANDLE m_hMapFile; + + void* m_buf; + + Win32SharedMemoryInteralData() + :m_hMapFile(0), + m_buf(0) + { + } +}; + +Win32SharedMemory::Win32SharedMemory() +{ + m_internalData = new Win32SharedMemoryInteralData; +} +Win32SharedMemory::~Win32SharedMemory() +{ + delete m_internalData; +} + +void* Win32SharedMemory::allocateSharedMemory(int key, int size) +{ + b3Assert(m_internalData->m_buf==0); + + + if (this->isServer()) + { + m_internalData->m_hMapFile = CreateFileMapping( + INVALID_HANDLE_VALUE, // use paging file + NULL, // default security + PAGE_READWRITE, // read/write access + 0, // maximum object size (high-order DWORD) + size, // maximum object size (low-order DWORD) + szName); // name of mapping object + } else + { + m_internalData->m_hMapFile = OpenFileMapping( + FILE_MAP_ALL_ACCESS, // read/write access + FALSE, // do not inherit the name + szName); // name of mapping object + + } + + if (m_internalData->m_hMapFile == NULL) + { + b3Error("Could not create file mapping object (%d).\n",GetLastError()); + return 0; + } + + m_internalData->m_buf = MapViewOfFile(m_internalData->m_hMapFile, // handle to map object + FILE_MAP_ALL_ACCESS, // read/write permission + 0, + 0, + size); + + if (m_internalData->m_buf == NULL) + { + b3Error("Could not map view of file (%d).\n",GetLastError()); + CloseHandle(m_internalData->m_hMapFile); + return 0; + } + + return m_internalData->m_buf; +} +void Win32SharedMemory::releaseSharedMemory(int key, int size) +{ + if (m_internalData->m_buf) + { + UnmapViewOfFile(m_internalData->m_buf); + m_internalData->m_buf=0; + } + if (m_internalData->m_hMapFile) + { + CloseHandle(m_internalData->m_hMapFile); + } +} + +Win32SharedMemoryServer::Win32SharedMemoryServer() +{ +} +Win32SharedMemoryServer::~Win32SharedMemoryServer() +{ +} + +Win32SharedMemoryClient::Win32SharedMemoryClient() +{ +} +Win32SharedMemoryClient:: ~Win32SharedMemoryClient() +{ +} + +#endif //_WIN32 diff --git a/examples/SharedMemory/Win32SharedMemory.h b/examples/SharedMemory/Win32SharedMemory.h new file mode 100644 index 000000000..cd71a3761 --- /dev/null +++ b/examples/SharedMemory/Win32SharedMemory.h @@ -0,0 +1,45 @@ +#ifndef WIN32_SHARED_MEMORY_H +#define WIN32_SHARED_MEMORY_H + +#include "SharedMemoryInterface.h" + + + +class Win32SharedMemory : public SharedMemoryInterface +{ + + struct Win32SharedMemoryInteralData* m_internalData; + +public: + Win32SharedMemory(); + virtual ~Win32SharedMemory(); + + virtual void* allocateSharedMemory(int key, int size); + virtual void releaseSharedMemory(int key, int size); + virtual bool isServer() const = 0; +}; + +class Win32SharedMemoryServer : public Win32SharedMemory +{ +public: + Win32SharedMemoryServer(); + virtual ~Win32SharedMemoryServer(); + virtual bool isServer() const + { + return true; + } +}; + +class Win32SharedMemoryClient : public Win32SharedMemory +{ +public: + Win32SharedMemoryClient(); + virtual ~Win32SharedMemoryClient(); + virtual bool isServer() const + { + return false; + } +}; + + +#endif //WIN32_SHARED_MEMORY_H