diff --git a/src/allocate.c b/src/allocate.c deleted file mode 100644 index c93dc06..0000000 --- a/src/allocate.c +++ /dev/null @@ -1,102 +0,0 @@ -#include "libnazgul.h" - - -/* TODO: remplacer le bool de msgPoolData par un identifiant - de semaphore. Le semaphore contient poolNb valeurs (et indique - donc le nombre de ressources disponnibles). - - */ - -#define ANYPOOL -1 -#define SPECIFICPOOL 0 - -void * msgAllocate(msgSpace *space, - int pool, - int taille, - int option - ){ - - void * resultAddr; - int i, mSPoolDataTabFd; - 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; - - /* 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; - } - - msgPoolData * mSPoolDataTab; - - mSPoolDataTab = mmap( 0, (space->poolNb) * sizeof( msgPoolData ), - PROT_READ | PROT_WRITE, - MAP_SHARED, mSPoolDataTabFd, 0 ); - - if( mSPoolDataTab == MAP_FAILED) { - fprintf( stderr, "mmap failed: %s\n", - strerror( errno ) ); - return NULL; - } - - 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(mSPoolDataTab[i].bufferSize >= taille) { - /* TODO: choisir le numero du semaphore - en fonction du nombre de lock poses / nombre de buffer */ - 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); - } - } - - 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; - - } - - - /* TODO: trouver un buffer libre, ou dormir */ - - /* TODO: mapper le buffer dans l'esp addr du proc */ - - /* TODO: unmapper le msgPoolDataTab */ - - - return resultAddr; -} diff --git a/src/nzg_allocate.c b/src/nzg_allocate.c new file mode 100644 index 0000000..08236b3 --- /dev/null +++ b/src/nzg_allocate.c @@ -0,0 +1,131 @@ +#include "libnazgul.h" +#include "nzg_ids.h" + +/* TODO: remplacer le bool de msgPoolData par un identifiant + de semaphore. Le semaphore contient poolNb valeurs (et indique + donc le nombre de ressources disponnibles). + +*/ + +#define ANYPOOL -1 +#define SPECIFICPOOL 0 + +void * msgAllocate(msgSpace *space, + int pool, + int taille, + int option + ){ + + void * resultAddr; + int i, mSPoolDataTabFd; + msgSpacePoolId resultPoolID; + /* tableau des valeurs des semPoolCoef/pool pour identifier le pool + * qui sera libéré le plus rapidement */ + float semPoolCoef[space->poolNb]; + int idxPoolOptimum; + bool gotSem; + sem_t * semFd; + int * sval; + float minPoolCoef; + + /* 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; + } + + msgPoolData * mSPoolDataTab; + + mSPoolDataTab = mmap( 0, (space->poolNb) * sizeof( msgPoolData ), + PROT_READ | PROT_WRITE, + MAP_SHARED, mSPoolDataTabFd, 0 ); + + if( mSPoolDataTab == MAP_FAILED) { + fprintf( stderr, "mmap failed: %s\n", + strerror( errno ) ); + return NULL; + } + + gotSem=false; + int gotIdx=-1; + + /* initialisation des coefs */ + for (i=0;i<(space->poolNb);i++){ + semPoolCoef[i]=-1; + } + + int nbLockedSem=0; + if ( pool == ANYPOOL){ + // choisir le pool au hasard (ou presque) + 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); + /* on remplit le tableau avec les valeurs des semaphores */ + sem_getvalue(semFd, sval); + if ((*sval) < 0){ + semPoolCoef[nbLockedSem] = (float) (- (*sval) / mSPoolDataTab[i].bufferNb); + nbLockedSem++; + } + if(sem_trywait(semFd)) { + /* choisir la 1ere pool de taille plus grande + * libre si possible */ + gotSem=true; + gotIdx=i; + strcpy(resultPoolID,mSPoolDataTab[gotIdx].id); + break; + } + } // if buffSize > taille + } // for + + if (!gotSem) { + minPoolCoef= semPoolCoef[0]; + idxPoolOptimum = 0; + /* on cherche le pool avec le moins de lock poses / nbre de buffer + * le numéro du pool est stocké dans idxPoolOptimum */ + for(i=0; iMSGSPACE_ID_LEN){ - return -1; - } -#ifdef _NZG_REALFILEID - sprintf(dest,"/tmp/nzgSpacePool%s%d",(char *)src,num); -#else - sprintf(dest,"/nzgSpacePool%s%d",(char *)src,num); -#endif - return 0; -} diff --git a/src/nzg_spaces.c b/src/nzg_spaces.c index 1692ba9..ab7e521 100644 --- a/src/nzg_spaces.c +++ b/src/nzg_spaces.c @@ -1,4 +1,5 @@ #include "libnazgul.h" +#include "nzg_ids.h" /* prototypes des f#define MSGSPACE_DEFAULT_MODE 0600 #define MSGSPACE_ID_LEN 32 @@ -170,28 +171,3 @@ int msgSpaceDelete(msgSpaceId spaceId){ return 0; } -int msgSpaceIdIntern(msgSpaceId dest,const msgSpaceId src ){ - if (strlen(src)>MSGSPACE_ID_LEN){ - return -1; - } - /* sprintf(resNzgId,"/tmp/.nzg-%s",(char *)spaceId); */ -#ifdef _NZG_REALFILEID - sprintf(dest,"/tmp/nzgSpace%s",(char *)src); -#else - sprintf(dest,"/nzgSpace%s",(char *)src); -#endif - return 0; -} - -int msgPoolDataIdIntern(msgSpaceId dest,const msgSpaceId src ){ - if (strlen(src)>MSGSPACE_ID_LEN){ - return -1; - } - /* sprintf(resNzgId,"/tmp/.nzg-%s",(char *)spaceId); */ -#ifdef _NZG_REALFILEID - sprintf(dest,"/tmp/nzgSpacePoolData%s",(char *)src); -#else - sprintf(dest,"/nzgSpacePoolData%s",(char *)src); -#endif - return 0; -}