#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=0 ){ void * resultAddr; int i, mSPoolDataTabFd; msgPoolDataId resultPoolID; 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, 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; 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) { /* 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; } } } resultPoolID=mSPoolDataTab[i]->id; } else { resultPoolID=mSPoolDataTab[pool]->id; } /* TODO: trouver un buffer libre, ou dormir */ /* mapper le buffer dans l'esp addr du proc */ /* TODO: unmapper le msgPoolDataTab */ return resultAddr; }