*** empty log message ***

This commit is contained in:
glenux 2004-02-21 16:12:22 +00:00 committed by Glenn Y. Rolland
parent f76e0520a1
commit d5f53beab1
3 changed files with 53 additions and 46 deletions

View file

@ -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 */

View file

@ -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

View file

@ -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);