From 27633f3ab6cb714a5320b4eee9b44cf6bb96f8fa Mon Sep 17 00:00:00 2001 From: glenux Date: Fri, 20 Feb 2004 19:36:06 +0000 Subject: [PATCH] =?UTF-8?q?*=20code=20a=20int=C3=A9grer=20dans=20le=20rest?= =?UTF-8?q?e=20du=20proj=20(et=20virer=20le=20fichier)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/allocate.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 src/allocate.c 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; +}