66 lines
1.6 KiB
C
66 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;
|
|
}
|
|
|