#include "libnazgul.h" int msgFree(msgSpace * space, void * addr){ printf("[ FREE 0x%08x ]\n",(int)addr); int poolIndex; int bufferIndex; int poolDataTabFd; msgPoolData * poolDataTabAddr; sem_t * poolDataTabSemFd; msgPoolDataTabSemId ressourceSemId; sem_t * ressourceSemFd; /* on acquiert le droit de modifier les infos sur la ressource */ /* on protege le tableau des associations */ poolDataTabSemFd=sem_open(space->poolDataTabSemId, O_CREAT,SEM_DEFAULT_MODE,1); if (poolDataTabSemFd == SEM_FAILED){ NZG_ERROR("sem_open : ouverture de la ressource", space->poolDataTabSemId); return -1; } sem_wait(poolDataTabSemFd); /* verifier le premier arg du shm_open */ poolDataTabFd=shm_open(space->poolDataTabId, O_RDWR, MSGSPACE_DEFAULT_MODE); if (poolDataTabFd == -1 ) { fprintf( stderr, "Allocate %s failed: %s\n", (char*)space->poolDataTabId, strerror( errno ) ); return -1; } poolDataTabAddr = mmap( NULL, (space->poolNb) * sizeof( msgPoolData ), PROT_READ | PROT_WRITE, MAP_SHARED, poolDataTabFd, 0 ); if( poolDataTabAddr == MAP_FAILED) { fprintf( stderr, "mmap failed: %s\n", strerror( errno ) ); return -1; } // TODO: verouiller semaphore DataInfo int err; 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 msgPoolDataTab */ munmap(poolDataTabAddr,(space->poolNb) * sizeof( msgPoolData )); close(poolDataTabFd); // deverouiller semaphore DataInfo sem_post(poolDataTabSemFd); sem_close(poolDataTabSemFd); // deverouiller semaphore ressource. msgPoolSemIdIntern(ressourceSemId,space->id,poolIndex); ressourceSemFd = sem_open(ressourceSemId,O_CREAT,SEM_DEFAULT_MODE,0); if (ressourceSemFd == SEM_FAILED){ NZG_ERROR("sem_open",ressourceSemId); return -1; } sem_post(ressourceSemFd); sem_close(ressourceSemFd); //sem_open ressource //sem_post //sem_close return 0; }