From ea81bb7613ae969fd43da54b45812e525554c696 Mon Sep 17 00:00:00 2001 From: glenux Date: Thu, 26 Feb 2004 09:23:37 +0000 Subject: [PATCH] *** empty log message *** --- src/allocate.c | 3 --- src/get.c | 10 ++++++++-- src/proto.h | 4 ++-- src/queueDelete.c | 43 +++++++++++++++++++++++++------------------ src/queueElemDelete.c | 15 ++++++++++----- src/queueRem.c | 6 ++++-- src/spaceDelete.c | 23 ++++++++++++++--------- test/put_get_mono.c | 4 ++++ 8 files changed, 67 insertions(+), 41 deletions(-) diff --git a/src/allocate.c b/src/allocate.c index 5fd7093..5fdb8b9 100644 --- a/src/allocate.c +++ b/src/allocate.c @@ -183,9 +183,6 @@ if (mSPoolDataTabAddr==NULL){ /* mapper le buffer libre dans l'esp addr du proc */ strcpy(resultPoolId,mSPoolDataTabAddr[selectedPoolIndex].poolId); - -/* mSPoolFd=shm_open(resultPoolId,O_RDWR,MSGSPACE_DEFAULT_MODE); */ - int bufferFreeSize; bufferFreeSize=mSPoolDataTabAddr[selectedPoolIndex].bufferSize; printf("BufferSize : %d\n", bufferFreeSize); diff --git a/src/get.c b/src/get.c index 9006eed..0ecdec7 100644 --- a/src/get.c +++ b/src/get.c @@ -34,7 +34,10 @@ void * msgGet(msgSpace * space,int queueIndex,int option){ msgQueueRem(queue, oldElemId); oldElem = msgQueueElemOpen(oldElemId); - + if (oldElem == NULL){ + NZG_ERROR("msgQueueElemOpen",oldElemId); + goto ERROR; + } /* on récupere la taille des buffer dans la pool du buffer */ msgPoolData * poolDataTab; poolDataTab=msgPoolDataTabOpen(space); @@ -50,9 +53,12 @@ void * msgGet(msgSpace * space,int queueIndex,int option){ } msgPoolDataTabClose(space,poolDataTab); + if (msgQueueElemClose(oldElem) <0){ + NZG_ERROR("msgQueueElemClose",oldElemId); + } + shm_unlink(oldElemId); - // fermer la file msgQueueClose(queue); diff --git a/src/proto.h b/src/proto.h index 48937d7..7f302f9 100644 --- a/src/proto.h +++ b/src/proto.h @@ -57,7 +57,7 @@ int msgQueueAdd(msgQueue *queue, msgQueueElemId newElemId); /* queueClose.c */ int msgQueueClose(msgQueue *queue); /* queueDelete.c */ -int msgQueueElemDelete(msgQueueElemId queueElemId); +int msgQueueDelete(msgQueueId externId, int queueIdx); /* queueElemClose.c */ int msgQueueElemClose(msgQueueElem *queueElem); /* queueElemCreate.c */ @@ -108,7 +108,7 @@ int msgSpaceListUnlock(void); /* spaceListOpen.c */ void *msgSpaceListOpen(void); /* spaceListRem.c */ -int msgSpaceListRem(msgSpaceListElemId oldElemId); +int msgSpaceListRem(msgSpaceId spaceId); /* spaceOpen.c */ msgSpace *msgSpaceOpen(msgSpaceId externId); /* state.c */ diff --git a/src/queueDelete.c b/src/queueDelete.c index cb3c6d7..b6ff4d3 100644 --- a/src/queueDelete.c +++ b/src/queueDelete.c @@ -1,26 +1,33 @@ #include "libnazgul.h" -int msgQueueElemDelete(msgQueueElemId queueElemId){ - msgQueueElem * queueElemAddr; - msgQueueElemId nextIdToDie; +int msgQueueDelete(msgQueueId externId,int queueIdx){ + msgQueue * queue; + msgQueueId queueId; - - queueElemAddr = msgQueueElemOpen(queueElemId); - strcpy(nextIdToDie,queueElemAddr->id); - msgQueueElemClose(queueElemAddr); - - if (shm_unlink(queueElemId) < 0){ - NZG_ERROR("shm_unlink msgQueueElem",queueElemId); - goto ERROR; + msgQueueIdIntern(queueId,externId,queueIdx); + queue = msgQueueOpen(queueId); + + if (strcmp(queue->headId,queue->id)!=0){ + // liste non-vide + if (msgQueueElemDelete(queue->headId) <0){ + NZG_ERROR("msgQueueElemDelete",queue->headId); + goto ERROR; + } + } + + msgQueueSemId queueProtLockSemId; + msgQueueSemId queueReadLockSemId; + msgQueueProtSemIdIntern(queueProtLockSemId,externId,queueIdx); + msgQueueReadSemIdIntern(queueReadLockSemId,externId,queueIdx); + sem_unlink(queueProtLockSemId); + sem_unlink(queueReadLockSemId); + + if (shm_unlink(queueId) < 0){ + NZG_ERROR("shm_unlink msgQueueElem",queueId); + goto ERROR; } - if (strcmp(nextIdToDie,queueElemId)==0){ - return 0; - } else { - return msgQueueElemDelete(nextIdToDie); - } - - + return 0; ERROR: return -1; } diff --git a/src/queueElemDelete.c b/src/queueElemDelete.c index d4fc4f2..79a60f3 100644 --- a/src/queueElemDelete.c +++ b/src/queueElemDelete.c @@ -1,25 +1,30 @@ #include "libnazgul.h" int msgQueueElemDelete(msgQueueElemId queueElemId){ - msgQueueElem * queueElemAddr; + msgQueueElem * queueElem; msgQueueElemId nextIdToDie; - queueElemAddr = msgQueueElemOpen(queueElemId); - if (queueElemAddr==NULL){ + queueElem = msgQueueElemOpen(queueElemId); + if (queueElem==NULL){ NZG_ERROR("msgQueueElemOpen",queueElemId); goto ERROR; } - strcpy(nextIdToDie, queueElemAddr->next); + strcpy(nextIdToDie, queueElem->next); - if (msgQueueElemClose(queueElemAddr) < 0){ + if (msgQueueElemClose(queueElem) < 0){ NZG_ERROR("msgQueueElemClose",queueElemId); goto ERROR; } + // on détruit l'élément + shm_unlink(queueElemId); + if (nextIdToDie != queueElemId){ return msgQueueElemDelete(nextIdToDie); } else { + printf("msgQueueElemDelete: EOL reached \n"); + // element unique... return 0; } diff --git a/src/queueRem.c b/src/queueRem.c index d35b2cf..ff62839 100644 --- a/src/queueRem.c +++ b/src/queueRem.c @@ -20,6 +20,9 @@ int msgQueueRem(msgQueue * queue, msgQueueElemId oldElemId){ // on indique à la queue le nouveau premier element strcpy(queue->headId,queueOldHeadElem->next); + if (strcmp(queueOldHeadElem->next,oldElemId)==0){ + strcpy(queue->headId,queue->id); + } // on fait en sorte que l'element ne connaisse plus // ses voisins (utile pour le Delete) strcpy(queueOldHeadElem->next,queueOldHeadElem->id); @@ -29,8 +32,7 @@ int msgQueueRem(msgQueue * queue, msgQueueElemId oldElemId){ goto ERROR; } - - return 0; + return 0; ERROR: return -1; } diff --git a/src/spaceDelete.c b/src/spaceDelete.c index 8d3319a..16acfce 100644 --- a/src/spaceDelete.c +++ b/src/spaceDelete.c @@ -14,23 +14,28 @@ int msgSpaceDelete(msgSpaceId externId){ msgSpace * space; int i; if (msgSpaceIdIntern(nzgId,externId) == -1){ - //TODO: message d'erreur - return -1; + NZG_ERROR("msgSpaceIdIntern",externId); + goto ERROR; } space = msgSpaceOpen(externId); - /* TODO: supprimer chaque pool */ - for (i=0;ipoolNb;i++){ - msgPoolDelete(externId,i); - } + /* supprimer chaque pool */ + for (i=0;ipoolNb;i++){ + msgPoolDelete(externId,i); + } + + /* supprimer chaque queue */ + for (i=0;iqueueNb;i++){ + msgQueueDelete(externId,i); + } printf("openned successfully !\n"); printf("Unlinking DataTab... "); if (shm_unlink(space->poolDataTabId) < 0){ - perror("shm_unlink"); + perror("shm_unlink"); return -1; } printf("ok\n"); - + printf("Unlinking DataTabSem... "); if (sem_unlink(space->poolDataTabSemId) < 0){ NZG_ERROR("sem_unlink",space->poolDataTabSemId); @@ -46,7 +51,7 @@ int msgSpaceDelete(msgSpaceId externId){ NZG_ERROR("msgSpaceListLock",""); goto ERROR; } - + if (msgSpaceListRem(nzgId) < 0){ NZG_ERROR("msgSpaceListRem",nzgId); goto ERROR; diff --git a/test/put_get_mono.c b/test/put_get_mono.c index 92afea8..d450df4 100644 --- a/test/put_get_mono.c +++ b/test/put_get_mono.c @@ -28,6 +28,8 @@ int main(void) { printf("CREATION ------------------ ok\n"); mSPAC=msgSpaceOpen(testId); + + /***** TEST 1 *****/ montext=msgAllocate(mSPAC,1,280,0); *montext=42; printf("### test Valeur0 %d ###\n",(int)*montext); @@ -40,6 +42,8 @@ int main(void) { montext=msgGet(mSPAC,0,0); printf("get-ok\n"); printf("### test Reception %d ###\n",(int)*montext); + msgFree(mSPAC,montext); + /***** TEST 1 *****/ msgSpaceDelete(testId); return 0; }