int main(void) { int currentDigit = 0; int rn =0; char buffer[1024]; // File to output FILE * oFile = fopen("output.txt", "w"); // Open file and put digits FILE * fp = fopen(FILE_NAME, "r"); char * pch; int val; int n = 1; char * line = NULL; size_t len = 0; ssize_t read; read = getline(&line, &len, fp); while ((read = getline(&line, &len, fp)) != -1) { initBoolArray(); currentDigit = atoi(line); printf("%d", currentDigit); rn = checkSheep(currentDigit); if (rn != 0 ) { fprintf(oFile, "Case #%d: %d\n", n, rn ); } else { fprintf(oFile, "Case #%d: INSOMNIA \n", n); } n++; } }
//=================================================================== // SHEEP //=================================================================== void sheep(int time) { pid_t localpid = getpid(); setpgid(localpid, beastGID); printf("SHEEPSHEEPSHEEPSHEEP Sheep[%d] is grazing for %d usec\n", localpid, time); //grazing if (usleep(time) == -1) { /* exit when usleep interrupted by kill signal */ if (errno == EINTR)exit(4); } //the sheep is enchanted //keep in this order to get use semopChecked(semID, &WaitPSheepInValley, 1); semopChecked(semID, &WaitPCowInValley, 1); *SheepInValley = *SheepInValley + 1; semopChecked(semID, &SignalNSheepInValley, 1); printf("SHEEPSHEEPSHEEPSHEEP Sheep[%d] is enchanted, now %d cows and %d sheep in Valley\n", localpid, *CowInValley, *SheepInValley); // There is a meal in the Valley if (*SheepInValley >= SHEEP_IN_MEAL && *CowInValley >= COW_IN_MEAL) { int i; for (i = 0; i < SHEEP_IN_MEAL; i++) { semopChecked(semID, &WaitNSheepInValley, 1); *SheepInValley = *SheepInValley - 1; } for (i = 0; i < COW_IN_MEAL; i++) { semopChecked(semID, &WaitNCowInValley, 1); *CowInValley = *CowInValley - 1; } semopChecked(semID, &WaitPNumMeal, 1); *numMeal = *numMeal + 1; printf("SHEEPSHEEPSHEEPSHEEP Sheep[%d] results in a new meal, now number of meals:%d\n", localpid, *numMeal); semopChecked(semID, &SignalNMeal, 1); semopChecked(semID, &SignalPNumMeal, 1); semopChecked(semID, &SignalPCowInValley, 1); semopChecked(semID, &SignalPSheepInValley, 1); //send a wake up to the dragon semopChecked(semID, &SignalSDragonWakeUp, 1); } else { //the sheep in the Valley is not enough for a meal semopChecked(semID, &SignalPCowInValley, 1); semopChecked(semID, &SignalPSheepInValley, 1); } // sheep waiting semopChecked(semID, &WaitSSheepWaiting, 1); semopChecked(semID, &SignalNSheepToEat, 1); // smaug starts eating only when the the meal is ready semopChecked(semID, &WaitPSheepToEat, 1); semopChecked(semID, &WaitPCowToEat, 1); *numSheepToEat = *numSheepToEat + 1; if (*numSheepToEat >= SHEEP_IN_MEAL && *numCowToEat >= COW_IN_MEAL) { int i; for (i = 0; i < SHEEP_IN_MEAL; i++) { semopChecked(semID, &WaitNSheepToEat, 1); *numSheepToEat = *numSheepToEat - 1; } for (i = 0; i < COW_IN_MEAL; i++) { semopChecked(semID, &WaitNCowToEat, 1); *numCowToEat = *numCowToEat - 1; } semopChecked(semID, &SignalPCowToEat, 1); semopChecked(semID, &SignalPSheepToEat, 1); semopChecked(semID, &SignalSDragonEat, 1); } else { semopChecked(semID, &SignalPCowToEat, 1); semopChecked(semID, &SignalPSheepToEat, 1); } // printf("Sheep %d is about to be eaten\n", localpid); semopChecked(semID, &WaitSSheepEaten, 1); semopChecked(semID, &WaitPSheepEaten, 1); *numSheepEaten = *numSheepEaten + 1; semopChecked(semID, &SignalPSheepEaten, 1); printf("SHEEPSHEEPSHEEPSHEEP Sheep[%d] is eaten, now %d sheep eaten\n", localpid, *numSheepEaten); if(checkSheep()) { terminateSimulation(); exit(0); } semopChecked(semID, &SignalNMealSheep, 1); //keep in this order to avoid deadlock semopChecked(semID, &WaitPMealSheep, 1); semopChecked(semID, &WaitPMealCow, 1); *numMealSheep = *numMealSheep + 1; if(*numMealSheep >= SHEEP_IN_MEAL && *numMealCow >= COW_IN_MEAL) { int i; for (i = 0; i < SHEEP_IN_MEAL ; i++) { semopChecked(semID, &WaitNMealSheep, 1); *numMealSheep = *numMealSheep - 1; } for (i = 0; i < COW_IN_MEAL ; i++) { semopChecked(semID, &WaitNMealCow, 1); *numMealCow = *numMealCow - 1; } semopChecked(semID, &SignalPMealCow, 1); semopChecked(semID, &SignalPMealSheep, 1); semopChecked(semID, &SignalSMealDone, 1); } else { semopChecked(semID, &SignalPMealCow, 1); semopChecked(semID, &SignalPMealSheep, 1); } }