From d63bce6b91072b6b194882c175a12d5c6306e7e9 Mon Sep 17 00:00:00 2001 From: stormrider1982 Date: Fri, 20 Feb 2004 21:47:08 +0000 Subject: [PATCH] et voila les semaphores qui pointent le bout de leur nez ;) --- src/allocate.c | 14 ++++++------- src/nzg_iface.h | 2 +- src/nzg_pool.c | 55 ++++--------------------------------------------- 3 files changed, 12 insertions(+), 59 deletions(-) diff --git a/src/allocate.c b/src/allocate.c index 59122db..5358d41 100644 --- a/src/allocate.c +++ b/src/allocate.c @@ -10,18 +10,18 @@ #define ANYPOOL -1 #define SPECIFICPOOL 0 -msgAllocate(msgSpace *space, +void * msgAllocate(msgSpace *space, int pool, int taille, int option=0 ){ void * resultAddr; - int i; + int i, mSPoolDataTabFd; msgPoolDataId resultPoolID; - mSPoolDataTabFd=shm_open( - - space->msgPoolDataTabID,O_RDWR,MSGSPACE_DEFAULT_MODE); + sem_t * sem; + + mSPoolDataTabFd=shm_open(space->msgPoolDataTabID,O_RDWR,MSGSPACE_DEFAULT_MODE); if (mSFd == -1 ) { fprintf( stderr, "msgSpace %s creation failed: %s\n", (char*)nzgId, @@ -44,7 +44,6 @@ msgAllocate(msgSpace *space, bool gotSem=false; int gotIdx=-1; - int if (pool == ANYPOOL){ /* se debrouiller pour choisir la 1ere pool @@ -53,7 +52,7 @@ msgAllocate(msgSpace *space, if(msgPoolDataTab[i].bufferSize >= taille) { /* TODO: choisir le numero du semaphore en fonction du nombre de lock poses / nombre de buffer */ - + gotIdx=i; if(sem_trywait(sem)) { gotSem=true; @@ -68,6 +67,7 @@ msgAllocate(msgSpace *space, } + /* TODO: trouver un buffer libre, ou dormir */ /* mapper le buffer dans l'esp addr du proc */ diff --git a/src/nzg_iface.h b/src/nzg_iface.h index b2fde63..486f20e 100644 --- a/src/nzg_iface.h +++ b/src/nzg_iface.h @@ -27,7 +27,7 @@ typedef struct MsgPoolData { int bufferNb; int bufferSize; int allocDispBuffer; - bool allocOverload; + sem_t * allocOverload; } msgPoolData; /* TODO: queueId */ diff --git a/src/nzg_pool.c b/src/nzg_pool.c index 114d9ec..7924d4c 100644 --- a/src/nzg_pool.c +++ b/src/nzg_pool.c @@ -12,6 +12,7 @@ int msgPoolCreate( int poolFd; static int poolNb; msgSpacePoolId id; + sem_t * sem; if (msgSpacePoolId2nzgPoolId(id,poolId,poolNb) == -1){ fprintf( stderr, "msgPoolId creation failed for id %s\n", @@ -26,6 +27,9 @@ int msgPoolCreate( return -1; } + // on met un semaphore sur le pool + sem = sem_open(id, O_CREAT|O_EXCL, poolNb); + // on met le pool a la taille voulue pour qu'il // puisse contenir les buffs if (ftruncate(poolFd, (buffSize*buffNb)) == -1){ @@ -50,54 +54,3 @@ int msgSpacePoolId2nzgPoolId(msgSpacePoolId dest,msgSpacePoolId src, int num){ #endif return 0; } - -//TODO: msgPoolAllocate -// //donne l'adr en mappant in the memory - //poolAddr = mmap(NULL, sizeof(*msgPool), PROT_NONE, MAP_SHARED, poolFd, 0); - -msgPool * msgPoolAllocate(int poolIdx, msgSpace *msg) { - msgPool * poolAddr; - //msgSpacePoolDataId dataId; - msgPoolData * poolData; - int i, buffSize, poolId; - sem_t * sem; - - poolId = -1; - - // TODO:récupérer l'id du poolData dans le msgSpace - // détacher le morceau de mémoire du processus - - //dataId = msg->poolDataId; - - // TODO:récupérer le poolData qui correspond à notre poolIdx. - // attacher la zone mémoire correspondant à l'Id - // utiliser des sémaphores pour vérouiller les acces en modif - // sur la poolData de notre - - buffSize = poolData[poolIdx].bufferSize; - if(poolData[poolIdx].allocOverload == 1) { - for(i=0; i<128; i++) { - if( (poolData[i].allocOverload != 1) - && (poolData[i].bufferSize >= buffSize) ) { - buffSize = poolData[i].bufferSize; - poolId = i; - } - } - } - - //donne l'adr en mappant in the memory - //GYR:poolAddr = mmap(NULL, sizeof(*msgPool), PROT_NONE, MAP_SHARED, poolFd, 0); - if(poolAddr == MAP_FAILED) { - fprintf( stderr, "mmap failed: %s\n", strerror( errno ) ); - return NULL; - } - - // semaphores - sem = sem_open(poolData[(poolId != -1)?poolId:poolIdx].id, O_CREAT|O_EXCL, 0); - sem_wait(sem); - - // on renvoie le pointeur sur le bon pool - return poolAddr; -} - -