From 26011d7d74fc0e78cb8379d1959cf1b4a17779f5 Mon Sep 17 00:00:00 2001 From: TriantaTV Date: Fri, 14 Oct 2022 00:06:24 -0500 Subject: [PATCH] Buffer always is 0 when printing from consumer.c --- include/shared.h | 1 + src/consumer.c | 12 +++++------ src/producer.c | 52 ++++++++++++++++++++++++++++++++++-------------- 3 files changed, 44 insertions(+), 21 deletions(-) diff --git a/include/shared.h b/include/shared.h index 577028e..1584077 100644 --- a/include/shared.h +++ b/include/shared.h @@ -7,6 +7,7 @@ int StringToNumber(char* argv); typedef struct SharedStruct { int buffer[10]; + int count[10]; sem_t semConsumer; sem_t semProducer; } SharedStruct; diff --git a/src/consumer.c b/src/consumer.c index 0f4fcff..195c851 100644 --- a/src/consumer.c +++ b/src/consumer.c @@ -5,8 +5,8 @@ #include "shared.h" void* Consumer(void* arg); -void consume_item(long int item); -long int remove_item(void); +void consume_item(int item); +int remove_item(void); int main(int argc, char* argv[]) { @@ -18,7 +18,7 @@ int main(int argc, char* argv[]) int sharedID = StringToNumber(argv[1]); SharedStruct* sharedMem = shmat(sharedID, NULL, 0); sem_wait(&sharedMem->semConsumer); - printf("Checking for 5 in shared struct.\n"); + // TODO: Fix buffer not printing correctly printf("%d\n", sharedMem->buffer[0]); return 0; } @@ -28,7 +28,7 @@ int main(int argc, char* argv[]) // Add ability to use shared memory void* Consumer(void* arg) { - long int consumeNum; + int consumeNum; while (1) { // down(&full); @@ -42,13 +42,13 @@ void* Consumer(void* arg) } // Manage item taken from shared memory -void consume_item(long int item) +void consume_item(int item) { ; } // Take item out of shared memory -long int remove_item() +int remove_item(void) { ; } \ No newline at end of file diff --git a/src/producer.c b/src/producer.c index 115d6d7..4561d12 100644 --- a/src/producer.c +++ b/src/producer.c @@ -5,9 +5,10 @@ #include #include "shared.h" -void* Producer(void* arg); -long int produce_item(void); -void insert_item(long int item); +int GetNextFreeSlot(SharedStruct* sharedMem); +void Producer(SharedStruct* sharedMem); +int produce_item(void); +int insert_item(int item, SharedStruct* sharedMem); int main(int argc, char* argv[]) @@ -20,28 +21,45 @@ int main(int argc, char* argv[]) srandom((unsigned int) time(NULL)); int sharedID = StringToNumber(argv[1]); SharedStruct* sharedMem = shmat(sharedID, NULL, 0); - printf("Adding 5 to shared struct.\n"); - sharedMem->buffer[0] = 5; + Producer(sharedMem); sem_post(&sharedMem->semConsumer); return 0; } +int GetNextFreeSlot(SharedStruct* sharedMem) +{ + int slot = -1; + for (int i = 0; i < 10; i++) + { + if ((sharedMem->buffer[i] != -1) && (sharedMem->buffer[(i+1)%10] == -1)) + { + slot = (i+1)%10; + return slot; + } + } + return slot; +} + // Producer main function // TODO: Add waiting for one producer at a time // Add ability to use shared memory -void* Producer(void* arg) +void Producer(SharedStruct* sharedMem) { - long int insertNum; - SharedStruct* sharedMem; - while (1) + int insertNum; + // TODO: For testing purposes, revert max to 100 + for (int i = 0; i < 5; i++) { insertNum = produce_item(); - printf("The random number is %li\n", insertNum); + printf("%d is inserted.\n", insertNum); // sem_wait(&semProducer); // down(&empty); // down(&mutex); - insert_item(insertNum); - // sem_post(&semProducer); + // if (insert_item(insertNum, sharedMem) == 0) + insert_item(insertNum, sharedMem); + // { + // --i; + // continue; + // } // up(&mutex); // up(&full); break; @@ -49,13 +67,17 @@ void* Producer(void* arg) } // Generate a number between 0 and 9 -long int produce_item(void) +int produce_item(void) { return random() % 10; } // Insert a number into the shared memory -void insert_item(long int item) +int insert_item(int item, SharedStruct* sharedMem) { - ; + int slot = GetNextFreeSlot(sharedMem); + if (slot == -1) + return 0; + sharedMem->buffer[0] = item; + return 1; } \ No newline at end of file