diff --git a/src/nzg_global.h b/src/nzg_global.h index 57f26ab..7daaa20 100644 --- a/src/nzg_global.h +++ b/src/nzg_global.h @@ -11,5 +11,7 @@ #include #define PAGESIZE sysconf(_SC_PAGESIZE) +#define MSGSPACE_DEFAULT_MODE 0600 +#define MSGSPACE_ID_LEN 32 #endif diff --git a/src/nzg_iface.h b/src/nzg_iface.h index 33fff99..9462421 100644 --- a/src/nzg_iface.h +++ b/src/nzg_iface.h @@ -1,11 +1,7 @@ #ifndef _NZG_IFACE #define _NZG_IFACE 1 - #include "nzg_global.h" -#define MSGSPACE_DEFAULT_MODE 0600 -#define MSGSPACE_ID_LEN 32 - typedef char msgSpaceId[MSGSPACE_ID_LEN]; typedef char msgSpaceListId[4*MSGSPACE_ID_LEN]; @@ -19,12 +15,17 @@ typedef char msgSpaceQueueId[4*MSGSPACE_ID_LEN]; /* pid[] */ /* liste des processus demandeurs */ typedef struct MsgPool { + int bufferSize; + int bufferNb; +} msgPool; + +typedef struct MsgPoolData { msgSpacePoolId id; int bufferNb; int bufferSize; int allocDispBuffer; int allocOverload; -} msgPool; +} msgPoolData; /* TODO: queueId */ diff --git a/src/nzg_pool.c b/src/nzg_pool.c index af0fc8e..5301652 100644 --- a/src/nzg_pool.c +++ b/src/nzg_pool.c @@ -55,9 +55,17 @@ int msgSpacePoolId2nzgPoolId(msgSpacePoolId dest,msgSpacePoolId src, int num){ // //donne l'adr en mappant in the memory //poolAddr = mmap(NULL, sizeof(*msgPool), PROT_NONE, MAP_SHARED, poolFd, 0); -msgPool * msgPoolAllocate(int poolFd, msgSpace *msg) { +msgPool * msgPoolAllocate(int poolIdx, msgSpace *msg) { msgPool * poolAddr; int dataId; + + // TODO:récupérer l'id du poolData dans le msgSpace + // détacher le morceau de mémoire du processus + + // 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 //msgSpacePoolData spoolData; //dataId = msg->poolDataId; diff --git a/src/nzg_spaces.c b/src/nzg_spaces.c index 970c2d1..9185901 100644 --- a/src/nzg_spaces.c +++ b/src/nzg_spaces.c @@ -1,7 +1,11 @@ #include "libnazgul.h" - -/* prototypes des fonctions annexes à ne pas exporter */ - int msgSpaceIdIntern(msgSpaceId dest,const msgSpaceId src ); + +/* prototypes des f#define MSGSPACE_DEFAULT_MODE 0600 +#define MSGSPACE_ID_LEN 32 + +onctions annexes à ne pas exporter */ +int msgSpaceIdIntern(msgSpaceId dest,const msgSpaceId src ); +int msgPoolDataIdIntern(msgSpaceId dest,const msgSpaceId src ); /* * spaceId : identifiant externe de l'espace de msg @@ -18,17 +22,20 @@ msgSpace * msgSpaceCreate( msgSpaceId nzgId; /* msgSpaceList mSList; */ int mSFd; // shm file descriptor + int mSPoolDataFd; // shm file descriptor int i; static int mSIdNum=-1; msgSpace * mSAddr; - - + + msgSpacePoolId poolDataId; + msgPoolData * mSPoolDataAddr; + fprintf(stderr,"Creating msgSpace with id : %s\n",spaceId); mSIdNum++; mSAddr=NULL; - /** recuperation de la liste des msgSpace **/ - /* (creation si elle n'existe pas */ + /** recuperation de la liste des msgSpace **/ + /* (creation si elle n'existe pas */ /** on créee le nouvel element **/ printf("PAGESIZE : %d\n",(int)PAGESIZE); @@ -43,7 +50,7 @@ msgSpace * msgSpaceCreate( ); if (mSFd == -1 ) { fprintf( stderr, "msgSpace %s creation failed: %s\n", - (char*)nzgId, + (char*)nzgId, strerror( errno ) ); return NULL; } @@ -54,46 +61,60 @@ msgSpace * msgSpaceCreate( strerror( errno ) ); return NULL; } - + /* Map the memory object */ mSAddr = mmap( 0, sizeof( *mSAddr ), - PROT_READ | PROT_WRITE, - MAP_SHARED, mSFd, 0 ); - if( mSAddr == MAP_FAILED ) { - fprintf( stderr, "mmap failed: %s\n", - strerror( errno ) ); - return NULL; - } + PROT_READ | PROT_WRITE, + MAP_SHARED, mSFd, 0 ); + if( mSAddr == MAP_FAILED ) { + fprintf( stderr, "mmap failed: %s\n", + strerror( errno ) ); + return NULL; + } - printf( "Map addr is 0x%08x\n", (int)mSAddr ); + printf( "Map addr is 0x%08x\n", (int)mSAddr ); - /* on ferme le descripteur du fichier */ - close(mSFd); + /* on ferme le descripteur du fichier */ + close(mSFd); - /* on remplit la structure */ - strncpy(mSAddr->id,nzgId,MSGSPACE_ID_LEN); - mSAddr->poolNb=poolNb; - mSAddr->queueNb=queueNb; - mSAddr->pid=getpid(); + /* on remplit la structure */ + strncpy(mSAddr->id,nzgId,MSGSPACE_ID_LEN); + mSAddr->poolNb=poolNb; + mSAddr->queueNb=queueNb; + mSAddr->pid=getpid(); - /* TODO: creation du poolData */ + /* creation du poolData */ + msgPoolDataIdIntern(poolDataId,spaceId); - /* TODO: on ajoute spaceId a la liste des msgSpace connus */ + mSPoolDataFd=shm_open( + poolDataId, + O_RDWR|O_CREAT|O_EXCL|O_TRUNC, + MSGSPACE_DEFAULT_MODE + ); + if (mSPoolDataFd == -1 ) { + fprintf( stderr, "poolData %s creation failed: %s\n", + (char*)poolDataId, + strerror( errno ) ); + return NULL; + } + /* TODO:allocation de la bonne zone mémoire pour le poolData */ - /* TODO: on crée queueNb files de messages */ - - /* on créer poolNb pool de buffers */ - /* et on "attache" tout ce beau monde au spaceId */ - for (i=0;i - - } - + /* TODO: on crée queueNb files de messages */ - /* on renvoie un pointeur sur le bon spaceId */ - return mSAddr; + /* on créer poolNb pool de buffers */ + /* et on "attache" tout ce beau monde au spaceId */ + for (i=0;i + + } + + + /* on renvoie un pointeur sur le bon spaceId */ + return mSAddr; } @@ -121,8 +142,8 @@ int msgSpaceDelete(msgSpaceId spaceId){ if (msgSpaceIdIntern(nzgId,spaceId) == -1){ //TODO: message d'erreur return -1; - } - + } + if (shm_unlink(nzgId)<0){ perror("shm_unlink"); return -1; @@ -143,7 +164,7 @@ int msgSpaceIdIntern(msgSpaceId dest,const msgSpaceId src ){ return 0; } -int msgSpacePoolDataIdIntern(msgSpaceId dest,const msgSpaceId src ){ +int msgPoolDataIdIntern(msgSpaceId dest,const msgSpaceId src ){ if (strlen(src)>MSGSPACE_ID_LEN){ return -1; }