123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411 |
- // gfaipc.cpp
- //
- #ifdef _WIN32
- #define _CRT_SECURE_NO_WARNINGS
- #include <windows.h>
- #endif // _WIN32
- #include <stdio.h>
- #include <string.h>
- #include "defines.h"
- #include "uuid.h"
- #include "shmrot.h"
- /////////////////////////////////////////////////////////////////////////////
- CShmHandleMap::CShmHandleMap(void)
- {
- memset(m_handles, 0, sizeof(m_handles));
- }
- CShmHandleMap::~CShmHandleMap(void)
- {
- for(size_t i = 0; i < _IPCSHM_MAX_HANDLES; i++)
- {
- }
- }
- HSHM CShmHandleMap::AcquireHandle(CShm *pShm)
- {
- HSHM hShm = NULL;
- for(int i = 0; i < _IPCSHM_MAX_HANDLES; i++)
- {
- if(!m_handles[i].pShm)
- {
- m_handles[i].pShm = pShm;
- hShm = &m_handles[i];
- break;
- }
- }
- return hShm;
- }
- void CShmHandleMap::ReleaseHandle(HSHM hShm)
- {
- for(int i = 0; i < _IPCSHM_MAX_HANDLES; i++)
- {
- if(&m_handles[i] == hShm)
- {
- m_handles[i].pShm = NULL;
- break;
- }
- }
- }
- CShm* CShmHandleMap::LookupShm(const uuid_t &uuid)
- {
- for(int i = 0; i < _IPCSHM_MAX_HANDLES; i++)
- {
- if(m_handles[i].pShm)
- {
- const uuid_t &uuid2 = m_handles[i].pShm->Uuid();
- if(!_uuid_compare(&uuid, &uuid2))
- return m_handles[i].pShm;
- }
- }
- return NULL;
- }
- /////////////////////////////////////////////////////////////////////////////
- static CShmROT g_shmRot;
- static CShmHandleMap g_shmHandleMap;
- __attribute__ ((constructor)) void _OnSoLoad(void)
- {
- TRACE("Loading Module GfaIpc.\n");
- }
- __attribute__ ((destructor)) void _OnSoUnload(void)
- {
- TRACE("Unloading Module GfaIpc.\n");
- }
- /////////////////////////////////////////////////////////////////////////////
- void GfaIpcForceReleaseMutex(void)
- {
- g_shmRot.ForceReleaseMutex();
- }
- HSHM GfaIpcAcquireSHM(const char *pszUuid, size_t nSizeElement, size_t nCntElements, const char *pszDescName)
- {
- HSHM hShm = NULL;
- if(!g_shmRot.Created())
- {
- if(!g_shmRot.Create())
- {
- TRACE("GfaIpcAcquireSHM: Failed to create ROT!\n");
- return NULL;
- }
- }
- g_shmRot.Lock();
- CShm *pShm = g_shmRot.AcquireShm(pszUuid, nSizeElement, nCntElements, pszDescName);
- if(pShm)
- {
- hShm = g_shmHandleMap.AcquireHandle(pShm);
- if(!hShm)
- {
- TRACE("GfaIpcAcquireSHM: Failed to acquire handle!\n");
- g_shmRot.ReleaseShm(pShm);
- }
- }
- g_shmRot.Unlock();
- return hShm;
- }
- /////////////////////////////////////////////////////////////////////////////
- void GfaIpcReleaseSHM(HSHM hShm)
- {
- if(hShm)
- {
- LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
- if(!ph->pShm)
- {
- TRACE("GfaIpcReleaseSHM: Invalid Handle!\n");
- return;
- }
- g_shmRot.Lock();
- g_shmRot.ReleaseShm(ph->pShm);
- g_shmHandleMap.ReleaseHandle(hShm);
- g_shmRot.Unlock();
- }
- }
- /////////////////////////////////////////////////////////////////////////////
- void* GfaIpcAcquirePointer(HSHM hShm)
- {
- if(hShm)
- {
- LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
- if(!ph->pShm)
- {
- TRACE("GfaIpcAcquirePointer: Invalid Handle!\n");
- return NULL;
- }
- return ph->pShm->Attach();
- }
- TRACE("GfaIpcAcquirePointer: Invalid Handle!\n");
- return NULL;
- }
- /////////////////////////////////////////////////////////////////////////////
- void GfaIpcReleasePointer(HSHM hShm, const void *p)
- {
- if(!hShm)
- {
- TRACE("GfaIpcReleasePointer: Invalid Handle!\n");
- return;
- }
- LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
- if(!ph->pShm)
- {
- TRACE("GfaIpcReleasePointer: Invalid Handle!\n");
- return;
- }
- ph->pShm->Detach(p);
- }
- /////////////////////////////////////////////////////////////////////////////
- void GfaIpcLockSHM(HSHM hShm)
- {
- if(!hShm)
- {
- TRACE("GfaIpcLockSHM: Invalid Handle!\n");
- return;
- }
- LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
- if(!ph->pShm)
- {
- TRACE("GfaIpcLockSHM: Invalid Handle!\n");
- return;
- }
- ph->pShm->Lock();
- }
- /////////////////////////////////////////////////////////////////////////////
- int GfaIpcTryLockSHM(HSHM hShm)
- {
- if(!hShm)
- {
- TRACE("GfaIpcTryLockSHM: Invalid Handle!\n");
- return 0;
- }
- LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
- if(!ph->pShm)
- {
- TRACE("GfaIpcTryLockSHM: Invalid Handle!\n");
- return 0;
- }
- return ph->pShm->TryLock();
- }
- /////////////////////////////////////////////////////////////////////////////
- void GfaIpcUnlockSHM(HSHM hShm)
- {
- if(!hShm)
- {
- TRACE("GfaIpcUnlockSHM: Invalid Handle!\n");
- return;
- }
- LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
- if(!ph->pShm)
- {
- TRACE("GfaIpcUnlockSHM: Invalid Handle!\n");
- return;
- }
- ph->pShm->Unlock();
- }
- /////////////////////////////////////////////////////////////////////////////
- int GfaIpcLockSHMAndSigBlock(HSHM hShm, sigset_t *pss)
- {
- if(!hShm)
- {
- TRACE("GfaIpcLockSHMAndSigBlock: Invalid Handle!\n");
- return 0;
- }
- LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
- if(!ph->pShm)
- {
- TRACE("GfaIpcLockSHMAndSigBlock: Invalid Handle!\n");
- return 0;
- }
- return ph->pShm->LockAndSigBlock(pss);
- }
- /////////////////////////////////////////////////////////////////////////////
- int GfaIpcUnlockSHMAndSigUnblock(HSHM hShm, sigset_t *pss)
- {
- if(!hShm)
- {
- TRACE("GfaIpcLockSHMAndSigBlock: Invalid Handle!\n");
- return 0;
- }
- LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
- if(!ph->pShm)
- {
- TRACE("GfaIpcLockSHMAndSigBlock: Invalid Handle!\n");
- return 0;
- }
- return ph->pShm->UnlockAndSigUnblock(pss);
- }
- /////////////////////////////////////////////////////////////////////////////
- void GfaIpcDumpSHMROT(void)
- {
- if(!g_shmRot.Created())
- {
- if(!g_shmRot.Create())
- {
- TRACE("GfaIpcDumpSHMROT: Failed to create ROT!\n");
- return;
- }
- }
- g_shmRot.DumpEntries(g_shmHandleMap);
- }
- /////////////////////////////////////////////////////////////////////////////
- long GfaIpcInterlockedIncrement(HSHM hShm, volatile long *pl)
- {
- if(!hShm)
- {
- TRACE("GfaIpcInterlockedIncrement: Invalid Handle!\n");
- return 0;
- }
- LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
- if(!ph->pShm)
- {
- TRACE("GfaIpcInterlockedIncrement: Invalid Handle!\n");
- return 0;
- }
- return ph->pShm->InterlockedIncrement(pl);
- }
- /////////////////////////////////////////////////////////////////////////////
- long GfaIpcInterlockedDecrement(HSHM hShm, volatile long *pl)
- {
- if(!hShm)
- {
- TRACE("GfaIpcInterlockedDecrement: Invalid Handle!\n");
- return 0;
- }
- LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
- if(!ph->pShm)
- {
- TRACE("GfaIpcInterlockedDecrement: Invalid Handle!\n");
- return 0;
- }
- return ph->pShm->InterlockedDecrement(pl);
- }
- /////////////////////////////////////////////////////////////////////////////
- long GfaIpcInterlockedCompare(HSHM hShm, volatile long *pl, long comparand)
- {
- if(!hShm)
- {
- TRACE("GfaIpcInterlockedCompare: Invalid Handle!\n");
- return 0;
- }
- LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
- if(!ph->pShm)
- {
- TRACE("GfaIpcInterlockedCompare: Invalid Handle!\n");
- return 0;
- }
- return ph->pShm->InterlockedCompare(pl, comparand);
- }
- /////////////////////////////////////////////////////////////////////////////
- long GfaIpcInterlockedSet(HSHM hShm, volatile long *pl, long val)
- {
- if(!hShm)
- {
- TRACE("GfaIpcInterlockedSet: Invalid Handle!\n");
- return 0;
- }
- LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
- if(!ph->pShm)
- {
- TRACE("GfaIpcInterlockedSet: Invalid Handle!\n");
- return 0;
- }
- return ph->pShm->InterlockedSet(pl, val);
- }
- /////////////////////////////////////////////////////////////////////////////
- long GfaIpcInterlockedClear(HSHM hShm, volatile long *pl)
- {
- if(!hShm)
- {
- TRACE("GfaIpcInterlockedSet: Invalid Handle!\n");
- return 0;
- }
- LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
- if(!ph->pShm)
- {
- TRACE("GfaIpcInterlockedClear: Invalid Handle!\n");
- return 0;
- }
- return ph->pShm->InterlockedClear(pl);
- }
|