diff --git a/src/nzg_poolCreate.c b/src/nzg_poolCreate.c new file mode 100644 index 0000000..b984c6e --- /dev/null +++ b/src/nzg_poolCreate.c @@ -0,0 +1,72 @@ +#include "libnazgul.h" +#include "nzg_ids.h" + +int msgPoolCreate( + msgSpaceId spaceId, + int poolIdx, + int buffNb, + int buffSize + ) { + + int poolFd; + int bufferTabFd; + sem_t * ressourceSem; + msgPoolId poolId; + msgBufferInfoTabId bufferInfoTabId; + msgPoolSemId poolRessourceSemId; + + + /* creation des infos sur buffers DEBUT */ + if (msgBufferInfoTabIdIntern(bufferInfoTabId,spaceId,poolIdx) == -1){ + fprintf( stderr, "msgPoolId creation failed for id %s\n", (char*)poolId ); + return -1; + } + bufferTabFd=shm_open(bufferInfoTabId,O_RDWR|O_CREAT|O_EXCL|O_TRUNC,MSGSPACE_DEFAULT_MODE); + if (bufferTabFd == -1 ) { + fprintf( stderr, "msgInfoTab : %s creation failed: %s\n",bufferInfoTabId, + strerror( errno ) ); + return -1; + } + if (ftruncate(bufferTabFd, buffNb*sizeof(msgBufferInfo)) == -1){ + fprintf( stderr, "msgBufferInfoTab resizing failed: %s\n", + strerror( errno ) ); + return -1; + } + /* creation des infos sur buffers FIN */ + + /* creation des buffers DEBUT */ + if (msgPoolIdIntern(poolId,spaceId,poolIdx) == -1){ + fprintf( stderr, "msgPoolId creation failed for id %s\n", (char*)poolId ); + return -1; + } + poolFd=shm_open(poolId,O_RDWR|O_CREAT|O_EXCL|O_TRUNC,MSGSPACE_DEFAULT_MODE); + if (poolFd == -1 ) { + fprintf( stderr, "msgPool : %s creation failed: %s\n",poolId, + strerror( errno ) ); + return -1; + } + if (ftruncate(poolFd, (buffSize*buffNb)) == -1){ + fprintf( stderr, "msgPool resizing failed: %s\n", + strerror( errno ) ); + return -1; + } + /* creation des buffers FIN */ + + if (msgPoolSemIdIntern(poolRessourceSemId,spaceId,poolIdx) == -1){ + fprintf( stderr, "msgPoolId creation failed for id %s\n", + (char*)poolRessourceSemId ); + return -1; + } + + // on met un semaphore sur le pool + ressourceSem = sem_open(poolRessourceSemId, O_CREAT|O_EXCL, 0666, buffNb); + //TODO: verrifier les erreurs sur l'ouverture de la sem + + // on met le pool a la taille voulue pour qu'il + // puisse contenir les buffs + + close(poolFd); + + return 0; +} + diff --git a/src/nzg_poolDelete.c b/src/nzg_poolDelete.c new file mode 100644 index 0000000..4e2e545 --- /dev/null +++ b/src/nzg_poolDelete.c @@ -0,0 +1,71 @@ +#include "libnazgul.h" +#include "nzg_ids.h" + +int msgPoolDelete( + msgSpaceId spaceId, + int poolIdx, + int buffNb, + int buffSize + ) { + + int poolFd; + int bufferTabFd; + sem_t * ressourceSem; + msgPoolId poolId; + msgBufferInfoTabId bufferInfoTabId; + msgPoolSemId poolRessourceSemId; + + + /* creation des infos sur buffers DEBUT */ + if (msgBufferInfoTabIdIntern(bufferInfoTabId,spaceId,poolIdx) == -1){ + fprintf( stderr, "msgPoolId creation failed for id %s\n", (char*)poolId ); + return -1; + } + bufferTabFd=shm_open(bufferInfoTabId,O_RDWR|O_CREAT|O_EXCL|O_TRUNC,MSGSPACE_DEFAULT_MODE); + if (bufferTabFd == -1 ) { + fprintf( stderr, "msgInfoTab : %s creation failed: %s\n",bufferInfoTabId, + strerror( errno ) ); + return -1; + } + if (ftruncate(bufferTabFd, buffNb*sizeof(msgBufferInfo)) == -1){ + fprintf( stderr, "msgBufferInfoTab resizing failed: %s\n", + strerror( errno ) ); + return -1; + } + /* creation des infos sur buffers FIN */ + + /* creation des buffers DEBUT */ + if (msgPoolIdIntern(poolId,spaceId,poolIdx) == -1){ + fprintf( stderr, "msgPoolId creation failed for id %s\n", (char*)poolId ); + return -1; + } + poolFd=shm_open(poolId,O_RDWR|O_CREAT|O_EXCL|O_TRUNC,MSGSPACE_DEFAULT_MODE); + if (poolFd == -1 ) { + fprintf( stderr, "msgPool : %s creation failed: %s\n",poolId, + strerror( errno ) ); + return -1; + } + if (ftruncate(poolFd, (buffSize*buffNb)) == -1){ + fprintf( stderr, "msgPool resizing failed: %s\n", + strerror( errno ) ); + return -1; + } + /* creation des buffers FIN */ + + if (msgPoolSemIdIntern(poolRessourceSemId,spaceId,poolIdx) == -1){ + fprintf( stderr, "msgPoolId creation failed for id %s\n", + (char*)poolRessourceSemId ); + return -1; + } + + // on met un semaphore sur le pool + ressourceSem = sem_open(poolRessourceSemId, O_CREAT|O_EXCL, 0666, buffNb); + //TODO: verrifier les erreurs sur l'ouverture de la sem + + // on met le pool a la taille voulue pour qu'il + // puisse contenir les buffs + + close(poolFd); + + return 0; +}