53 lines
1.4 KiB
C
53 lines
1.4 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;
|
|
// 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);
|
|
|
|
// recupérer l'id de l'ancien element...
|
|
msgQueueRem(queue, oldElemId);
|
|
|
|
oldElem = msgQueueElemOpen(oldElemId);
|
|
|
|
/* on récupere la taille des buffer dans la pool du buffer */
|
|
msgPoolData * poolDataTab;
|
|
poolDataTab=msgPoolDataTabOpen(space);
|
|
// mapper le buffer dans l'espace mémoire du processus
|
|
resultAddr=msgBufferMap(poolDataTab,oldElem->poolIndex,oldElem->bufferIndex);
|
|
msgPoolDataTabClose(space,poolDataTab);
|
|
|
|
// attacher au buffer...
|
|
|
|
// fermer la file
|
|
msgQueueClose(queue);
|
|
|
|
// on a fini de modifier la liste
|
|
msgQueueProtUnlock(space->externId,queueIndex);
|
|
|
|
return resultAddr;
|
|
ERROR:
|
|
return NULL;
|
|
}
|