l3.libnazgul/src/get.c

77 lines
1.9 KiB
C
Raw Normal View History

2004-02-24 10:25:19 +00:00
#include "libnazgul.h"
#define NONBLOCK -1
void * msgGet(msgSpace * space,int queueIndex,int option){
void * resultAddr;
2004-02-24 11:01:18 +00:00
msgQueueId queueId;
msgQueue * queue;
msgQueueElemId oldElemId;
2004-02-25 08:48:23 +00:00
msgQueueElem * oldElem;
int poolIndex;
2004-02-24 10:25:19 +00:00
// on teste la possibilit<69> 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);
2004-02-24 10:34:06 +00:00
msgQueueIdIntern(queueId,space->externId,queueIndex);
// ouvrir la file
queue = msgQueueOpen(queueId);
// recup<75>rer l'id de l'ancien element...
2004-02-24 10:47:15 +00:00
msgQueueRem(queue, oldElemId);
2004-02-24 10:34:06 +00:00
2004-02-25 08:48:23 +00:00
oldElem = msgQueueElemOpen(oldElemId);
poolIndex=oldElem->poolIndex;
2004-02-24 11:15:06 +00:00
/* 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);
2004-02-24 11:01:18 +00:00
// mapper le buffer dans l'espace m<>moire du processus
2004-02-24 11:59:55 +00:00
/* 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) */
2004-02-25 08:48:23 +00:00
resultAddr = msgBufferMap(poolDataTab, poolIndex, 0);
if(resultAddr == NULL) {
NZG_ERROR("BufferMap", poolDataTab->poolId);
goto ERROR;
}
2004-02-24 11:15:06 +00:00
2004-02-25 08:48:23 +00:00
2004-02-24 11:01:18 +00:00
// attacher au buffer...
2004-02-25 08:48:23 +00:00
msgBufferAttachProc(poolDataTab,
poolIndex,
0, // c le buff en tete de file....
resultAddr);
2004-02-24 10:47:15 +00:00
2004-02-24 10:34:06 +00:00
// fermer la file
msgQueueClose(queue);
2004-02-24 10:25:19 +00:00
// on a fini de modifier la liste
msgQueueProtUnlock(space->externId,queueIndex);
return resultAddr;
ERROR:
return NULL;
}