Detach posix shared memory correctly

* shmget() fails after shmctl() is called with IPC_RMID. This patch
removes shmget() in releaseSharedMemory so that a client can detach
a shared memory correctly after a server removed it.
* A server should also detach a shared memory.
This commit is contained in:
Takuya NAKAOKA
2015-09-07 18:59:59 +09:00
parent 9e7f8e614b
commit 4cbd86a058

View File

@@ -19,10 +19,12 @@
struct PosixSharedMemoryInteralData struct PosixSharedMemoryInteralData
{ {
bool m_createdSharedMemory; bool m_createdSharedMemory;
int m_sharedMemoryId;
void* m_sharedMemoryPtr; void* m_sharedMemoryPtr;
PosixSharedMemoryInteralData() PosixSharedMemoryInteralData()
:m_createdSharedMemory(false), :m_createdSharedMemory(false),
m_sharedMemoryId(-1),
m_sharedMemoryPtr(0) m_sharedMemoryPtr(0)
{ {
} }
@@ -66,6 +68,7 @@ void* PosixSharedMemory::allocateSharedMemory(int key, int size, bool allowCr
} else } else
{ {
m_internalData->m_createdSharedMemory = allowCreation; m_internalData->m_createdSharedMemory = allowCreation;
m_internalData->m_sharedMemoryId = id;
m_internalData->m_sharedMemoryPtr = result.ptr; m_internalData->m_sharedMemoryPtr = result.ptr;
return result.ptr; return result.ptr;
} }
@@ -79,16 +82,14 @@ void* PosixSharedMemory::allocateSharedMemory(int key, int size, bool allowCr
void PosixSharedMemory::releaseSharedMemory(int key, int size) void PosixSharedMemory::releaseSharedMemory(int key, int size)
{ {
#ifdef TEST_SHARED_MEMORY #ifdef TEST_SHARED_MEMORY
int flags = 0666; if (m_internalData->m_sharedMemoryId < 0)
int id = shmget((key_t) key, (size_t) size,flags);
if (id < 0)
{ {
b3Error("PosixSharedMemory::releaseSharedMemory: shmget error"); b3Error("PosixSharedMemory::releaseSharedMemory: shared memory id is not set");
} else } else
{ {
if (m_internalData->m_createdSharedMemory) if (m_internalData->m_createdSharedMemory)
{ {
int result = shmctl(id,IPC_RMID,0); int result = shmctl(m_internalData->m_sharedMemoryId,IPC_RMID,0);
if (result == -1) if (result == -1)
{ {
b3Error("PosixSharedMemory::releaseSharedMemory: shmat returned -1"); b3Error("PosixSharedMemory::releaseSharedMemory: shmat returned -1");
@@ -97,8 +98,9 @@ void PosixSharedMemory::releaseSharedMemory(int key, int size)
b3Printf("PosixSharedMemory::releaseSharedMemory removed shared memory"); b3Printf("PosixSharedMemory::releaseSharedMemory removed shared memory");
} }
m_internalData->m_createdSharedMemory = false; m_internalData->m_createdSharedMemory = false;
m_internalData->m_sharedMemoryPtr = 0; m_internalData->m_sharedMemoryId = -1;
} else }
if (m_internalData->m_sharedMemoryPtr)
{ {
shmdt(m_internalData->m_sharedMemoryPtr); shmdt(m_internalData->m_sharedMemoryPtr);
m_internalData->m_sharedMemoryPtr = 0; m_internalData->m_sharedMemoryPtr = 0;