l3.libnazgul/src/get.c
2004-03-07 12:26:42 +00:00

72 lines
1.8 KiB
C

#include "libnazgul.h"
#define NONBLOCK -1
void * msgGet(msgSpace * space,int queueIndex,int option){
void * resultAddr;
msgQueueId queueId;
msgQueue * queue;
msgQueueElemId oldElemId;
msgQueueElem * oldElem;
msgPoolData * poolDataTab;
// on teste la possibilité de lecture sur la liste...
if (option == NONBLOCK){
if (msgQueueReadTryLock(space->externId,queueIndex) <0){
NZG_ERROR("msgQueueReadTryLock",space->externId);
goto ERROR;
}
} else {
if (msgQueueReadLock(space->externId,queueIndex) <0){
NZG_ERROR("msgQueueReadLock",space->externId);
goto ERROR;
}
}
// la lecture est possible
// on essaye donc de modifier la liste
msgQueueProtLock(space->externId,queueIndex);
msgQueueIdIntern(queueId,space->externId,queueIndex);
// ouvrir la file
queue = msgQueueOpen(queueId);
if (queue==NULL){
NZG_ERROR("msgQueueOpen",queueId);
goto ERROR;
}
// recupérer l'id de l'ancien element...
msgQueueRem(queue, oldElemId);
oldElem = msgQueueElemOpen(oldElemId);
if (oldElem == NULL){
NZG_ERROR("msgQueueElemOpen",oldElemId);
goto ERROR;
}
/* on récupere la taille des buffer dans la pool du buffer */
poolDataTab=msgPoolDataTabOpen(space);
// mapper le buffer dans l'espace mémoire du processus
resultAddr=msgBufferMap(poolDataTab,oldElem->poolIndex,oldElem->bufferIndex);
// attacher au buffer...
if (msgBufferAttachProc(poolDataTab,
oldElem->poolIndex,
oldElem->bufferIndex,
resultAddr) <0){
NZG_ERROR("msgBufferAttachProc",oldElemId);
goto ERROR;
}
msgPoolDataTabClose(space,poolDataTab);
if (msgQueueElemClose(oldElem) <0){
NZG_ERROR("msgQueueElemClose",oldElemId);
}
shm_unlink(oldElemId);
// fermer la file
msgQueueClose(queue);
// on a fini de modifier la liste
msgQueueProtUnlock(space->externId,queueIndex);
return resultAddr;
ERROR:
return NULL;
}