l3.libnazgul/src/free.c

64 lines
1.6 KiB
C
Raw Normal View History

2004-02-22 17:39:08 +00:00
#include "libnazgul.h"
int msgFree(msgSpace * space, void * addr){
2004-02-23 17:15:20 +00:00
printf("[ FREE 0x%08x ]\n",(int)addr);
2004-02-23 15:54:29 +00:00
int poolIndex;
int bufferIndex;
msgPoolData * poolDataTabAddr;
sem_t * ressourceSemFd;
2004-02-25 11:22:38 +00:00
msgPoolDataTabSemId ressourceSemId;
/* on acquiert le droit de modifier les infos sur la ressource */
2004-02-23 15:54:29 +00:00
/* on protege le tableau des associations */
2004-02-25 11:22:38 +00:00
if (msgPoolDataTabLock(space) <0){
NZG_ERROR("msgPoolDataTabLock",space->poolDataTabSemId);
goto ERROR;
};
2004-02-23 15:54:29 +00:00
/* verifier le premier arg du shm_open */
2004-02-23 23:19:04 +00:00
poolDataTabAddr = msgPoolDataTabOpen(space);
2004-02-23 15:54:29 +00:00
2004-02-25 11:22:38 +00:00
// TODO: verouiller semaphore DataInfo ??
2004-02-23 15:54:29 +00:00
int err;
2004-02-23 16:32:20 +00:00
poolIndex=-1; bufferIndex=-1;
2004-02-23 15:54:29 +00:00
err=msgBufferGetProcAttach(
poolDataTabAddr,
space->poolNb,
&poolIndex,
&bufferIndex,
addr
);
2004-02-23 16:32:20 +00:00
printf("Found : %d\n",err);
printf("Freing pool: %d, buffer: %d\n",poolIndex,bufferIndex);
2004-02-23 17:15:20 +00:00
msgBufferDetachProc(poolDataTabAddr,poolIndex,bufferIndex,addr);
2004-02-23 15:54:29 +00:00
/* unmapper le buffer */
void * realAddr=addr;
int bufferSize=poolDataTabAddr[poolIndex].bufferSize;
int bufferNb=poolDataTabAddr[poolIndex].bufferNb;
realAddr=realAddr-poolIndex*bufferSize;
munmap(realAddr,bufferSize*bufferNb);
2004-02-23 23:19:04 +00:00
msgPoolDataTabClose(space,poolDataTabAddr);
2004-02-23 15:54:29 +00:00
// deverouiller semaphore DataInfo
2004-02-24 09:54:05 +00:00
msgPoolDataTabUnlock(space);
2004-02-23 15:54:29 +00:00
// deverouiller semaphore ressource.
2004-02-25 21:28:11 +00:00
msgPoolSemIdIntern(ressourceSemId,space->externId,poolIndex);
2004-02-23 15:54:29 +00:00
ressourceSemFd = sem_open(ressourceSemId,O_CREAT,SEM_DEFAULT_MODE,0);
if (ressourceSemFd == SEM_FAILED){
NZG_ERROR("sem_open",ressourceSemId);
goto ERROR;
2004-02-23 15:54:29 +00:00
}
sem_post(ressourceSemFd);
sem_close(ressourceSemFd);
2004-02-23 16:22:44 +00:00
return 0;
ERROR:
return -1;
}
2004-02-22 17:39:08 +00:00