diff --git a/src/nzg_allocate.c b/src/nzg_allocate.c index a724c72..49e66b0 100644 --- a/src/nzg_allocate.c +++ b/src/nzg_allocate.c @@ -15,26 +15,23 @@ void * msgAllocate(msgSpace *space, int taille, int option ){ - - void * resultAddr; + void * resultAddr=NULL; int i, mSPoolDataTabFd; - msgPoolId resultPoolID; + 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 gotRessourceSem; - - msgPoolDataId poolDataId; - sem_t * poolDataSemFd; - + sem_t * poolDataSemFd=NULL; msgPoolDataSemId ressourceSemId; - sem_t * ressourceSemFd; - int * ressourceSemVal; + sem_t * ressourceSemFd=NULL; + int * ressourceSemVal=NULL; float minPoolCoef; - + int selectedIdx; + selectedIdx=-1; + /* TODO: verifier le premier arg du shm_open */ mSPoolDataTabFd=shm_open(space->poolDataId,O_RDWR,MSGSPACE_DEFAULT_MODE); if (mSPoolDataTabFd == -1 ) { @@ -57,7 +54,6 @@ void * msgAllocate(msgSpace *space, } gotRessourceSem=false; - int gotIdx=-1; /* initialisation des coefs */ for (i=0;i<(space->poolNb);i++){ @@ -67,26 +63,40 @@ void * msgAllocate(msgSpace *space, int nbLockedSem=0; if ( pool == ANYPOOL){ // choisir le pool au hasard (ou presque) - poolDataSemFd=sem_open(space->poolDataSemId,0); 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 */ - ressourceSemFd = sem_open(mSPoolDataTab[i].id,0); + msgPoolSemIdIntern(ressourceSemId,space->id,i); + ressourceSemFd = sem_open(ressourceSemId,O_CREAT,SEM_DEFAULT_MODE,0); + if (ressourceSemFd == SEM_FAILED){ +#warning "Gérer mieu les erreurs..." + perror("sem_open"); return NULL; + } /* on remplit le tableau avec les valeurs des semaphores */ - sem_getvalue(ressourceSemFd, ressourceSemVal); + + if (sem_getvalue(ressourceSemFd, ressourceSemVal) < 0){ +#warning "Gérer mieu les erreurs..." + perror("sem_getvalue"); return NULL; + } + if ((*ressourceSemVal) < 0){ - semPoolCoef[nbLockedSem] = (float) (- (*ressourceSemVal) / mSPoolDataTab[i].bufferNb); + /* il y a ressourceSemVal processus qui attendent déja... */ + semPoolCoef[nbLockedSem] = + (float) (- (*ressourceSemVal) / mSPoolDataTab[i].bufferNb); nbLockedSem++; } if(sem_trywait(ressourceSemFd)) { /* choisir la 1ere pool de taille plus grande * libre si possible */ gotRessourceSem=true; - gotIdx=i; - strcpy(resultPoolID,mSPoolDataTab[gotIdx].id); + selectedIdx=i; break; } + if( sem_close(ressourceSemFd) <0){ +#warning "Gérer mieu les erreurs..." + perror("sem_getvalue"); return NULL; + } } // if buffSize > taille } // for @@ -107,40 +117,34 @@ void * msgAllocate(msgSpace *space, /* il n'y a aucune pool dont la taille satisfait la demande */ return NULL; } else { - if (sem_wait(ressourceSemFd) < 0){ - perror("sem_wait"); - } - strncpy(resultPoolID, - mSPoolDataTab[idxPoolOptimum].id, - MSGSPACE_ID_LEN*4 - ); + selectedIdx=idxPoolOptimum; } } }else { - - ressourceSemFd=sem_open(mSPoolDataTab[i].id,0); - if (sem_wait(ressourceSemFd) < 0){ - perror("sem_wait"); - } - - strncpy(resultPoolID, - mSPoolDataTab[pool].id, - MSGSPACE_ID_LEN*4 - ); + selectedIdx=pool; } + if (!gotRessourceSem){ + strcpy(resultPoolId,mSPoolDataTab[selectedIdx].id); + msgPoolSemIdIntern(ressourceSemId,space->id,selectedIdx); + ressourceSemFd=sem_open(ressourceSemId,O_CREAT,SEM_DEFAULT_MODE,0); + } + + if (sem_wait(ressourceSemFd) < 0){ + perror("sem_wait"); + sem_close(ressourceSemFd); + return NULL; + } + + poolDataSemFd=sem_open(space->poolDataSemId,O_CREAT,SEM_DEFAULT_MODE,1); + /* on a acqui un semaphore pour la ressouce */ /* on modifie maintenant les données */ - /* TODO: - dataRWsem=semOpen(,0); - sem_wait(dataRWsem); - sem_close(dataRWsem); - */ - - /* trouver un buffer libre, ou dormir */ - - /* TODO: mapper le buffer dans l'esp addr du proc */ + /* TODO: mapper le buffer libre dans l'esp addr du proc */ + + sem_close(poolDataSemFd); + /* TODO: unmapper le msgPoolDataTab */ diff --git a/src/nzg_global.h b/src/nzg_global.h index ba58659..ece9009 100644 --- a/src/nzg_global.h +++ b/src/nzg_global.h @@ -13,6 +13,8 @@ #define PAGESIZE sysconf(_SC_PAGESIZE) #define MSGSPACE_DEFAULT_MODE 0600 +#define SEM_DEFAULT_MODE 0600 +#define SHM_DEFAULT_MODE 0600 #define MSGSPACE_ID_LEN 32 - +#define ERR_UNHANDLED "Gérer mieu les erreurs" #endif diff --git a/src/nzg_ids.h b/src/nzg_ids.h index 0fee49e..ef77d7e 100644 --- a/src/nzg_ids.h +++ b/src/nzg_ids.h @@ -6,7 +6,8 @@ /* nzg_ids.c */ int msgSpaceIdIntern(msgSpaceId dest, const msgSpaceId src); -int msgPoolDataIdIntern(msgSpaceId dest, const msgSpaceId src); +int msgPoolSemIdIntern(msgPoolSemId destSemId, const msgSpaceId srcPoolId, int poolIdx); +int msgPoolDataIdIntern(msgPoolDataId dest, const msgSpaceId src); int msgSpacePoolId2nzgPoolId(msgPoolId dest, msgPoolId src, int num);