64 lines
1.6 KiB
C
64 lines
1.6 KiB
C
#include "libnazgul.h"
|
|
|
|
int msgFree(msgSpace * space, void *addr)
|
|
{
|
|
|
|
int poolIndex;
|
|
int bufferIndex;
|
|
msgPoolData *poolDataTabAddr;
|
|
sem_t *ressourceSemFd;
|
|
msgPoolDataTabSemId ressourceSemId;
|
|
int err;
|
|
int bufferNb;
|
|
int bufferSize;
|
|
void *realAddr;
|
|
printf("[ FREE %p ]\n", (void *)addr);
|
|
/* on acquiert le droit de modifier les infos sur la ressource */
|
|
/* on protege le tableau des associations */
|
|
if (msgPoolDataTabLock(space) < 0) {
|
|
NZG_ERROR("msgPoolDataTabLock", space->poolDataTabSemId);
|
|
goto ERROR;
|
|
};
|
|
|
|
/* verifier le premier arg du shm_open */
|
|
|
|
poolDataTabAddr = msgPoolDataTabOpen(space);
|
|
|
|
// TODO: verouiller semaphore DataInfo ??
|
|
|
|
poolIndex = -1;
|
|
bufferIndex = -1;
|
|
err = msgBufferGetProcAttach(poolDataTabAddr,
|
|
space->poolNb,
|
|
&poolIndex, &bufferIndex, addr);
|
|
|
|
printf("Found : %d\n", err);
|
|
printf("Freing pool: %d, buffer: %d\n", poolIndex, bufferIndex);
|
|
msgBufferDetachProc(poolDataTabAddr, poolIndex, bufferIndex, addr);
|
|
|
|
/* unmapper le buffer */
|
|
realAddr = addr;
|
|
bufferSize = poolDataTabAddr[poolIndex].bufferSize;
|
|
bufferNb = poolDataTabAddr[poolIndex].bufferNb;
|
|
realAddr = realAddr - poolIndex * bufferSize;
|
|
munmap(realAddr, bufferSize * bufferNb);
|
|
|
|
msgPoolDataTabClose(space, poolDataTabAddr);
|
|
|
|
// deverouiller semaphore DataInfo
|
|
msgPoolDataTabUnlock(space);
|
|
|
|
// deverouiller semaphore ressource.
|
|
msgPoolSemIdIntern(ressourceSemId, space->externId, poolIndex);
|
|
ressourceSemFd = sem_open(ressourceSemId, O_CREAT, SEM_DEFAULT_MODE, 0);
|
|
if (ressourceSemFd == SEM_FAILED) {
|
|
NZG_ERROR("sem_open", ressourceSemId);
|
|
goto ERROR;
|
|
}
|
|
sem_post(ressourceSemFd);
|
|
sem_close(ressourceSemFd);
|
|
return 0;
|
|
ERROR:
|
|
return -1;
|
|
}
|