diff --git a/Assignment3/main.c b/Assignment3/main.c index 0b56690..8b427fe 100644 --- a/Assignment3/main.c +++ b/Assignment3/main.c @@ -25,8 +25,6 @@ int houseFloor[2]; // Pipe between movers and truckers int nextToTrucks[2]; -//TODO: See if you can just use arg structure instead of making stack vars from the args - // Arg structure, need to assign id in loop, and a reference to a seed for rand_r(), since it mutates the seed typedef struct args { int id; @@ -36,18 +34,16 @@ typedef struct args { // Routine for house dwellers void *dweller(void *arg) { Args *args = (Args *) arg; // Cast void* to Args*, as pthread_create() requires void* - int id = args->id; - unsigned int seed = args->seed; - printf("Hello from house dweller %d\n", id); + printf("Hello from house dweller %d\n", args->id); for (int i = 0; i < NUMBER_OF_BOXES_PER_DWELLER; i++) { - int weight = RANDOM_WITHIN_RANGE(MIN_BOX_WEIGHT, MAX_BOX_WEIGHT, seed); // Generate random weight - int time = RANDOM_WITHIN_RANGE(MIN_TIME_FOR_HOUSE_DWELLER, MAX_TIME_FOR_HOUSE_DWELLER, seed); // Time to pack box + int weight = RANDOM_WITHIN_RANGE(MIN_BOX_WEIGHT, MAX_BOX_WEIGHT, args->seed); // Generate random weight + int time = RANDOM_WITHIN_RANGE(MIN_TIME_FOR_HOUSE_DWELLER, MAX_TIME_FOR_HOUSE_DWELLER, args->seed); // Time to pack box sleep(time); // Simulate packing time write(houseFloor[WRITE_END], &weight, sizeof(int)); // Write weight to pipe - printf("House dweller %d created a box that weights %d in %d units of time\n", id, weight, time); + printf("House dweller %d created a box that weights %d in %d units of time\n", args->id, weight, time); } - printf("House dweller %d is done packing\n", id); + printf("House dweller %d is done packing\n", args->id); free(args); // Make sure to free the args struct return NULL; } @@ -56,18 +52,16 @@ void *dweller(void *arg) { // Comments from dweller() apply here as well void *mover(void *arg) { Args *args = (Args *) arg; - int id = args->id; - unsigned int seed = args->seed; int weight; - printf("Hello from mover %d\n", id); + printf("Hello from mover %d\n", args->id); while (read(houseFloor[READ_END], &weight, sizeof(int)) > 0) { // Read from pipe, until dwellers are all done - int time = RANDOM_WITHIN_RANGE(MIN_TIME_FOR_MOVER, MAX_TIME_FOR_MOVER, seed); + int time = RANDOM_WITHIN_RANGE(MIN_TIME_FOR_MOVER, MAX_TIME_FOR_MOVER, args->seed); sleep(time); write(nextToTrucks[WRITE_END], &weight, sizeof(int)); - printf("Mover %d brought down a box of weight %d in %d units of time\n", id, weight, time); + printf("Mover %d brought down a box of weight %d in %d units of time\n", args->id, weight, time); } - printf("Mover %d is done moving\n", id); + printf("Mover %d is done moving\n", args->id); free(args); return NULL; } @@ -75,38 +69,35 @@ void *mover(void *arg) { // Routine for truckers void *trucker(void *arg) { Args *args = (Args *) arg; - int id = args->id; - unsigned int seed = args->seed; int capacity = ROOM_IN_TRUCK; int truckWeight = 0; int weight; - printf("Hello from trucker %d\n", id); + printf("Hello from trucker %d\n", args->id); while (read(nextToTrucks[READ_END], &weight, sizeof(int)) > 0) { // Read from pipe, until movers are all done capacity--; truckWeight += weight; - int time = RANDOM_WITHIN_RANGE(MIN_TIME_FOR_TRUCKER, MAX_TIME_FOR_TRUCKER, seed); + int time = RANDOM_WITHIN_RANGE(MIN_TIME_FOR_TRUCKER, MAX_TIME_FOR_TRUCKER, args->seed); sleep(time); - printf("Trucker %d loaded up box of weight %d in %d units of time, room left: %d\n", id, weight, time, capacity); + printf("Trucker %d loaded up box of weight %d in %d units of time, room left: %d\n", args->id, weight, time, capacity); if (capacity == 0) { // If truck is full, go on trip, and reset - time = RANDOM_WITHIN_RANGE(MIN_TRIP_TIME, MAX_TRIP_TIME, seed); - printf("Full truck %d with load of %d units of mass departed. Round trip will take %d units of time\n", id, truckWeight, time); + time = RANDOM_WITHIN_RANGE(MIN_TRIP_TIME, MAX_TRIP_TIME, args->seed); + printf("Full truck %d with load of %d units of mass departed. Round trip will take %d units of time\n", args->id, truckWeight, time); sleep(time); capacity = ROOM_IN_TRUCK; truckWeight = 0; } } // If truck is not full, go on trip, and end, as there are no more boxes - int time = RANDOM_WITHIN_RANGE(MIN_TRIP_TIME, MAX_TRIP_TIME, seed); - printf("Not full truck %d with load of %d units of mass departed. One way will take %d units of time\n", id, truckWeight, time); + int time = RANDOM_WITHIN_RANGE(MIN_TRIP_TIME, MAX_TRIP_TIME, args->seed); + printf("Not full truck %d with load of %d units of mass departed. One way trip will take %d units of time\n", args->id, truckWeight, time); sleep(time); - printf("Truck %d is finished\n", id); + printf("Truck %d is finished\n", args->id); free(args); return NULL; } - int main(int argc, char **argv) { srand(time(NULL));