#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; msgPoolId 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; i