allow creation of multiple shared memory segments

This commit is contained in:
Erwin Coumans
2017-01-06 09:49:03 -08:00
parent 90b1026785
commit 8e554a0c1b
3 changed files with 109 additions and 92 deletions

View File

@@ -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;i<MAX_SHARED_MEMORY_BLOCKS;i++)
{
m_testBlocks[i]=0;
m_areConnected[i]=false;
}
}
@@ -89,9 +88,25 @@ PhysicsServerSharedMemory::PhysicsServerSharedMemory(SharedMemoryInterface* shar
PhysicsServerSharedMemory::~PhysicsServerSharedMemory()
{
m_data->m_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;block<MAX_SHARED_MEMORY_BLOCKS;block++)
{
if (m_data->m_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;block<MAX_SHARED_MEMORY_BLOCKS;block++)
{
if (m_data->m_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;block<MAX_SHARED_MEMORY_BLOCKS;block++)
{
if (m_data->m_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);

View File

@@ -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<btSharedMemorySegment> 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;i<m_internalData->m_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
}