#include #include #include #include #include #include "shared.h" 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[]) { if (argc != 2) { fprintf(stderr, "Usage: %s SharedID# \n", argv[0]); exit(1); } srandom((unsigned int) time(NULL)); int sharedID = StringToNumber(argv[1]); SharedStruct* sharedMem = shmat(sharedID, NULL, 0); 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(SharedStruct* sharedMem) { int insertNum; // TODO: For testing purposes, revert max to 100 for (int i = 0; i < 5; i++) { insertNum = produce_item(); printf("%d is inserted.\n", insertNum); // sem_wait(&semProducer); // down(&empty); // down(&mutex); // if (insert_item(insertNum, sharedMem) == 0) insert_item(insertNum, sharedMem); // { // --i; // continue; // } // up(&mutex); // up(&full); break; } } // Generate a number between 0 and 9 int produce_item(void) { return random() % 10; } // Insert a number into the shared memory int insert_item(int item, SharedStruct* sharedMem) { int slot = GetNextFreeSlot(sharedMem); if (slot == -1) return 0; sharedMem->buffer[0] = item; return 1; }