#include "libnazgul.h" #define NONBLOCK -1 void * msgGet(msgSpace * space,int queueIndex,int option){ void * resultAddr; msgQueueId queueId; msgQueue * queue; msgQueueElemId oldElemId; msgQueueElem * oldElem; int poolIndex; // 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); poolIndex=oldElem->poolIndex; /* on récupere la taille des buffer dans la pool du buffer */ int bufferSize; msgPoolData * poolDataTab; poolDataTab=msgPoolDataTabOpen(space); bufferSize=poolDataTab[oldElem->poolIndex].bufferSize; msgPoolDataTabClose(space,poolDataTab); // mapper le buffer dans l'espace mémoire du processus /* resultAddr = mmap( NULL, bufferSize, PROT_NONE, //prot PROT_READ | PROT_WRITE MAP_SHARED, mSPoolFd, (off_t)0); bufferNb=mSPoolDataTabAddr[selectedPoolIndex].bufferNb; */ /* TODO: ecrire msgBufferMap(space,poolIndex,bufferIndex) */ resultAddr = msgBufferMap(poolDataTab, poolIndex, 0); if(resultAddr == NULL) { NZG_ERROR("BufferMap", poolDataTab->poolId); goto ERROR; } // attacher au buffer... msgBufferAttachProc(poolDataTab, poolIndex, 0, // c le buff en tete de file.... resultAddr); // fermer la file msgQueueClose(queue); // on a fini de modifier la liste msgQueueProtUnlock(space->externId,queueIndex); return resultAddr; ERROR: return NULL; }