diff --git a/Building/Building.c b/Building/Building.c index 1075032..fcabb1a 100644 --- a/Building/Building.c +++ b/Building/Building.c @@ -135,6 +135,13 @@ void _free__Building(THIS(Building)){ free(this); } +/** + * Tries to make @passenger enter an elevator, passenger being at @current_floor + * @THIS(Building) + * @current_floor the floor where the passenger is trying to enter the elevator + * @passenger the passenger to put in the elevator + * @returns an elevator number ( between 0 and ELEVATOR_NB - 1, inclusive ), -1 if no elevator was found ready to accept the passenger + */ int get_inside_elevator_Building(THIS(Building), int current_floor, Passenger passenger){ int i; /* Make assumption that a waiting elevator is not full */ @@ -143,8 +150,8 @@ int get_inside_elevator_Building(THIS(Building), int current_floor, Passenger pa for (i=0; ielevators[i]->can_get_inside(this->elevators[i], current_floor)){ /* pour faire taire le compilateur le temps que je revienne sur cette fonction */ - if (passenger.type == VISITOR) - this->elevators[i]->add_passenger(this->elevators[i], passenger); + //if (passenger.type == VISITOR) TODO : ??? + this->elevators[i]->add_passenger(this->elevators[i], passenger); /* Il faut faire des trucs ici */ pthread_mutex_unlock(this->mutex_func_get_inside_elevator); return i; @@ -162,20 +169,29 @@ void go_to_floor_Building(THIS(Building), int origin, int destination, Passenger pthread_cond_wait(this->condition_floors[origin], this->mutex_cond_get_inside_elevator); elevator_number = this->get_inside_elevator(this, origin, passenger); - if (passenger.type == RESIDENT) - printf("Le résident %s rentre dans l'ascenseur %s depuis l'étage %d\n", passenger.resident->name, - this->elevators[elevator_number]->name, origin); - else if (passenger.type == VISITOR) - printf("Le visiteur %s rentre dans l'ascenseur %s depuis l'étage %d\n", passenger.visitor->name, - this->elevators[elevator_number]->name, origin); - pthread_cond_wait(this->condition_floors[destination], this->mutex_cond_get_outside_elevator); - if (passenger.type == RESIDENT) - printf("Le résident %s sors de l'ascenseur %s à l'étage %d\n", passenger.resident->name, - this->elevators[elevator_number]->name, destination); - else if (passenger.type == VISITOR) - printf("Le visiteur %s sors de l'ascenseur %s à l'étage %d\n", passenger.visitor->name, - this->elevators[elevator_number]->name, destination); + if (elevator_number != -1){ //passenger accepted in elevator + if (passenger.type == RESIDENT) + printf("Le résident %s rentre dans l'ascenseur %s depuis l'étage %d\n", passenger.resident->name, + this->elevators[elevator_number]->name, origin); + else if (passenger.type == VISITOR) + printf("Le visiteur %s rentre dans l'ascenseur %s depuis l'étage %d\n", passenger.visitor->name, + this->elevators[elevator_number]->name, origin); + + pthread_cond_wait(this->condition_floors[destination], this->mutex_cond_get_outside_elevator); + if (passenger.type == RESIDENT) + printf("Le résident %s sort de l'ascenseur %s à l'étage %d\n", passenger.resident->name, + this->elevators[elevator_number]->name, destination); + else if (passenger.type == VISITOR) + printf("Le visiteur %s sort de l'ascenseur %s à l'étage %d\n", passenger.visitor->name, + this->elevators[elevator_number]->name, destination); + }else{ + if (passenger.type == RESIDENT) + printf("Le résident %s à l'étage %d n'a pas pu rentrer dans un ascenseur. Préempté !\n", passenger.resident->name, origin); + else if (passenger.type == VISITOR) + printf("Le visiteur %s à l'étage %d n'a pas pu rentrer dans un ascenseur. Préempté !\n", passenger.visitor->name, origin); + }//todo : else, remettre en attente ? + } int use_call_box_Building(THIS(Building), char * resident_name){ @@ -239,4 +255,4 @@ Building *_init_Building(char * residents_file, char * visitors_file){ new_building->parse_visitors(new_building, visitors_file); return new_building; -} \ No newline at end of file +} diff --git a/Elevator/Elevator.c b/Elevator/Elevator.c index cdb4715..cf89e32 100644 --- a/Elevator/Elevator.c +++ b/Elevator/Elevator.c @@ -69,7 +69,7 @@ int get_next_floor_Elevator(THIS(Elevator)){ temp_element = this->passengers->get_element(this->passengers, i); temp_passenger = (Passenger*) temp_element->get_data(temp_element); temp_floor = temp_passenger->type == RESIDENT ? temp_passenger->resident->destination : temp_passenger->visitor->destination; - if(abs(this->floor - temp_floor) < min_diff){ + if(abs(this->floor - temp_floor) < min_diff && temp_floor != this->floor){ min_diff = abs(this->floor - temp_floor); next_floor = temp_floor; } @@ -109,8 +109,11 @@ void *runnable_Elevator(void * void_this){ AGENT_OPTIONS printf("Je suis l'ascenseur %s\n", this->name); - for (;;) + for (;;){ data->main_building->signal_elevator_at_floor(data->main_building, this->get_floor(this)); + this->set_floor(this, this->get_next_floor(this)); + } + return NULL; } diff --git a/main.c b/main.c index 0872076..3a80ea4 100644 --- a/main.c +++ b/main.c @@ -14,14 +14,21 @@ void clean_exit(int error_code){ exit(0); } -int main() { +int main(int argc, char* argv[]) { SharedData * shared_data = GET_INSTANCE(SharedData); signal(SIGINT, clean_exit); - shared_data->set_main_building(shared_data, NEW(Building, "../residents.txt", "../visitors.txt")); + if(argc == 3){ + shared_data->set_main_building(shared_data, NEW(Building, argv[1], argv[2])); + } else if (argc == 1){ + shared_data->set_main_building(shared_data, NEW(Building, "../residents.txt", "../visitors.txt")); + } else{ + CRASH("Arguments invalides\nUsage : ./LO41 [residents_file visitors_file]\n"); + } + shared_data->start_all_threads(shared_data); shared_data->wait_all_threads(shared_data); DELETE(shared_data); return 0; -} \ No newline at end of file +} diff --git a/residents.txt b/residents.txt index cc39648..3e52fbd 100644 --- a/residents.txt +++ b/residents.txt @@ -4,4 +4,4 @@ Bro;1;1 Ation;1;3 Anium;1;3 Lyne;1;1 -Crack;2;2 \ No newline at end of file +Crack;2;2