# include "libnazgul.h" /* pid[] liste process demandeurs */ int msgPoolCreate( msgSpacePoolId poolId, int buffNb, int buffSize ) { int poolFd; static int poolNb; msgSpacePoolId id; if (msgSpacePoolId2nzgPoolId(id,poolId,poolNb) == -1){ fprintf( stderr, "msgPoolId creation failed for id %s\n", (char*)poolId ); return -1; } poolFd=shm_open(id,O_RDWR|O_CREAT|O_EXCL|O_TRUNC,MSGSPACE_DEFAULT_MODE); if (poolFd == -1 ) { fprintf( stderr, "msgPool creation failed: %s\n", strerror( errno ) ); return -1; } // on met le pool a la taille voulue pour qu'il // puisse contenir les buffs if (ftruncate(poolFd, (buffSize*buffNb)) == -1){ fprintf( stderr, "msgPool resizing failed: %s\n", strerror( errno ) ); return -1; } close(poolFd); return 0; } int msgSpacePoolId2nzgPoolId(msgSpacePoolId dest,msgSpacePoolId src, int num){ if (strlen(src)>MSGSPACE_ID_LEN){ return -1; } #ifdef _NZG_REALFILEID sprintf(dest,"/tmp/nzgSpacePool%s%d",(char *)src,num); #else sprintf(dest,"/nzgSpacePool%s%d",(char *)src,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; }