#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; }