#include "libnazgul.h" #include "nzg_ids.h" /* 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 * queueNb : nombre de files de messages * poolNb : nombre de pool de buffers * queueNbCar : tableau de caracteristiques des different pool */ msgSpace * msgSpaceCreate( msgSpaceId spaceId, int queueNb, int poolNb, msgPool * poolInfos ){ msgSpaceId nzgId; /* msgSpaceList mSList; */ int mSFd; // shm file descriptor int mSPoolDataFd; // shm file descriptor int i; static int mSIdNum=-1; msgSpace * mSAddr; msgPoolId poolDataTabId; 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 */ /** on créee le nouvel element **/ printf("PAGESIZE : %d\n",(int)PAGESIZE); if (msgSpaceIdIntern(nzgId,spaceId) < 0){ return NULL; } printf("Id interne : %s\n",nzgId); mSFd=shm_open( nzgId, O_RDWR|O_CREAT|O_EXCL|O_TRUNC, MSGSPACE_DEFAULT_MODE ); if (mSFd == -1 ) { fprintf( stderr, "msgSpace %s creation failed: %s\n", (char*)nzgId, strerror( errno ) ); return NULL; } /* on redimentionne l'element */ if (ftruncate(mSFd, sizeof(* mSAddr)) == -1){ fprintf( stderr, "msgSpace resizing failed: %s\n", 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; } printf( "msgSpace map addr is 0x%08x : %d\n", (int)mSAddr,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(); /* creation du poolData */ msgPoolDataIdIntern(poolDataTabId,spaceId); strcpy(mSAddr->poolDataTabId,poolDataTabId); mSPoolDataFd=shm_open( poolDataTabId, O_RDWR|O_CREAT|O_EXCL|O_TRUNC, MSGSPACE_DEFAULT_MODE ); if (mSPoolDataFd == -1 ) { fprintf( stderr, "poolData %s creation failed: %s\n", (char*)poolDataTabId, strerror( errno ) ); return NULL; } /* allocation de la bonne zone mémoire pour le poolData */ if (ftruncate(mSPoolDataFd, poolNb*sizeof(msgPoolData)) == -1){ fprintf( stderr, "msgSpace resizing failed: %s\n", strerror( errno ) ); return NULL; } /* TODO: attacher chacun des msgPoolData : * - y écrire les informations passées en param * - creer les zones mémoires de chacune des pool */ mSPoolDataAddr = mmap( 0, sizeof( *mSAddr ), PROT_READ | PROT_WRITE, MAP_SHARED, mSFd, 0 ); if( mSPoolDataAddr == MAP_FAILED ) { fprintf( stderr, "mmap failed: %s\n", strerror( errno ) ); return NULL; } close(mSPoolDataFd); printf( "msgPoolData map addr is 0x%08x\n", (int)mSPoolDataAddr ); for (i=0;ipoolDataTabId) < 0){ perror("shm_unlink"); return -1; } printf("ok\n"); if (shm_unlink(nzgId)<0){ perror("shm_unlink"); return -1; }; return 0; }