*** empty log message ***
This commit is contained in:
parent
f76e0520a1
commit
d5f53beab1
3 changed files with 53 additions and 46 deletions
|
@ -15,25 +15,22 @@ 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);
|
||||
|
@ -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,39 +117,33 @@ 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 {
|
||||
selectedIdx=pool;
|
||||
}
|
||||
|
||||
if (!gotRessourceSem){
|
||||
strcpy(resultPoolId,mSPoolDataTab[selectedIdx].id);
|
||||
msgPoolSemIdIntern(ressourceSemId,space->id,selectedIdx);
|
||||
ressourceSemFd=sem_open(ressourceSemId,O_CREAT,SEM_DEFAULT_MODE,0);
|
||||
}
|
||||
|
||||
ressourceSemFd=sem_open(mSPoolDataTab[i].id,0);
|
||||
if (sem_wait(ressourceSemFd) < 0){
|
||||
perror("sem_wait");
|
||||
sem_close(ressourceSemFd);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
strncpy(resultPoolID,
|
||||
mSPoolDataTab[pool].id,
|
||||
MSGSPACE_ID_LEN*4
|
||||
);
|
||||
}
|
||||
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 libre dans l'esp addr du proc */
|
||||
|
||||
/* TODO: mapper le buffer dans l'esp addr du proc */
|
||||
sem_close(poolDataSemFd);
|
||||
|
||||
/* TODO: unmapper le msgPoolDataTab */
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue