//Each elevator is a while loop. //Check the global list and if it’s empty, block on the condition variable for blocking elevators. //When the elevator gets a person to service, it moves to the appropriate flo0or and opens its door. //It puts itself into the person’s e field, then signals the person and blocks until the person wakes it up. //When it wakes up, it goes to the person’s destination floor, opens its door, signals the person and blocks. //When the person wakes it up, it closes its door and re-executes its while loop. //• Your elevator’s should call open door(), close door() from move to floor() appropriately. //All sleeping and printing should be done in elevator skeleton.c. //Thus, your final program that you hand in should not do any sleeping or any printing. void *elevator(void *arg) { Person *person_in_transit; for(;;) { pthread_mutex_lock(((Elevator*)arg)->es->lock); while (!((Queue*)((Elevator*)arg)->es->v)->count) pthread_cond_wait(((Queue*)((Elevator*)arg)->es->v)->cond, ((Elevator*)arg)->es->lock); if(!dll_empty(((Queue*)((Elevator*)arg)->es->v)->passengers)){ person_in_transit = (Person*)jval_v(dll_val(dll_first(((Queue*)((Elevator*)arg)->es->v)->passengers))); dll_delete_node(dll_first(((Queue*)((Elevator*)arg)->es->v)->passengers)); } // unlock the critial section. pthread_mutex_unlock(((Elevator*)arg)->es->lock); //move the elevator. --((Queue*)((Elevator*)arg)->es->v)->count; person_in_transit->from == ((Elevator*)arg)->onfloor?:move_to_floor(((Elevator*)arg), person_in_transit->from); //open the door open_door(((Elevator*)arg)); //add the people to the elevator person_in_transit->e = ((Elevator*)arg); //signal the person pthread_mutex_lock(person_in_transit->lock); pthread_cond_signal(person_in_transit->cond); pthread_mutex_unlock(person_in_transit->lock); // have the elevator wait pthread_mutex_lock(((Elevator*)arg)->lock); pthread_cond_wait(((Elevator*)arg)->cond, ((Elevator*)arg)->lock); pthread_mutex_unlock(((Elevator*)arg)->lock); // close door close_door(((Elevator*)arg)); // elevator moves move_to_floor(person_in_transit->e,person_in_transit->to); // open the door once move has completed. open_door(((Elevator*)arg)); // signal the person pthread_mutex_lock(person_in_transit->lock); pthread_cond_signal(person_in_transit->cond); pthread_mutex_unlock(person_in_transit->lock); // block the elevator pthread_mutex_lock(((Elevator*)arg)->lock); pthread_cond_wait(((Elevator*)arg)->cond, ((Elevator*)arg)->lock); pthread_mutex_unlock(((Elevator*)arg)->lock); // close the door close_door(((Elevator*)arg)); // restart. } }
task main() { move_to_bottom(); wait1Msec(2000); do{ if(SensorValue(floor_1) == 1){ move_to_floor(current_floor(), FIRST); } else if(SensorValue(floor_2) == 1){ move_to_floor(current_floor(), SECOND); } else if(SensorValue(floor_3) == 1){ move_to_floor(current_floor(), THIRD); } }while(true); move_motors(0); }
void *elevator(void *arg){ Elevator *e = (Elevator *) arg; Dllist item, next, pickup; Person *p; int direction = 1; pickup = new_dllist(); while(1){ if(e -> onfloor >= top) direction = -1; else if(e -> onfloor <= 1) direction = 1; //printf("\tElevator[%i] on floor %i going %s:\n", // e -> id, e -> onfloor, direction == 1 ? "up": "down"); /* pick people up */ pthread_mutex_lock(lock); item = dll_first(people); while(!dll_empty(people) && item != dll_nil(people)){ next = dll_next(item); p = (Person *) item -> val.v; //printf("\t\tShould I get %s %s going from %i to %i? ", // p -> fname, p -> lname, p -> from, p -> to); if(e -> onfloor == p -> from){ if(p -> to > e -> onfloor && direction == 1 || p -> to < e -> onfloor && direction == -1){ dll_append(pickup, item -> val); dll_delete_node(item); //printf("yes!\n"); } //else printf("no!\n"); } //else printf("no!\n"); item = next; } pthread_mutex_unlock(lock); item = dll_first(pickup); while(!dll_empty(pickup) && item != dll_nil(pickup)){ next = dll_next(item); p = (Person *) item -> val.v; if(!e -> door_open) open_door(e); pthread_mutex_lock(p -> lock); p -> e = e; pthread_cond_signal(p -> cond); pthread_mutex_lock(e -> lock); pthread_mutex_unlock(p -> lock); pthread_cond_wait(e -> cond, e -> lock); pthread_mutex_unlock(e -> lock); dll_delete_node(item); item = next; } if(e -> door_open) close_door(e); move_to_floor(e, e -> onfloor + direction); /* drop people off */ item = dll_first(e -> people); while(!dll_empty(e -> people) && item != dll_nil(e -> people)){ next = dll_next(item); p = (Person *) item -> val.v; if(p -> to == e -> onfloor){ if(!e -> door_open) open_door(e); pthread_mutex_lock(p -> lock); pthread_cond_signal(p -> cond); pthread_mutex_lock(e -> lock); pthread_mutex_unlock(p -> lock); pthread_cond_wait(e -> cond, e -> lock); pthread_mutex_unlock(e -> lock); } item = next; } //if(e -> door_open) close_door(e); } return NULL; }