From 8e554a0c1b3a7f1907015140f306fe0b68de8c8f Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Fri, 6 Jan 2017 09:49:03 -0800 Subject: [PATCH] allow creation of multiple shared memory segments --- .../PhysicsServerSharedMemory.cpp | 112 +++++++----------- examples/SharedMemory/PosixSharedMemory.cpp | 74 +++++++++--- src/LinearMath/btAlignedObjectArray.h | 15 ++- 3 files changed, 109 insertions(+), 92 deletions(-) diff --git a/examples/SharedMemory/PhysicsServerSharedMemory.cpp b/examples/SharedMemory/PhysicsServerSharedMemory.cpp index 004bc048c..f19620cbd 100644 --- a/examples/SharedMemory/PhysicsServerSharedMemory.cpp +++ b/examples/SharedMemory/PhysicsServerSharedMemory.cpp @@ -28,7 +28,7 @@ struct PhysicsServerSharedMemoryInternalData SharedMemoryBlock* m_testBlocks[MAX_SHARED_MEMORY_BLOCKS]; int m_sharedMemoryKey; - bool m_isConnected; + bool m_areConnected[MAX_SHARED_MEMORY_BLOCKS]; bool m_verboseOutput; PhysicsServerCommandProcessor* m_commandProcessor; @@ -36,8 +36,7 @@ struct PhysicsServerSharedMemoryInternalData :m_sharedMemory(0), m_ownsSharedMemory(false), m_sharedMemoryKey(SHARED_MEMORY_KEY), - m_isConnected(false), - m_verboseOutput(false), + m_verboseOutput(false), m_commandProcessor(0) { @@ -45,7 +44,7 @@ struct PhysicsServerSharedMemoryInternalData for (int i=0;im_commandProcessor->deleteDynamicsWorld(); delete m_data->m_commandProcessor; - delete m_data; + + if (m_data->m_sharedMemory) + { + if (m_data->m_verboseOutput) + { + b3Printf("m_sharedMemory\n"); + } + if (m_data->m_ownsSharedMemory) + { + delete m_data->m_sharedMemory; + } + m_data->m_sharedMemory = 0; + } + + + delete m_data; } void PhysicsServerSharedMemory::resetDynamicsWorld() @@ -112,18 +127,22 @@ bool PhysicsServerSharedMemory::connectSharedMemory( struct GUIHelperInterface* bool allowCreation = true; + bool allConnected = false; + - if (m_data->m_isConnected) - { - b3Warning("connectSharedMemory, while already connected"); - return m_data->m_isConnected; - } + int counter = 0; for (int block=0;blockm_areConnected[block]) + { + allConnected = true; + b3Warning("connectSharedMemory, while already connected"); + continue; + } do { @@ -143,26 +162,26 @@ bool PhysicsServerSharedMemory::connectSharedMemory( struct GUIHelperInterface* { b3Printf("Created and initialized shared memory block\n"); } - m_data->m_isConnected = true; + m_data->m_areConnected[block] = true; } else { m_data->m_sharedMemory->releaseSharedMemory(m_data->m_sharedMemoryKey+block, SHARED_MEMORY_SIZE); m_data->m_testBlocks[block] = 0; - m_data->m_isConnected = false; + m_data->m_areConnected[block] = false; } } else { b3Error("Cannot connect to shared memory"); - m_data->m_isConnected = false; + m_data->m_areConnected[block] = false; } - } while (counter++ < 10 && !m_data->m_isConnected); + } while (counter++ < 10 && !m_data->m_areConnected[block]); + if (!m_data->m_areConnected[block]) + { + b3Error("Server cannot connect to shared memory.\n"); + } } - if (!m_data->m_isConnected) - { - b3Error("Server cannot connect to shared memory.\n"); - } - return m_data->m_isConnected; + return allConnected; } @@ -193,59 +212,15 @@ void PhysicsServerSharedMemory::disconnectSharedMemory(bool deInitializeSharedMe btAssert(m_data->m_sharedMemory); m_data->m_sharedMemory->releaseSharedMemory(m_data->m_sharedMemoryKey+block, SHARED_MEMORY_SIZE); } - if (m_data->m_sharedMemory) - { - if (m_data->m_verboseOutput) - { - b3Printf("m_sharedMemory\n"); - } - if (m_data->m_ownsSharedMemory) - { - delete m_data->m_sharedMemory; - } - m_data->m_sharedMemory = 0; - m_data->m_testBlocks[block] = 0; - } + m_data->m_testBlocks[block] = 0; + m_data->m_areConnected[block] = false; + } } void PhysicsServerSharedMemory::releaseSharedMemory() { - for (int block = 0;blockm_verboseOutput) - { - b3Printf("releaseSharedMemory1\n"); - } - if (m_data->m_testBlocks[block]) - { - if (m_data->m_verboseOutput) - { - b3Printf("m_testBlock1\n"); - } - m_data->m_testBlocks[block]->m_magicId = 0; - if (m_data->m_verboseOutput) - { - b3Printf("magic id = %d\n",m_data->m_testBlocks[block]->m_magicId); - } - btAssert(m_data->m_sharedMemory); - m_data->m_sharedMemory->releaseSharedMemory( m_data->m_sharedMemoryKey+block - , SHARED_MEMORY_SIZE); - } - if (m_data->m_sharedMemory) - { - if (m_data->m_verboseOutput) - { - b3Printf("m_sharedMemory\n"); - } - if (m_data->m_ownsSharedMemory) - { - delete m_data->m_sharedMemory; - } - m_data->m_sharedMemory = 0; - m_data->m_testBlocks[block] = 0; - } - } + disconnectSharedMemory(true); } @@ -265,7 +240,8 @@ void PhysicsServerSharedMemory::processClientCommands() { for (int block = 0;blockm_isConnected && m_data->m_testBlocks[block]) + + if (m_data->m_areConnected[block] && m_data->m_testBlocks[block]) { m_data->m_commandProcessor->replayLogCommand(&m_data->m_testBlocks[block]->m_bulletStreamDataServerToClientRefactor[0],SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE); diff --git a/examples/SharedMemory/PosixSharedMemory.cpp b/examples/SharedMemory/PosixSharedMemory.cpp index 0297d43e2..16c439d48 100644 --- a/examples/SharedMemory/PosixSharedMemory.cpp +++ b/examples/SharedMemory/PosixSharedMemory.cpp @@ -1,6 +1,7 @@ #include "PosixSharedMemory.h" #include "Bullet3Common/b3Logging.h" #include "LinearMath/btScalar.h" //for btAssert +#include "LinearMath/btAlignedObjectArray.h" //Windows implementation is in Win32SharedMemory.cpp #ifndef _WIN32 @@ -16,16 +17,28 @@ #endif +struct btSharedMemorySegment +{ + int m_key; + int m_sharedMemoryId; + void* m_sharedMemoryPtr; + bool m_createdSharedMemory; + + btSharedMemorySegment() + : m_sharedMemoryId(-1), + m_sharedMemoryPtr(0), + m_createdSharedMemory(true) + { + } + +}; + struct PosixSharedMemoryInteralData { - bool m_createdSharedMemory; - int m_sharedMemoryId; - void* m_sharedMemoryPtr; - + btAlignedObjectArray m_segments; + + PosixSharedMemoryInteralData() - :m_createdSharedMemory(false), - m_sharedMemoryId(-1), - m_sharedMemoryPtr(0) { } }; @@ -67,9 +80,12 @@ void* PosixSharedMemory::allocateSharedMemory(int key, int size, bool allowCr b3Error("shmat returned -1"); } else { - m_internalData->m_createdSharedMemory = allowCreation; - m_internalData->m_sharedMemoryId = id; - m_internalData->m_sharedMemoryPtr = result.ptr; + btSharedMemorySegment seg; + seg.m_key = key; + seg.m_createdSharedMemory = allowCreation; + seg.m_sharedMemoryId = id; + seg.m_sharedMemoryPtr = result.ptr; + m_internalData->m_segments.push_back(seg); return result.ptr; } } @@ -82,14 +98,33 @@ void* PosixSharedMemory::allocateSharedMemory(int key, int size, bool allowCr void PosixSharedMemory::releaseSharedMemory(int key, int size) { #ifdef TEST_SHARED_MEMORY - if (m_internalData->m_sharedMemoryId < 0) + + btSharedMemorySegment* seg = 0; + int i=0; + + for (i=0;im_segments.size();i++) + { + if (m_internalData->m_segments[i].m_key == key) + { + seg = &m_internalData->m_segments[i]; + break; + } + } + + if (0==seg) + { + b3Error("PosixSharedMemory::releaseSharedMemory: shared memory key not found"); + return; + } + + if (seg->m_sharedMemoryId < 0) { b3Error("PosixSharedMemory::releaseSharedMemory: shared memory id is not set"); } else { - if (m_internalData->m_createdSharedMemory) + if (seg->m_createdSharedMemory) { - int result = shmctl(m_internalData->m_sharedMemoryId,IPC_RMID,0); + int result = shmctl(seg->m_sharedMemoryId,IPC_RMID,0); if (result == -1) { b3Error("PosixSharedMemory::releaseSharedMemory: shmat returned -1"); @@ -97,15 +132,18 @@ void PosixSharedMemory::releaseSharedMemory(int key, int size) { b3Printf("PosixSharedMemory::releaseSharedMemory removed shared memory"); } - m_internalData->m_createdSharedMemory = false; - m_internalData->m_sharedMemoryId = -1; + seg->m_createdSharedMemory = false; + seg->m_sharedMemoryId = -1; } - if (m_internalData->m_sharedMemoryPtr) + if (seg->m_sharedMemoryPtr) { - shmdt(m_internalData->m_sharedMemoryPtr); - m_internalData->m_sharedMemoryPtr = 0; + shmdt(seg->m_sharedMemoryPtr); + seg->m_sharedMemoryPtr = 0; b3Printf("PosixSharedMemory::releaseSharedMemory detached shared memory\n"); } } + + m_internalData->m_segments.removeAtIndex(i); + #endif } diff --git a/src/LinearMath/btAlignedObjectArray.h b/src/LinearMath/btAlignedObjectArray.h index 146ae72e8..56f8189c1 100644 --- a/src/LinearMath/btAlignedObjectArray.h +++ b/src/LinearMath/btAlignedObjectArray.h @@ -476,15 +476,18 @@ protected: return index; } + void removeAtIndex(int index) + { + if (index