diff --git a/T2/tp/exercice-1/acquisitionManager.h b/T2/tp/exercice-1/acquisitionManager.h index 8debc11..529f3d8 100755 --- a/T2/tp/exercice-1/acquisitionManager.h +++ b/T2/tp/exercice-1/acquisitionManager.h @@ -11,4 +11,8 @@ unsigned int acquisitionManagerInit(void); */ void acquisitionManagerJoin(void); -#endif \ No newline at end of file + +//La taille du tampon +#define BUFFER_SIZE 13 + +#endif diff --git a/T2/tp/exercice-1/acquisitionManagerPOSIX.c b/T2/tp/exercice-1/acquisitionManagerPOSIX.c index 1d77f10..0b5a0b7 100755 --- a/T2/tp/exercice-1/acquisitionManagerPOSIX.c +++ b/T2/tp/exercice-1/acquisitionManagerPOSIX.c @@ -19,10 +19,21 @@ pthread_t producers[4]; static void *produce(void *params); +//Le tampon pour stocker les messages +MSG_BLOCK buffer[BUFFER_SIZE]; + +int index_buffer_libre = 0; + +int nbr_threads = 0; + /** * Semaphores and Mutex */ -//TODO +sem_t *semaphore_libre; +sem_t *semaphore_occupe; + +pthread_mutex_t mutex_tab_indices = PTHREAD_MUTEX_INITIALIZER; +pthread_mutex_t mutex_count = PTHREAD_MUTEX_INITIALIZER; /* * Creates the synchronization elements. @@ -38,25 +49,54 @@ static void incrementProducedCount(void); static unsigned int createSynchronizationObjects(void) { - //TODO + //Initialisation des sémaphores + semaphore_libre = sem_open("/acquisitionManager_semLibre", O_CREAT, 0644, BUFFER_SIZE); + if (semaphore_libre == SEM_FAILED) + { + perror("[sem_open"); + return ERROR_INIT; + } + + semaphore_occupe = sem_open("/acquisitionManager_semLibre", O_CREAT, 0644, 0); + if (semaphore_occupe == SEM_FAILED) + { + perror("[sem_open"); + return ERROR_INIT; + } + //----Fin de l'initialisation sémaphore ----- printf("[acquisitionManager]Semaphore created\n"); return ERROR_SUCCESS; } static void incrementProducedCount(void) { - //TODO + pthread_mutex_lock(&mutex_count); + produceCount++; + pthread_mutex_unlock(&mutex_count); } unsigned int getProducedCount(void) { unsigned int p = 0; - //TODO + pthread_mutex_lock(&mutex_count); + p = produceCount; + pthread_mutex_unlock(&mutex_count); return p; } MSG_BLOCK getMessage(void){ //TODO + MSG_BLOCK message; + + static int index_lecture = 0; + sem_wait(semaphore_occupe); + + message = buffer[index_lecture]; + index_lecture = (index_lecture+1)%BUFFER_SIZE; + + sem_post(semaphore_libre); + + return message; } //TODO create accessors to limit semaphore and mutex usage outside of this C module. @@ -70,10 +110,10 @@ unsigned int acquisitionManagerInit(void) return ERROR_INIT; printf("[acquisitionManager]Synchronization initialization done.\n"); - + for (i = 0; i < PRODUCER_COUNT; i++) { - //TODO + pthread_create(&producers[i], NULL, produce, NULL); } return ERROR_SUCCESS; @@ -84,23 +124,50 @@ void acquisitionManagerJoin(void) unsigned int i; for (i = 0; i < PRODUCER_COUNT; i++) { - //TODO + pthread_join(producers[i], NULL); } - //TODO + sem_destroy(semaphore_libre); + sem_destroy(semaphore_occupe); printf("[acquisitionManager]Semaphore cleaned\n"); } void *produce(void* params) { - D(printf("[acquisitionManager]Producer created with id %d\n", gettid())); + //D(printf("[acquisitionManager]Producer created with id %d\n", gettid())); unsigned int i = 0; + int index_loc; + MSG_BLOCK message; + + //Récupérer le numéro du thread + int num_thread; + pthread_mutex_lock(&mutex_count); + nbr_threads++; + num_thread = nbr_threads; + pthread_mutex_unlock(&mutex_count); + while (i < PRODUCER_LOOP_LIMIT) { i++; sleep(PRODUCER_SLEEP_TIME+(rand() % 5)); - //TODO + + //----- L'ajout d'un nouveau message ----- + //On prend un jeton : une case se remplit + sem_wait(semaphore_libre); + + pthread_mutex_lock(&mutex_tab_indices); + index_loc = index_buffer_libre; + index_buffer_libre = (index_buffer_libre+1)%BUFFER_SIZE; + pthread_mutex_unlock(&mutex_tab_indices); + + //Récupérer l'entrée + getInput(num_thread, &message); + buffer[index_loc] = message; + + //On met un jeton dans le sémaphore "occupé" + sem_post(semaphore_occupe); } - printf("[acquisitionManager] %d termination\n", gettid()); - //TODO -} \ No newline at end of file + //printf("[acquisitionManager] %d termination\n", get_id()); + + pthread_exit(NULL); +} diff --git a/T2/tp/exercice-1/displayManager.c b/T2/tp/exercice-1/displayManager.c index 15bd284..44f6f0c 100755 --- a/T2/tp/exercice-1/displayManager.c +++ b/T2/tp/exercice-1/displayManager.c @@ -28,12 +28,12 @@ void displayManagerJoin(void){ static void *display( void *parameters ) { - D(printf("[displayManager]Thread created for display with id %d\n", gettid())); + //D(printf("[displayManager]Thread created for display with id %d\n", gettid())); unsigned int diffCount = 0; while(diffCount < DISPLAY_LOOP_LIMIT){ sleep(DISPLAY_SLEEP_TIME); //TODO } - printf("[displayManager] %d termination\n", gettid()); + //printf("[displayManager] %d termination\n", gettid()); //TODO -} \ No newline at end of file +} diff --git a/T2/tp/exercice-1/messageAdder.c b/T2/tp/exercice-1/messageAdder.c index 0cb8af6..cb01c8f 100755 --- a/T2/tp/exercice-1/messageAdder.c +++ b/T2/tp/exercice-1/messageAdder.c @@ -52,14 +52,14 @@ void messageAdderJoin(void){ static void *sum( void *parameters ) { - D(printf("[messageAdder]Thread created for sum with id %d\n", gettid())); + //D(printf("[messageAdder]Thread created for sum with id %d\n", gettid())); unsigned int i = 0; while(i