From 7b2e3432ea6a32a6b8c607eb872a18792faf5e7c Mon Sep 17 00:00:00 2001 From: Aethor Date: Fri, 22 Jun 2018 00:04:52 +0200 Subject: [PATCH] =?UTF-8?q?A=20mort=20les=20state,=20mais=20la=20pr=C3=A9e?= =?UTF-8?q?mption=20est=20toujours=20forte=20vis-=C3=A0-vis=20des=20r?= =?UTF-8?q?=C3=A9sidents?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Building/Building.c | 3 +++ Elevator/Elevator.c | 23 ++++++++++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/Building/Building.c b/Building/Building.c index 406bdd0..d830fc2 100644 --- a/Building/Building.c +++ b/Building/Building.c @@ -199,7 +199,9 @@ void go_to_floor_Building(THIS(Building), int origin, int destination, Passenger if (destination < 0 || destination >= FLOORS) {CRASH("You are trying to reach a non existing floor\n");} this->waiting_floors[origin]++;//on ajoute à la liste des attentes + pthread_mutex_lock(this->mutex_cond_get_inside_elevator); pthread_cond_wait(this->condition_floors[origin], this->mutex_cond_get_inside_elevator); + pthread_mutex_unlock(this->mutex_cond_get_inside_elevator); elevator_number = this->get_inside_elevator(this, origin, passenger); if (elevator_number != -1){ //passenger accepted in elevator @@ -212,6 +214,7 @@ void go_to_floor_Building(THIS(Building), int origin, int destination, Passenger else if (passenger->type == VISITOR) printf("Le visiteur %s à l'étage %d n'a pas pu rentrer dans un ascenseur. Préempté !\n", passenger->get_name(passenger), origin); //reloading fire + this->waiting_floors[origin]--; this->go_to_floor(this, origin, destination, passenger); } diff --git a/Elevator/Elevator.c b/Elevator/Elevator.c index 9f5779b..31dd3ed 100644 --- a/Elevator/Elevator.c +++ b/Elevator/Elevator.c @@ -37,8 +37,8 @@ void add_passenger_Elevator(THIS(Elevator), Passenger * passenger){ passenger->get_name(passenger), this->get_floor(this), this->passengers->get_size(this->passengers), this->name); - if (this->passengers->get_size(this->passengers) >= MAX_ELEVATOR_CAPACITY) - this->set_state(this, SLEEPING); + /*if (this->passengers->get_size(this->passengers) >= MAX_ELEVATOR_CAPACITY) + this->set_state(this, SLEEPING);*/ pthread_mutex_unlock(&this->mutex_passengers); } @@ -107,8 +107,10 @@ int can_get_inside_Elevator(THIS(Elevator), int floor){ pthread_mutex_lock(&this->mutex_floor); permission = (this->passengers->get_size(this->passengers) < MAX_ELEVATOR_CAPACITY && - this->state == WAITING && this->floor == floor); + /*this->state == WAITING &&*/ this->floor == floor); + if(this->floor != floor) + printf("DEBUG : Cause de la préemption : l'ascenseur %s n'est pas là !\n", this->name); pthread_mutex_unlock(&this->mutex_floor); pthread_mutex_unlock(&this->mutex_state); pthread_mutex_unlock(&this->mutex_passengers); @@ -134,12 +136,19 @@ void *runnable_Elevator(void * void_this){ printf("Initialisation de l'ascenseur %s\n", this->name); for (;;){ building->signal_elevator_at_floor(data->main_building, this->get_floor(this)); + usleep(500000); if(this->target_floor == this->get_floor(this)){ - if((next_passenger_stop = this->get_next_passenger_stop(this)) != -1){ - this->target_floor = next_passenger_stop; - }else if((next_call = building->get_next_call(building, this->floor)) != -1){ - this->target_floor = next_call; + next_passenger_stop = this->get_next_passenger_stop(this); + next_call = building->get_next_call(building, this->floor); + if (!(next_passenger_stop == this->get_floor(this) || next_call == this->get_floor(this))){ + printf("Ascenseur %s attends pour déposer ou prendre un pasager supplémentaire\n", this->name); + if(next_passenger_stop != -1){ + this->target_floor = next_passenger_stop; + }else if(next_call != -1){ + this->target_floor = next_call; + } } + } if(this->get_floor(this) != this->target_floor){ this->set_floor(this, this->target_floor);