l3.libnazgul/src/get.c

73 lines
1.8 KiB
C
Raw Normal View History

2004-02-24 10:25:19 +00:00
#include "libnazgul.h"
#define NONBLOCK -1
2020-03-03 23:06:43 +00:00
void *msgGet(msgSpace * space, int queueIndex, int option)
{
void *resultAddr;
msgQueueId queueId;
msgQueue *queue;
msgQueueElemId oldElemId;
msgQueueElem *oldElem;
msgPoolData *poolDataTab;
// 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;
}
2004-02-24 10:25:19 +00:00
}
2020-03-03 23:06:43 +00:00
// 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;
2004-02-24 10:25:19 +00:00
}
2020-03-03 23:06:43 +00:00
// recup<75>rer l'id de l'ancien element...
msgQueueRem(queue, oldElemId);
2004-02-24 10:34:06 +00:00
2020-03-03 23:06:43 +00:00
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;
}
2004-02-25 12:46:46 +00:00
2020-03-03 23:06:43 +00:00
msgPoolDataTabClose(space, poolDataTab);
if (msgQueueElemClose(oldElem) < 0) {
NZG_ERROR("msgQueueElemClose", oldElemId);
}
2004-02-25 08:50:44 +00:00
2020-03-03 23:06:43 +00:00
shm_unlink(oldElemId);
2004-02-24 11:15:06 +00:00
2020-03-03 23:06:43 +00:00
// fermer la file
msgQueueClose(queue);
2004-02-24 10:34:06 +00:00
2020-03-03 23:06:43 +00:00
// on a fini de modifier la liste
msgQueueProtUnlock(space->externId, queueIndex);
2004-02-24 10:25:19 +00:00
2020-03-03 23:06:43 +00:00
return resultAddr;
ERROR:
return NULL;
2004-02-24 10:25:19 +00:00
}