*** empty log message ***
This commit is contained in:
parent
f76e0520a1
commit
d5f53beab1
3 changed files with 53 additions and 46 deletions
|
@ -15,26 +15,23 @@ 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);
|
||||||
if (mSPoolDataTabFd == -1 ) {
|
if (mSPoolDataTabFd == -1 ) {
|
||||||
|
@ -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,40 +117,34 @@ 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 dans l'esp addr du proc */
|
|
||||||
|
|
||||||
|
/* TODO: mapper le buffer libre dans l'esp addr du proc */
|
||||||
|
|
||||||
|
sem_close(poolDataSemFd);
|
||||||
|
|
||||||
/* TODO: unmapper le msgPoolDataTab */
|
/* TODO: unmapper le msgPoolDataTab */
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue