ipcshm.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. // gfaipc.cpp
  2. //
  3. #ifdef _WIN32
  4. #define _CRT_SECURE_NO_WARNINGS
  5. #include <windows.h>
  6. #endif // _WIN32
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include "defines.h"
  10. #include "uuid.h"
  11. #include "shmrot.h"
  12. /////////////////////////////////////////////////////////////////////////////
  13. CShmHandleMap::CShmHandleMap(void)
  14. {
  15. memset(m_handles, 0, sizeof(m_handles));
  16. }
  17. CShmHandleMap::~CShmHandleMap(void)
  18. {
  19. for(size_t i = 0; i < _IPCSHM_MAX_HANDLES; i++)
  20. {
  21. }
  22. }
  23. HSHM CShmHandleMap::AcquireHandle(CShm *pShm)
  24. {
  25. HSHM hShm = NULL;
  26. for(int i = 0; i < _IPCSHM_MAX_HANDLES; i++)
  27. {
  28. if(!m_handles[i].pShm)
  29. {
  30. m_handles[i].pShm = pShm;
  31. hShm = &m_handles[i];
  32. break;
  33. }
  34. }
  35. return hShm;
  36. }
  37. void CShmHandleMap::ReleaseHandle(HSHM hShm)
  38. {
  39. for(int i = 0; i < _IPCSHM_MAX_HANDLES; i++)
  40. {
  41. if(&m_handles[i] == hShm)
  42. {
  43. m_handles[i].pShm = NULL;
  44. break;
  45. }
  46. }
  47. }
  48. CShm* CShmHandleMap::LookupShm(const uuid_t &uuid)
  49. {
  50. for(int i = 0; i < _IPCSHM_MAX_HANDLES; i++)
  51. {
  52. if(m_handles[i].pShm)
  53. {
  54. const uuid_t &uuid2 = m_handles[i].pShm->Uuid();
  55. if(!_uuid_compare(&uuid, &uuid2))
  56. return m_handles[i].pShm;
  57. }
  58. }
  59. return NULL;
  60. }
  61. /////////////////////////////////////////////////////////////////////////////
  62. static CShmROT g_shmRot;
  63. static CShmHandleMap g_shmHandleMap;
  64. __attribute__ ((constructor)) void _OnSoLoad(void)
  65. {
  66. TRACE("Loading Module GfaIpc.\n");
  67. }
  68. __attribute__ ((destructor)) void _OnSoUnload(void)
  69. {
  70. TRACE("Unloading Module GfaIpc.\n");
  71. }
  72. /////////////////////////////////////////////////////////////////////////////
  73. void GfaIpcForceReleaseMutex(void)
  74. {
  75. g_shmRot.ForceReleaseMutex();
  76. }
  77. HSHM GfaIpcAcquireSHM(const char *pszUuid, size_t nSizeElement, size_t nCntElements, const char *pszDescName)
  78. {
  79. HSHM hShm = NULL;
  80. if(!g_shmRot.Created())
  81. {
  82. if(!g_shmRot.Create())
  83. {
  84. TRACE("GfaIpcAcquireSHM: Failed to create ROT!\n");
  85. return NULL;
  86. }
  87. }
  88. g_shmRot.Lock();
  89. CShm *pShm = g_shmRot.AcquireShm(pszUuid, nSizeElement, nCntElements, pszDescName);
  90. if(pShm)
  91. {
  92. hShm = g_shmHandleMap.AcquireHandle(pShm);
  93. if(!hShm)
  94. {
  95. TRACE("GfaIpcAcquireSHM: Failed to acquire handle!\n");
  96. g_shmRot.ReleaseShm(pShm);
  97. }
  98. }
  99. g_shmRot.Unlock();
  100. return hShm;
  101. }
  102. /////////////////////////////////////////////////////////////////////////////
  103. void GfaIpcReleaseSHM(HSHM hShm)
  104. {
  105. if(hShm)
  106. {
  107. LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
  108. if(!ph->pShm)
  109. {
  110. TRACE("GfaIpcReleaseSHM: Invalid Handle!\n");
  111. return;
  112. }
  113. g_shmRot.Lock();
  114. g_shmRot.ReleaseShm(ph->pShm);
  115. g_shmHandleMap.ReleaseHandle(hShm);
  116. g_shmRot.Unlock();
  117. }
  118. }
  119. /////////////////////////////////////////////////////////////////////////////
  120. void* GfaIpcAcquirePointer(HSHM hShm)
  121. {
  122. if(hShm)
  123. {
  124. LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
  125. if(!ph->pShm)
  126. {
  127. TRACE("GfaIpcAcquirePointer: Invalid Handle!\n");
  128. return NULL;
  129. }
  130. return ph->pShm->Attach();
  131. }
  132. TRACE("GfaIpcAcquirePointer: Invalid Handle!\n");
  133. return NULL;
  134. }
  135. /////////////////////////////////////////////////////////////////////////////
  136. void GfaIpcReleasePointer(HSHM hShm, const void *p)
  137. {
  138. if(!hShm)
  139. {
  140. TRACE("GfaIpcReleasePointer: Invalid Handle!\n");
  141. return;
  142. }
  143. LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
  144. if(!ph->pShm)
  145. {
  146. TRACE("GfaIpcReleasePointer: Invalid Handle!\n");
  147. return;
  148. }
  149. ph->pShm->Detach(p);
  150. }
  151. /////////////////////////////////////////////////////////////////////////////
  152. void GfaIpcLockSHM(HSHM hShm)
  153. {
  154. if(!hShm)
  155. {
  156. TRACE("GfaIpcLockSHM: Invalid Handle!\n");
  157. return;
  158. }
  159. LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
  160. if(!ph->pShm)
  161. {
  162. TRACE("GfaIpcLockSHM: Invalid Handle!\n");
  163. return;
  164. }
  165. ph->pShm->Lock();
  166. }
  167. /////////////////////////////////////////////////////////////////////////////
  168. int GfaIpcTryLockSHM(HSHM hShm)
  169. {
  170. if(!hShm)
  171. {
  172. TRACE("GfaIpcTryLockSHM: Invalid Handle!\n");
  173. return 0;
  174. }
  175. LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
  176. if(!ph->pShm)
  177. {
  178. TRACE("GfaIpcTryLockSHM: Invalid Handle!\n");
  179. return 0;
  180. }
  181. return ph->pShm->TryLock();
  182. }
  183. /////////////////////////////////////////////////////////////////////////////
  184. void GfaIpcUnlockSHM(HSHM hShm)
  185. {
  186. if(!hShm)
  187. {
  188. TRACE("GfaIpcUnlockSHM: Invalid Handle!\n");
  189. return;
  190. }
  191. LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
  192. if(!ph->pShm)
  193. {
  194. TRACE("GfaIpcUnlockSHM: Invalid Handle!\n");
  195. return;
  196. }
  197. ph->pShm->Unlock();
  198. }
  199. /////////////////////////////////////////////////////////////////////////////
  200. int GfaIpcLockSHMAndSigBlock(HSHM hShm, sigset_t *pss)
  201. {
  202. if(!hShm)
  203. {
  204. TRACE("GfaIpcLockSHMAndSigBlock: Invalid Handle!\n");
  205. return 0;
  206. }
  207. LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
  208. if(!ph->pShm)
  209. {
  210. TRACE("GfaIpcLockSHMAndSigBlock: Invalid Handle!\n");
  211. return 0;
  212. }
  213. return ph->pShm->LockAndSigBlock(pss);
  214. }
  215. /////////////////////////////////////////////////////////////////////////////
  216. int GfaIpcUnlockSHMAndSigUnblock(HSHM hShm, sigset_t *pss)
  217. {
  218. if(!hShm)
  219. {
  220. TRACE("GfaIpcLockSHMAndSigBlock: Invalid Handle!\n");
  221. return 0;
  222. }
  223. LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
  224. if(!ph->pShm)
  225. {
  226. TRACE("GfaIpcLockSHMAndSigBlock: Invalid Handle!\n");
  227. return 0;
  228. }
  229. return ph->pShm->UnlockAndSigUnblock(pss);
  230. }
  231. /////////////////////////////////////////////////////////////////////////////
  232. void GfaIpcDumpSHMROT(void)
  233. {
  234. if(!g_shmRot.Created())
  235. {
  236. if(!g_shmRot.Create())
  237. {
  238. TRACE("GfaIpcDumpSHMROT: Failed to create ROT!\n");
  239. return;
  240. }
  241. }
  242. g_shmRot.DumpEntries(g_shmHandleMap);
  243. }
  244. /////////////////////////////////////////////////////////////////////////////
  245. long GfaIpcInterlockedIncrement(HSHM hShm, volatile long *pl)
  246. {
  247. if(!hShm)
  248. {
  249. TRACE("GfaIpcInterlockedIncrement: Invalid Handle!\n");
  250. return 0;
  251. }
  252. LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
  253. if(!ph->pShm)
  254. {
  255. TRACE("GfaIpcInterlockedIncrement: Invalid Handle!\n");
  256. return 0;
  257. }
  258. return ph->pShm->InterlockedIncrement(pl);
  259. }
  260. /////////////////////////////////////////////////////////////////////////////
  261. long GfaIpcInterlockedDecrement(HSHM hShm, volatile long *pl)
  262. {
  263. if(!hShm)
  264. {
  265. TRACE("GfaIpcInterlockedDecrement: Invalid Handle!\n");
  266. return 0;
  267. }
  268. LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
  269. if(!ph->pShm)
  270. {
  271. TRACE("GfaIpcInterlockedDecrement: Invalid Handle!\n");
  272. return 0;
  273. }
  274. return ph->pShm->InterlockedDecrement(pl);
  275. }
  276. /////////////////////////////////////////////////////////////////////////////
  277. long GfaIpcInterlockedCompare(HSHM hShm, volatile long *pl, long comparand)
  278. {
  279. if(!hShm)
  280. {
  281. TRACE("GfaIpcInterlockedCompare: Invalid Handle!\n");
  282. return 0;
  283. }
  284. LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
  285. if(!ph->pShm)
  286. {
  287. TRACE("GfaIpcInterlockedCompare: Invalid Handle!\n");
  288. return 0;
  289. }
  290. return ph->pShm->InterlockedCompare(pl, comparand);
  291. }
  292. /////////////////////////////////////////////////////////////////////////////
  293. long GfaIpcInterlockedSet(HSHM hShm, volatile long *pl, long val)
  294. {
  295. if(!hShm)
  296. {
  297. TRACE("GfaIpcInterlockedSet: Invalid Handle!\n");
  298. return 0;
  299. }
  300. LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
  301. if(!ph->pShm)
  302. {
  303. TRACE("GfaIpcInterlockedSet: Invalid Handle!\n");
  304. return 0;
  305. }
  306. return ph->pShm->InterlockedSet(pl, val);
  307. }
  308. /////////////////////////////////////////////////////////////////////////////
  309. long GfaIpcInterlockedClear(HSHM hShm, volatile long *pl)
  310. {
  311. if(!hShm)
  312. {
  313. TRACE("GfaIpcInterlockedSet: Invalid Handle!\n");
  314. return 0;
  315. }
  316. LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
  317. if(!ph->pShm)
  318. {
  319. TRACE("GfaIpcInterlockedClear: Invalid Handle!\n");
  320. return 0;
  321. }
  322. return ph->pShm->InterlockedClear(pl);
  323. }