#include "libnazgul.h" #include "ids.h" msgQueue * msgQueueInit(msgSpaceId externId, int queueIdx) { int queueFd; msgQueue * queue; sem_t * semProtectFd; msgQueueSemId queueSemProtectId; sem_t * semReadableFd; msgQueueSemId queueSemReadableId; msgQueueId queueId; queue = NULL; printf("ploped init queue ?\n"); msgQueueProtSemIdIntern(queueSemProtectId,externId,queueIdx); msgQueueReadSemIdIntern(queueSemReadableId,externId,queueIdx); // creation du semaphore de lecture semReadableFd = sem_open(queueSemReadableId, O_CREAT|O_EXCL, SEM_DEFAULT_MODE, 0); if(semReadableFd == SEM_FAILED) { NZG_ERROR("sem_open", queueSemReadableId); goto ERROR; } // creation du semaphore de protection semProtectFd = sem_open(queueSemProtectId, O_CREAT|O_EXCL, SEM_DEFAULT_MODE, 1); if(semProtectFd == SEM_FAILED) { NZG_ERROR("sem_open", queueSemProtectId); goto ERROR; } if(sem_wait(semProtectFd)==-1){ NZG_ERROR("sem_wait",queueSemProtectId); goto ERROR; } if(msgQueueIdIntern(queueId, externId, queueIdx) < 0) { return NULL; } queueFd = shm_open(queueId, O_RDWR|O_CREAT|O_EXCL|O_TRUNC, MSGSPACE_DEFAULT_MODE); if(queueFd == -1) { fprintf(stderr, "queueInit : %s initialisation failed: %s\n", queueId, strerror(errno)); return NULL; } if(ftruncate(queueFd, sizeof(* queue)) == -1) { fprintf( stderr, "Queue resizing failed: %s\n", strerror( errno ) ); return NULL; } /* on remplit la structure msgQueue */ queue->elemCounter = 0; strcpy(queue->headId,queue->id); strcpy(queue->tailId,queue->id); /* on ferme tout ce qu'il faut */ sem_close(semProtectFd); close(queueFd); return queue; ERROR: return NULL; }