PosixSharedMemory.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include "PosixSharedMemory.h"
  2. #include "Bullet3Common/b3Logging.h"
  3. #include "LinearMath/btScalar.h" //for btAssert
  4. //Windows implementation is in Win32SharedMemory.cpp
  5. #ifndef _WIN32
  6. #define TEST_SHARED_MEMORY
  7. #endif//_WIN32
  8. #include <stddef.h>
  9. #ifdef TEST_SHARED_MEMORY
  10. #include <sys/shm.h>
  11. #include <sys/ipc.h>
  12. #endif
  13. struct PosixSharedMemoryInteralData
  14. {
  15. bool m_createdSharedMemory;
  16. int m_sharedMemoryId;
  17. void* m_sharedMemoryPtr;
  18. PosixSharedMemoryInteralData()
  19. :m_createdSharedMemory(false),
  20. m_sharedMemoryId(-1),
  21. m_sharedMemoryPtr(0)
  22. {
  23. }
  24. };
  25. PosixSharedMemory::PosixSharedMemory()
  26. {
  27. m_internalData = new PosixSharedMemoryInteralData;
  28. }
  29. PosixSharedMemory::~PosixSharedMemory()
  30. {
  31. delete m_internalData;
  32. }
  33. struct btPointerCaster
  34. {
  35. union
  36. {
  37. void* ptr;
  38. ptrdiff_t integer;
  39. };
  40. };
  41. void* PosixSharedMemory::allocateSharedMemory(int key, int size, bool allowCreation)
  42. {
  43. #ifdef TEST_SHARED_MEMORY
  44. int flags = (allowCreation ? IPC_CREAT : 0) | 0666;
  45. int id = shmget((key_t) key, (size_t) size,flags);
  46. if (id < 0)
  47. {
  48. b3Error("shmget error");
  49. } else
  50. {
  51. btPointerCaster result;
  52. result.ptr = shmat(id,0,0);
  53. if (result.integer == -1)
  54. {
  55. b3Error("shmat returned -1");
  56. } else
  57. {
  58. m_internalData->m_createdSharedMemory = allowCreation;
  59. m_internalData->m_sharedMemoryId = id;
  60. m_internalData->m_sharedMemoryPtr = result.ptr;
  61. return result.ptr;
  62. }
  63. }
  64. #else
  65. //not implemented yet
  66. btAssert(0);
  67. #endif
  68. return 0;
  69. }
  70. void PosixSharedMemory::releaseSharedMemory(int key, int size)
  71. {
  72. #ifdef TEST_SHARED_MEMORY
  73. if (m_internalData->m_sharedMemoryId < 0)
  74. {
  75. b3Error("PosixSharedMemory::releaseSharedMemory: shared memory id is not set");
  76. } else
  77. {
  78. if (m_internalData->m_createdSharedMemory)
  79. {
  80. int result = shmctl(m_internalData->m_sharedMemoryId,IPC_RMID,0);
  81. if (result == -1)
  82. {
  83. b3Error("PosixSharedMemory::releaseSharedMemory: shmat returned -1");
  84. } else
  85. {
  86. b3Printf("PosixSharedMemory::releaseSharedMemory removed shared memory");
  87. }
  88. m_internalData->m_createdSharedMemory = false;
  89. m_internalData->m_sharedMemoryId = -1;
  90. }
  91. if (m_internalData->m_sharedMemoryPtr)
  92. {
  93. shmdt(m_internalData->m_sharedMemoryPtr);
  94. m_internalData->m_sharedMemoryPtr = 0;
  95. b3Printf("PosixSharedMemory::releaseSharedMemory detached shared memory\n");
  96. }
  97. }
  98. #endif
  99. }