diff --git a/T2/tp/exercice-1/acquisitionManagerAtomic.c b/T2/tp/exercice-1/acquisitionManagerAtomic.c new file mode 100755 index 0000000..f91618d --- /dev/null +++ b/T2/tp/exercice-1/acquisitionManagerAtomic.c @@ -0,0 +1,168 @@ +#include +#include +#include +#include +#include +#include +#include "acquisitionManager.h" +#include "msg.h" +#include "iSensor.h" +#include "multitaskingAccumulator.h" +#include "iAcquisitionManager.h" +#include "debug.h" +#include "stdatomic.h" + + +//producer count storage +_Atomic int produceCount = 0; + +pthread_t producers[4]; + +static void *produce(void *params); + +MSG_BLOCK Buffer[BUFFER_SIZE]; + +/** +* Semaphores and Mutex +*/ +//TODO +sem_t semaphore_libre; +sem_t semaphore_occupe; + +// pthread_mutex_t m_write = PTHREAD_MUTEX_INITIALIZER; + +/** + * Usefull variables + */ + +_Atomic int index_libre = 0; +_Atomic int thread_count = 0; + +/* +* Creates the synchronization elements. +* @return ERROR_SUCCESS if the init is ok, ERROR_INIT otherwise +*/ +static unsigned int createSynchronizationObjects(void); + +/* +* Increments the produce count. +*/ +static void incrementProducedCount(void); + +static unsigned int createSynchronizationObjects(void) +{ + int error; + + //TODO DONE + if((error = sem_init(&semaphore_libre, 0, BUFFER_SIZE)) < 0){ + printf("[acquisitionManager]Semaphore L Error No. %d\n",error); + return error; + } + + if((error = sem_init(&semaphore_occupe, 0, 0)) < 0){ + printf("[acquisitionManager]Semaphore O Error No. %d\n",error); + return error; + } + + printf("[acquisitionManager]Semaphore created\n"); + return ERROR_SUCCESS; +} + +static void incrementProducedCount(void) +{ + //TODO + produceCount++; +} + +unsigned int getProducedCount(void) +{ + unsigned int p = 0; + //TODO + p = produceCount; + return p; +} + +MSG_BLOCK getMessage(void){ + //TODO + MSG_BLOCK res; + static int index_count = 0; + + sem_wait(&semaphore_occupe); + res = Buffer[index_count]; + index_count = (index_count+1)%BUFFER_SIZE; + sem_post(&semaphore_libre); + + return res; +} + +//TODO create accessors to limit semaphore and mutex usage outside of this C module. + +unsigned int acquisitionManagerInit(void) +{ + unsigned int i; + printf("[acquisitionManager]Synchronization initialization in progress...\n"); + fflush( stdout ); + if (createSynchronizationObjects() == ERROR_INIT) + 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; +} + +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())); + unsigned int i = 0; + int index_lock; + int thread_num; + MSG_BLOCK message; + + //Counting producers + thread_num = thread_count; + thread_count++; + + while (i < PRODUCER_LOOP_LIMIT) + { + i++; + sleep(PRODUCER_SLEEP_TIME+(rand() % 5)); + //TODO + sem_wait(&semaphore_libre); + + // pthread_mutex_lock(&m_write); + index_lock = index_libre; + index_libre = (index_libre + 1)%BUFFER_SIZE; + // pthread_mutex_unlock(&m_write); + + getInput(thread_num, &message); + Buffer[index_lock] = message; + incrementProducedCount(); + + sem_post(&semaphore_occupe); + } + printf("[acquisitionManager] %d termination\n", gettid()); + //TODO + pthread_exit(NULL); + +} diff --git a/T2/tp/exercice-1/acquisitionManagerAtomic.o b/T2/tp/exercice-1/acquisitionManagerAtomic.o new file mode 100644 index 0000000..fde4d32 Binary files /dev/null and b/T2/tp/exercice-1/acquisitionManagerAtomic.o differ diff --git a/T2/tp/exercice-1/acquisitionManagerPOSIX.c b/T2/tp/exercice-1/acquisitionManagerPOSIX.c index 9c2d0bb..cdc2d41 100755 --- a/T2/tp/exercice-1/acquisitionManagerPOSIX.c +++ b/T2/tp/exercice-1/acquisitionManagerPOSIX.c @@ -93,7 +93,6 @@ MSG_BLOCK getMessage(void){ sem_wait(&semaphore_occupe); res = Buffer[index_count]; index_count = (index_count+1)%BUFFER_SIZE; - incrementProducedCount(); sem_post(&semaphore_libre); return res; @@ -138,7 +137,7 @@ void acquisitionManagerJoin(void) void *produce(void* params) { - D(printf("[acquisitionManager]Producer created with id %d\n", getpid())); + D(printf("[acquisitionManager]Producer created with id %d\n", gettid())); unsigned int i = 0; int index_lock; int thread_num; @@ -164,10 +163,11 @@ void *produce(void* params) getInput(thread_num, &message); Buffer[index_lock] = message; + incrementProducedCount(); sem_post(&semaphore_occupe); } - printf("[acquisitionManager] %d termination\n", getpid()); + printf("[acquisitionManager] %d termination\n", gettid()); //TODO DONE pthread_exit(NULL); } \ No newline at end of file diff --git a/T2/tp/exercice-1/acquisitionManagerPOSIX.o b/T2/tp/exercice-1/acquisitionManagerPOSIX.o deleted file mode 100644 index ee961cd..0000000 Binary files a/T2/tp/exercice-1/acquisitionManagerPOSIX.o and /dev/null differ diff --git a/T2/tp/exercice-1/acquisitionManagerTestAndSet.c b/T2/tp/exercice-1/acquisitionManagerTestAndSet.c new file mode 100755 index 0000000..17c40f9 --- /dev/null +++ b/T2/tp/exercice-1/acquisitionManagerTestAndSet.c @@ -0,0 +1,165 @@ +#include +#include +#include +#include +#include +#include +#include "acquisitionManager.h" +#include "msg.h" +#include "iSensor.h" +#include "multitaskingAccumulator.h" +#include "iAcquisitionManager.h" +#include "debug.h" + + +//producer count storage +_Atomic int produceCount = 0; + +volatile unsigned int producedCount = 0; + +pthread_t producers[4]; + +static void *produce(void *params); + +/** +* Semaphores and Mutex +*/ +//TODO +sem_t semaphore_libre; +sem_t semaphore_occupe; + +// pthread_mutex_t m_write = PTHREAD_MUTEX_INITIALIZER; + +/** + * Usefull variables + */ + +_Atomic int index_libre = 0; +_Atomic int thread_count = 0; + +/* +* Creates the synchronization elements. +* @return ERROR_SUCCESS if the init is ok, ERROR_INIT otherwise +*/ +static unsigned int createSynchronizationObjects(void); + +/* +* Increments the produce count. +*/ +static void incrementProducedCount(void); + +static unsigned int createSynchronizationObjects(void) +{ + int error; + + //TODO DONE + if((error = sem_init(&semaphore_libre, 0, BUFFER_SIZE)) < 0){ + printf("[acquisitionManager]Semaphore L Error No. %d\n",error); + return error; + } + + if((error = sem_init(&semaphore_occupe, 0, 0)) < 0){ + printf("[acquisitionManager]Semaphore O Error No. %d\n",error); + return error; + } + + printf("[acquisitionManager]Semaphore created\n"); + return ERROR_SUCCESS; +} + +static void incrementProducedCount(void) +{ + //TODO + produceCount++; +} + +unsigned int getProducedCount(void) +{ + unsigned int p = 0; + //TODO + p = produceCount; + return p; +} + + +MSG_BLOCK getMessage(void){ + //TODO + MSG_BLOCK res; + static int index_count = 0; + + sem_wait(&semaphore_occupe); + res = Buffer[index_count]; + index_count = (index_count+1)%BUFFER_SIZE; + sem_post(&semaphore_libre); + + return res; +} + +//TODO create accessors to limit semaphore and mutex usage outside of this C module. + +unsigned int acquisitionManagerInit(void) +{ + unsigned int i; + printf("[acquisitionManager]Synchronization initialization in progress...\n"); + fflush( stdout ); + if (createSynchronizationObjects() == ERROR_INIT) + 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; +} + +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())); + unsigned int i = 0; + int index_lock; + int thread_num; + MSG_BLOCK message; + + //Counting producers + thread_num = thread_count; + thread_count++; + + while (i < PRODUCER_LOOP_LIMIT) + { + i++; + sleep(PRODUCER_SLEEP_TIME+(rand() % 5)); + //TODO + sem_wait(&semaphore_libre); + + index_lock = index_libre; + index_libre = (index_libre + 1)%BUFFER_SIZE; + + getInput(thread_num, &message); + Buffer[index_lock] = message; + incrementProducedCount(); + + sem_post(&semaphore_occupe); + } + printf("[acquisitionManager] %d termination\n", gettid()); + //TODO + pthread_exit(NULL); +} \ No newline at end of file diff --git a/T2/tp/exercice-1/displayManager.c b/T2/tp/exercice-1/displayManager.c index 3d1a292..6d7c237 100755 --- a/T2/tp/exercice-1/displayManager.c +++ b/T2/tp/exercice-1/displayManager.c @@ -30,7 +30,7 @@ void displayManagerJoin(void){ static void *display( void *parameters ) { - D(printf("[displayManager]Thread created for display with id %d\n", getpid())); + D(printf("[displayManager]Thread created for display with id %d\n", gettid())); unsigned int diffCount = 0; MSG_BLOCK mBlock; while(diffCount < DISPLAY_LOOP_LIMIT){ @@ -41,7 +41,7 @@ static void *display( void *parameters ) messageDisplay(&mBlock); print(getProducedCount(),getConsumedCount()); } - printf("[displayManager] %d termination\n", getpid()); + printf("[displayManager] %d termination\n", gettid()); //TODO DONE pthread_exit(NULL); } diff --git a/T2/tp/exercice-1/displayManager.o b/T2/tp/exercice-1/displayManager.o index 5b336eb..5f1ec68 100644 Binary files a/T2/tp/exercice-1/displayManager.o and b/T2/tp/exercice-1/displayManager.o differ diff --git a/T2/tp/exercice-1/messageAdder.c b/T2/tp/exercice-1/messageAdder.c index 90e76fa..7b41074 100755 --- a/T2/tp/exercice-1/messageAdder.c +++ b/T2/tp/exercice-1/messageAdder.c @@ -34,7 +34,7 @@ MSG_BLOCK getCurrentSum(){ } unsigned int getConsumedCount(){ - //TODO + //TODO DONE return consumeCount; } @@ -62,13 +62,13 @@ static void incrementConsumeCount(void){ static void *sum( void *parameters ) { - D(printf("[messageAdder]Thread created for sum with id %d\n", getpid())); + D(printf("[messageAdder]Thread created for sum with id %d\n", gettid())); unsigned int i = 0; MSG_BLOCK message; while(i