From 347995e6febb2383a6c3de94a3bfa5d28aae5afd Mon Sep 17 00:00:00 2001 From: stormrider1982 Date: Sat, 21 Feb 2004 00:03:35 +0000 Subject: [PATCH] on progresse ;) --- src/allocate.c | 63 +++++++++++++++++++++++++++++++++++--------------- src/nzg_pool.c | 2 +- 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/src/allocate.c b/src/allocate.c index 5358d41..c93dc06 100644 --- a/src/allocate.c +++ b/src/allocate.c @@ -13,18 +13,21 @@ void * msgAllocate(msgSpace *space, int pool, int taille, - int option=0 + int option ){ void * resultAddr; int i, mSPoolDataTabFd; - msgPoolDataId resultPoolID; + msgSpacePoolId resultPoolID; + float sems[space->poolNb]; /* tableau des valeurs des sems/pool pour identifier le pool + qui sera libéré le plus rapidement */ sem_t * sem; - mSPoolDataTabFd=shm_open(space->msgPoolDataTabID,O_RDWR,MSGSPACE_DEFAULT_MODE); - if (mSFd == -1 ) { - fprintf( stderr, "msgSpace %s creation failed: %s\n", - (char*)nzgId, + /* TODO: verifier le premier arg du shm_open */ + mSPoolDataTabFd=shm_open(space->poolDataId,O_RDWR,MSGSPACE_DEFAULT_MODE); + if (mSPoolDataTabFd == -1 ) { + fprintf( stderr, "Allocate %s failed: %s\n", + (char*)space->poolDataId, strerror( errno ) ); return NULL; } @@ -43,25 +46,45 @@ void * msgAllocate(msgSpace *space, bool gotSem=false; int gotIdx=-1; - + int * sval; + if (pool == ANYPOOL){ /* se debrouiller pour choisir la 1ere pool de taille plus grande libre si possible */ for(i=0; i<(space->poolNb); i++) { - if(msgPoolDataTab[i].bufferSize >= taille) { + if(mSPoolDataTab[i].bufferSize >= taille) { /* TODO: choisir le numero du semaphore en fonction du nombre de lock poses / nombre de buffer */ - - gotIdx=i; - if(sem_trywait(sem)) { - gotSem=true; - break; + sem = sem_open(mSPoolDataTab[i]->id,O_CREAT); + gotIdx=i; + if(sem_trywait(sem)) { + gotSem=true; + resultPoolID=mSPoolDataTab[gotIdx]->id; + break; + } + else { + + // on remplit le tableau avec les valeurs des semaphores + sem_getvalue(sem, sval); + sems[i] = (float*)sval / (mSPoolDataTab[i]->bufferNb); + } } - } - } - resultPoolID=mSPoolDataTab[i]->id; - } else { + + if(!gotSem) { + float min = sems[0]; + int idxPoolOptimum; + // on cherche le pool avec le moins de lock poses / nbre de buffer + for(i=1; i<(space->poolNb); i++) { + if(sems[i] < min) { + min = sems[i]; + idxPoolOptimum = i; + } + } + resultPoolID=mSPoolDataTab[idxPoolOptimum]->id; + } + } + }else { resultPoolID=mSPoolDataTab[pool]->id; @@ -70,8 +93,10 @@ void * msgAllocate(msgSpace *space, /* TODO: trouver un buffer libre, ou dormir */ - /* mapper le buffer dans l'esp addr du proc */ + /* TODO: mapper le buffer dans l'esp addr du proc */ /* TODO: unmapper le msgPoolDataTab */ -return resultAddr; + + + return resultAddr; } diff --git a/src/nzg_pool.c b/src/nzg_pool.c index 7924d4c..8c7396a 100644 --- a/src/nzg_pool.c +++ b/src/nzg_pool.c @@ -28,7 +28,7 @@ int msgPoolCreate( } // on met un semaphore sur le pool - sem = sem_open(id, O_CREAT|O_EXCL, poolNb); + sem = sem_open(id, O_CREAT|O_EXCL, 0666, buffNb); // on met le pool a la taille voulue pour qu'il // puisse contenir les buffs