*** empty log message ***

This commit is contained in:
glenux 2004-02-21 16:12:22 +00:00
parent ad523d005a
commit 70fbb3902c
3 changed files with 53 additions and 46 deletions

View file

@ -15,25 +15,22 @@ void * msgAllocate(msgSpace *space,
int taille, int taille,
int option int option
){ ){
void * resultAddr=NULL;
void * resultAddr;
int i, mSPoolDataTabFd; int i, mSPoolDataTabFd;
msgPoolId resultPoolID; msgPoolId resultPoolId;
/* tableau des valeurs des semPoolCoef/pool pour identifier le pool /* tableau des valeurs des semPoolCoef/pool pour identifier le pool
* qui sera libéré le plus rapidement */ * qui sera libéré le plus rapidement */
float semPoolCoef[space->poolNb]; float semPoolCoef[space->poolNb];
int idxPoolOptimum; int idxPoolOptimum;
bool gotRessourceSem; bool gotRessourceSem;
sem_t * poolDataSemFd=NULL;
msgPoolDataId poolDataId;
sem_t * poolDataSemFd;
msgPoolDataSemId ressourceSemId; msgPoolDataSemId ressourceSemId;
sem_t * ressourceSemFd; sem_t * ressourceSemFd=NULL;
int * ressourceSemVal; int * ressourceSemVal=NULL;
float minPoolCoef; float minPoolCoef;
int selectedIdx;
selectedIdx=-1;
/* TODO: verifier le premier arg du shm_open */ /* TODO: verifier le premier arg du shm_open */
mSPoolDataTabFd=shm_open(space->poolDataId,O_RDWR,MSGSPACE_DEFAULT_MODE); mSPoolDataTabFd=shm_open(space->poolDataId,O_RDWR,MSGSPACE_DEFAULT_MODE);
@ -57,7 +54,6 @@ void * msgAllocate(msgSpace *space,
} }
gotRessourceSem=false; gotRessourceSem=false;
int gotIdx=-1;
/* initialisation des coefs */ /* initialisation des coefs */
for (i=0;i<(space->poolNb);i++){ for (i=0;i<(space->poolNb);i++){
@ -67,26 +63,40 @@ void * msgAllocate(msgSpace *space,
int nbLockedSem=0; int nbLockedSem=0;
if ( pool == ANYPOOL){ if ( pool == ANYPOOL){
// choisir le pool au hasard (ou presque) // choisir le pool au hasard (ou presque)
poolDataSemFd=sem_open(space->poolDataSemId,0);
for(i=0; i<(space->poolNb); i++) { for(i=0; i<(space->poolNb); i++) {
if(mSPoolDataTab[i].bufferSize >= taille) { if(mSPoolDataTab[i].bufferSize >= taille) {
/* choisir le numero du semaphore /* choisir le numero du semaphore
en fonction du nombre de lock poses / nombre de buffer */ 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 */ /* 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){ 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++; nbLockedSem++;
} }
if(sem_trywait(ressourceSemFd)) { if(sem_trywait(ressourceSemFd)) {
/* choisir la 1ere pool de taille plus grande /* choisir la 1ere pool de taille plus grande
* libre si possible */ * libre si possible */
gotRessourceSem=true; gotRessourceSem=true;
gotIdx=i; selectedIdx=i;
strcpy(resultPoolID,mSPoolDataTab[gotIdx].id);
break; break;
} }
if( sem_close(ressourceSemFd) <0){
#warning "Gérer mieu les erreurs..."
perror("sem_getvalue"); return NULL;
}
} // if buffSize > taille } // if buffSize > taille
} // for } // for
@ -107,39 +117,33 @@ void * msgAllocate(msgSpace *space,
/* il n'y a aucune pool dont la taille satisfait la demande */ /* il n'y a aucune pool dont la taille satisfait la demande */
return NULL; return NULL;
} else { } else {
if (sem_wait(ressourceSemFd) < 0){ selectedIdx=idxPoolOptimum;
perror("sem_wait");
}
strncpy(resultPoolID,
mSPoolDataTab[idxPoolOptimum].id,
MSGSPACE_ID_LEN*4
);
} }
} }
}else { }else {
selectedIdx=pool;
ressourceSemFd=sem_open(mSPoolDataTab[i].id,0);
if (sem_wait(ressourceSemFd) < 0){
perror("sem_wait");
}
strncpy(resultPoolID,
mSPoolDataTab[pool].id,
MSGSPACE_ID_LEN*4
);
} }
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 a acqui un semaphore pour la ressouce */
/* on modifie maintenant les données */ /* 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 libre dans l'esp addr du proc */
/* TODO: mapper le buffer dans l'esp addr du proc */ sem_close(poolDataSemFd);
/* TODO: unmapper le msgPoolDataTab */ /* TODO: unmapper le msgPoolDataTab */

View file

@ -13,6 +13,8 @@
#define PAGESIZE sysconf(_SC_PAGESIZE) #define PAGESIZE sysconf(_SC_PAGESIZE)
#define MSGSPACE_DEFAULT_MODE 0600 #define MSGSPACE_DEFAULT_MODE 0600
#define SEM_DEFAULT_MODE 0600
#define SHM_DEFAULT_MODE 0600
#define MSGSPACE_ID_LEN 32 #define MSGSPACE_ID_LEN 32
#define ERR_UNHANDLED "Gérer mieu les erreurs"
#endif #endif

View file

@ -6,7 +6,8 @@
/* nzg_ids.c */ /* nzg_ids.c */
int msgSpaceIdIntern(msgSpaceId dest, const msgSpaceId src); 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); int msgSpacePoolId2nzgPoolId(msgPoolId dest, msgPoolId src, int num);