A mort les state, mais la préemption est toujours forte vis-à-vis des résidents

This commit is contained in:
Aethor 2018-06-22 00:04:52 +02:00
parent 036d4b55b7
commit 7b2e3432ea
2 changed files with 19 additions and 7 deletions

View File

@ -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");} 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 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_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); elevator_number = this->get_inside_elevator(this, origin, passenger);
if (elevator_number != -1){ //passenger accepted in elevator 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) 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); 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 //reloading fire
this->waiting_floors[origin]--;
this->go_to_floor(this, origin, destination, passenger); this->go_to_floor(this, origin, destination, passenger);
} }

View File

@ -37,8 +37,8 @@ void add_passenger_Elevator(THIS(Elevator), Passenger * passenger){
passenger->get_name(passenger), passenger->get_name(passenger),
this->get_floor(this), this->get_floor(this),
this->passengers->get_size(this->passengers), this->name); this->passengers->get_size(this->passengers), this->name);
if (this->passengers->get_size(this->passengers) >= MAX_ELEVATOR_CAPACITY) /*if (this->passengers->get_size(this->passengers) >= MAX_ELEVATOR_CAPACITY)
this->set_state(this, SLEEPING); this->set_state(this, SLEEPING);*/
pthread_mutex_unlock(&this->mutex_passengers); 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); pthread_mutex_lock(&this->mutex_floor);
permission = (this->passengers->get_size(this->passengers) < MAX_ELEVATOR_CAPACITY && 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_floor);
pthread_mutex_unlock(&this->mutex_state); pthread_mutex_unlock(&this->mutex_state);
pthread_mutex_unlock(&this->mutex_passengers); 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); printf("Initialisation de l'ascenseur %s\n", this->name);
for (;;){ for (;;){
building->signal_elevator_at_floor(data->main_building, this->get_floor(this)); building->signal_elevator_at_floor(data->main_building, this->get_floor(this));
usleep(500000);
if(this->target_floor == this->get_floor(this)){ if(this->target_floor == this->get_floor(this)){
if((next_passenger_stop = this->get_next_passenger_stop(this)) != -1){ next_passenger_stop = this->get_next_passenger_stop(this);
this->target_floor = next_passenger_stop; next_call = building->get_next_call(building, this->floor);
}else if((next_call = building->get_next_call(building, this->floor)) != -1){ if (!(next_passenger_stop == this->get_floor(this) || next_call == this->get_floor(this))){
this->target_floor = next_call; 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){ if(this->get_floor(this) != this->target_floor){
this->set_floor(this, this->target_floor); this->set_floor(this, this->target_floor);