diff --git a/src/allocate.c b/src/allocate.c new file mode 100644 index 0000000..59122db --- /dev/null +++ b/src/allocate.c @@ -0,0 +1,77 @@ +#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 + +msgAllocate(msgSpace *space, + int pool, + int taille, + int option=0 + ){ + + void * resultAddr; + int i; + msgPoolDataId resultPoolID; + 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; + + int + + 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; +}