l3.libnazgul/src/free.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;
}