l3.libnazgul/src/put.c

70 lines
1.6 KiB
C

#include "libnazgul.h"
int msgPut(msgSpace * space,int queueIndex, void * addr){
// retrouver le pool, buffer qui correspondent à l'addresse...
msgPoolData * poolDataTabAddr;
int poolIndex;
int bufferIndex;
int err;
msgQueueElemId newElemId;
msgQueueElem * queueElem;
msgQueueId queueId;
msgQueue * queue;
msgPoolDataTabLock(space);
poolDataTabAddr=msgPoolDataTabOpen(space);
if (poolDataTabAddr == NULL){
NZG_ERROR("msgPoolDataTabOpen",space->poolDataTabId);
goto ERROR;
}
err=msgBufferGetProcAttach(
poolDataTabAddr,
space->poolNb,
&poolIndex,
&bufferIndex,
addr
);
// ouvrir la queue avec le bon index
msgQueueIdIntern(queueId,space->externId,queueIndex);
msgQueueProtLock(space->externId,queueIndex);
queue = msgQueueOpen(queueId);
// creer un element vide
msgQueueElemCreate(newElemId,queueId,queue->elemCounter);
// ouvrir l'element
queueElem=msgQueueElemOpen(newElemId);
// modifier les index pour retrouver le buffer
queueElem->poolIndex=poolIndex;
queueElem->bufferIndex=bufferIndex;
// fermer l'element
if (msgQueueElemClose(queueElem) <0 ){
NZG_ERROR("msgQueueElemClose","");
goto ERROR;
}
//ajouter le message a la bonne file...
if (msgQueueAdd(queue,newElemId) < 0){
NZG_ERROR("msgQueueAdd",newElemId);
goto ERROR;
}
// fermer la file
msgQueueClose(queue);
msgQueueProtUnlock(space->externId,queueIndex);
msgPoolDataTabClose(space,poolDataTabAddr);
msgPoolDataTabUnlock(space);
// on laisse une nouvelle ressource de la liste au get
msgQueueReadUnlock(space->externId,queueIndex);
return 0;
ERROR:
return -1;
}