From f76e0520a1e69ef6f3bbb84075c29b3dacafa5de Mon Sep 17 00:00:00 2001 From: glenux Date: Sat, 21 Feb 2004 14:46:24 +0000 Subject: [PATCH] *** empty log message *** --- src/nzg_allocate.c | 44 ++++++++++++++++++++++++++++++-------------- src/nzg_ids.c | 9 ++++++--- src/nzg_iface.h | 5 ++++- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/src/nzg_allocate.c b/src/nzg_allocate.c index bf7e657..a724c72 100644 --- a/src/nzg_allocate.c +++ b/src/nzg_allocate.c @@ -23,11 +23,18 @@ void * msgAllocate(msgSpace *space, * qui sera libéré le plus rapidement */ float semPoolCoef[space->poolNb]; int idxPoolOptimum; - bool gotSem; - sem_t * semFd; - int * sval; + + bool gotRessourceSem; + + msgPoolDataId poolDataId; + sem_t * poolDataSemFd; + + msgPoolDataSemId ressourceSemId; + sem_t * ressourceSemFd; + int * ressourceSemVal; float minPoolCoef; + /* TODO: verifier le premier arg du shm_open */ mSPoolDataTabFd=shm_open(space->poolDataId,O_RDWR,MSGSPACE_DEFAULT_MODE); if (mSPoolDataTabFd == -1 ) { @@ -49,7 +56,7 @@ void * msgAllocate(msgSpace *space, return NULL; } - gotSem=false; + gotRessourceSem=false; int gotIdx=-1; /* initialisation des coefs */ @@ -60,21 +67,22 @@ void * msgAllocate(msgSpace *space, int nbLockedSem=0; if ( pool == ANYPOOL){ // choisir le pool au hasard (ou presque) + poolDataSemFd=sem_open(space->poolDataSemId,0); for(i=0; i<(space->poolNb); i++) { if(mSPoolDataTab[i].bufferSize >= taille) { /* choisir le numero du semaphore en fonction du nombre de lock poses / nombre de buffer */ - semFd = sem_open(mSPoolDataTab[i].id,0); + ressourceSemFd = sem_open(mSPoolDataTab[i].id,0); /* on remplit le tableau avec les valeurs des semaphores */ - sem_getvalue(semFd, sval); - if ((*sval) < 0){ - semPoolCoef[nbLockedSem] = (float) (- (*sval) / mSPoolDataTab[i].bufferNb); + sem_getvalue(ressourceSemFd, ressourceSemVal); + if ((*ressourceSemVal) < 0){ + semPoolCoef[nbLockedSem] = (float) (- (*ressourceSemVal) / mSPoolDataTab[i].bufferNb); nbLockedSem++; } - if(sem_trywait(semFd)) { + if(sem_trywait(ressourceSemFd)) { /* choisir la 1ere pool de taille plus grande * libre si possible */ - gotSem=true; + gotRessourceSem=true; gotIdx=i; strcpy(resultPoolID,mSPoolDataTab[gotIdx].id); break; @@ -82,7 +90,7 @@ void * msgAllocate(msgSpace *space, } // if buffSize > taille } // for - if (!gotSem) { + if (!gotRessourceSem) { minPoolCoef= semPoolCoef[0]; idxPoolOptimum = 0; /* on cherche le pool avec le moins de lock poses / nbre de buffer @@ -99,7 +107,7 @@ void * msgAllocate(msgSpace *space, /* il n'y a aucune pool dont la taille satisfait la demande */ return NULL; } else { - if (sem_wait(semFd) < 0){ + if (sem_wait(ressourceSemFd) < 0){ perror("sem_wait"); } strncpy(resultPoolID, @@ -110,8 +118,8 @@ void * msgAllocate(msgSpace *space, } }else { - semFd=sem_open(mSPoolDataTab[i].id,0); - if (sem_wait(semFd) < 0){ + ressourceSemFd=sem_open(mSPoolDataTab[i].id,0); + if (sem_wait(ressourceSemFd) < 0){ perror("sem_wait"); } @@ -121,6 +129,14 @@ void * msgAllocate(msgSpace *space, ); } + /* on a acqui un semaphore pour la ressouce */ + /* on modifie maintenant les données */ + /* TODO: + dataRWsem=semOpen(,0); + sem_wait(dataRWsem); + sem_close(dataRWsem); + */ + /* trouver un buffer libre, ou dormir */ /* TODO: mapper le buffer dans l'esp addr du proc */ diff --git a/src/nzg_ids.c b/src/nzg_ids.c index 0a99ef0..928abbc 100644 --- a/src/nzg_ids.c +++ b/src/nzg_ids.c @@ -17,15 +17,18 @@ int msgSpaceIdIntern(msgSpaceId dest,const msgSpaceId src ){ return 0; } -int msgPoolSemIdIntern(msgSemId destSemId,const msgPoolDataId srcPoolId ){ +int msgPoolSemIdIntern( + msgPoolSemId destSemId, + const msgSpaceId srcPoolId, + int poolIdx){ if (strlen(srcPoolId)>MSGSPACE_ID_LEN*4){ return -1; } /* sprintf(resNzgId,"/tmp/.nzg-%s",(char *)spaceId); */ #ifdef _NZG_REALFILEID - sprintf(destSemId,"/tmp/nzgPoolData%s",(char *)srcPoolId); + sprintf(destSemId,"/tmp/nzgPoolSem%s-%d",(char *)srcPoolId,poolIdx); #else - sprintf(destSemId,"/nzgPoolData%s",(char *)srcPoolId); + sprintf(destSemId,"/nzgPoolSem%s-%d",(char *)srcPoolId,poolIdx); #endif return 0; } diff --git a/src/nzg_iface.h b/src/nzg_iface.h index a4f8b60..d0fe46b 100644 --- a/src/nzg_iface.h +++ b/src/nzg_iface.h @@ -11,8 +11,10 @@ typedef char msgSpaceListId[4*MSGSPACE_ID_LEN]; typedef char msgSpaceListElemId[4*MSGSPACE_ID_LEN]; typedef char msgPoolDataId[4*MSGSPACE_ID_LEN]; +typedef char msgPoolDataSemId[4*MSGSPACE_ID_LEN]; + typedef char msgPoolId[4*MSGSPACE_ID_LEN]; -typedef char msgSemId[4*MSGSPACE_ID_LEN]; +typedef char msgPoolSemId[4*MSGSPACE_ID_LEN]; typedef char msgQueueDataId[4*MSGSPACE_ID_LEN]; typedef char msgQueueId[4*MSGSPACE_ID_LEN]; @@ -41,6 +43,7 @@ typedef struct MsgSpace { int queueNb; int pid; msgPoolDataId poolDataId; + msgPoolDataSemId poolDataSemId; } msgSpace;