shm.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "precompile.h"
  2. #include "shm.h"
  3. #include <stdio.h>
  4. /* Detach from a shared mem area based on its address */
  5. TOOLKIT_API int
  6. shmdt(const void *shmaddr)
  7. {
  8. if (UnmapViewOfFile((LPCVOID *) shmaddr))
  9. return 0;
  10. else
  11. return -1;
  12. }
  13. /* Attach to an existing area */
  14. TOOLKIT_API void *
  15. shmat(int memId, void *shmaddr, int flag)
  16. {
  17. DWORD dwAccessFlag = (flag & SHM_RDONLY) ? FILE_MAP_READ : (FILE_MAP_WRITE | FILE_MAP_READ);
  18. /* TODO -- shmat needs to count # attached to shared mem */
  19. void *lpmem = MapViewOfFileEx((HANDLE) memId,
  20. dwAccessFlag,
  21. 0, 0, /* (DWORD)pshmdsc->segsize */ 0, shmaddr);
  22. if (lpmem == NULL)
  23. {
  24. DWORD dwError = GetLastError();
  25. lpmem = (void *) -1;
  26. }
  27. return lpmem;
  28. }
  29. /* Control a shared mem area */
  30. TOOLKIT_API int shmctl(int shmid, int flag, struct shmid_ds * dummy)
  31. {
  32. if (flag == IPC_RMID)
  33. {
  34. /* Delete the area */
  35. CloseHandle((HANDLE) shmid);
  36. return 0;
  37. }
  38. if (flag == IPC_STAT)
  39. {
  40. /* Can only test for if exists */
  41. int hmap = shmget(shmid, 0, 0);
  42. if (hmap < 0)
  43. {
  44. /* Shared memory does not exist */
  45. return -1;
  46. }
  47. else
  48. {
  49. /* Shared memory does exist and must be in use */
  50. shmctl(hmap, IPC_RMID, NULL); /* Release our hold on it */
  51. return 0;
  52. }
  53. }
  54. return -1;
  55. }
  56. static int shmget_str(const char *szShareMem, int size, int flag)
  57. {
  58. HANDLE hmap;
  59. DWORD dwRet;
  60. if (flag & IPC_CREAT)
  61. {
  62. hmap = CreateFileMappingA((HANDLE) 0xFFFFFFFF, /* Use the swap file */
  63. NULL,
  64. PAGE_READWRITE, /* Memory is Read/Write */
  65. 0L, /* Size Upper 32 Bits */
  66. (DWORD) size, /* Size Lower 32 bits */
  67. szShareMem);
  68. }
  69. else
  70. {
  71. hmap = OpenFileMappingA(FILE_MAP_ALL_ACCESS,
  72. FALSE,
  73. szShareMem);
  74. if (!hmap)
  75. {
  76. return -1;
  77. }
  78. }
  79. dwRet = GetLastError();
  80. if (dwRet == ERROR_ALREADY_EXISTS && hmap && (flag & IPC_CREAT & IPC_EXCL))
  81. {
  82. /* Caller wanted to create the segment -- error if already exists */
  83. CloseHandle(hmap);
  84. return -1;
  85. }
  86. else if (!hmap)
  87. {
  88. /* Unable to get shared memory */
  89. return -1;
  90. }
  91. return (int) hmap;
  92. }
  93. /* Get an area based on the IPC key */
  94. TOOLKIT_API int shmget(int memKey, int size, int flag)
  95. {
  96. char szShareMem[32];
  97. sprintf(szShareMem, "shm.%d", memKey);
  98. return shmget_str(szShareMem, size, flag);
  99. }