1
0
mirror of https://gitlab.com/klmp200/LO41.git synced 2024-11-24 18:14:19 +00:00

Condition de fin des elevators

This commit is contained in:
Antoine Bartuccio 2018-06-22 01:58:11 +02:00
parent bd6920d5e9
commit f6425b271e
Signed by: klmp200
GPG Key ID: E7245548C53F904B
7 changed files with 37 additions and 5 deletions

View File

@ -135,7 +135,6 @@ void _free__Building(THIS(Building)){
this->residents->clear_custom(this->residents, free_resident); this->residents->clear_custom(this->residents, free_resident);
this->visitors->clear_custom(this->visitors, free_visitor); this->visitors->clear_custom(this->visitors, free_visitor);
pthread_mutex_unlock(this->mutex_cond_get_inside_elevator); pthread_mutex_unlock(this->mutex_cond_get_inside_elevator);
pthread_mutex_destroy(this->mutex_cond_get_inside_elevator); pthread_mutex_destroy(this->mutex_cond_get_inside_elevator);

View File

@ -135,7 +135,8 @@ void *runnable_Elevator(void * void_this){
AGENT_OPTIONS AGENT_OPTIONS
printf("Initialisation de l'ascenseur %s\n", this->name); printf("Initialisation de l'ascenseur %s\n", this->name);
for (;;){ while (data->is_active_passengers_left(data)){
// for (;;){
usleep(250000); usleep(250000);
if(this->target_floor == this->get_floor(this)){ if(this->target_floor == this->get_floor(this)){

View File

@ -12,8 +12,8 @@
typedef enum {RESIDENT, VISITOR} PASSENGER_TYPE; typedef enum {RESIDENT, VISITOR} PASSENGER_TYPE;
typedef struct o_Passenger { typedef struct o_Passenger {
PASSENGER_TYPE type; PUBLIC PASSENGER_TYPE type;
union { PUBLIC union {
Resident * resident; Resident * resident;
Visitor * visitor; Visitor * visitor;
}; };

View File

@ -29,6 +29,7 @@ void * runnable_Resident(void * void_this){
printf("Résident %s : je reste chez moi\n", this->name); printf("Résident %s : je reste chez moi\n", this->name);
else else
data->main_building->go_to_floor(data->main_building, this->position, this->destination, passenger); data->main_building->go_to_floor(data->main_building, this->position, this->destination, passenger);
data->decrement_active_passengers(data);
return NULL; return NULL;
} }

View File

@ -41,6 +41,7 @@ void start_all_threads_SharedData(THIS(SharedData)){
this->threads_nb = residents->get_size(residents) + visitors->get_size(visitors) + ELEVATOR_NB; this->threads_nb = residents->get_size(residents) + visitors->get_size(visitors) + ELEVATOR_NB;
this->threads = malloc_or_die(sizeof(pthread_t) * this->threads_nb); this->threads = malloc_or_die(sizeof(pthread_t) * this->threads_nb);
pthread_mutex_lock(&this->mutex_active_passengers);
/* starts threading elevators */ /* starts threading elevators */
for (i=0; i<ELEVATOR_NB; i++) for (i=0; i<ELEVATOR_NB; i++)
this->start_thread(this, this->main_building->elevators[i]->runnable, this->start_thread(this, this->main_building->elevators[i]->runnable,
@ -51,6 +52,7 @@ void start_all_threads_SharedData(THIS(SharedData)){
while (current != NULL){ while (current != NULL){
this->start_thread(this, ((Visitor*)current->get_data(current))->runnable, current->get_data(current), i); this->start_thread(this, ((Visitor*)current->get_data(current))->runnable, current->get_data(current), i);
current = current->get_next(current); current = current->get_next(current);
this->active_passengers++;
i++; i++;
} }
@ -59,8 +61,10 @@ void start_all_threads_SharedData(THIS(SharedData)){
while (current != NULL){ while (current != NULL){
this->start_thread(this, ((Resident*)current->get_data(current))->runnable, current->get_data(current), i); this->start_thread(this, ((Resident*)current->get_data(current))->runnable, current->get_data(current), i);
current = current->get_next(current); current = current->get_next(current);
this->active_passengers++;
i++; i++;
} }
pthread_mutex_unlock(&this->mutex_active_passengers);
} }
} }
} }
@ -87,9 +91,26 @@ void _free__SharedData(THIS(SharedData)){
if (this->main_building != NULL) if (this->main_building != NULL)
DELETE(this->main_building); DELETE(this->main_building);
pthread_mutex_unlock(&this->mutex_active_passengers);
pthread_mutex_destroy(&this->mutex_active_passengers);
free(this); free(this);
} }
int is_active_passengers_left_SharedData(THIS(SharedData)){
int response;
pthread_mutex_lock(&this->mutex_active_passengers);
response = (this->active_passengers > 0);
pthread_mutex_unlock(&this->mutex_active_passengers);
return response;
}
void decrement_active_passengers_SharedData(THIS(SharedData)){
pthread_mutex_lock(&this->mutex_active_passengers);
this->active_passengers--;
pthread_mutex_unlock(&this->mutex_active_passengers);
}
SharedData *_get_instance_SharedData(){ SharedData *_get_instance_SharedData(){
static SharedData * new_shared_data = NULL; static SharedData * new_shared_data = NULL;
if (new_shared_data == NULL){ if (new_shared_data == NULL){
@ -98,6 +119,9 @@ SharedData *_get_instance_SharedData(){
new_shared_data->threads = NULL; new_shared_data->threads = NULL;
new_shared_data->main_building = NULL; /* Should be set to NULL if freed before */ new_shared_data->main_building = NULL; /* Should be set to NULL if freed before */
new_shared_data->threads_nb = 0; new_shared_data->threads_nb = 0;
new_shared_data->active_passengers = 0;
pthread_mutex_init(&new_shared_data->mutex_active_passengers, NULL);
LINK_ALL(SharedData, new_shared_data, LINK_ALL(SharedData, new_shared_data,
start_thread, start_thread,
@ -106,7 +130,9 @@ SharedData *_get_instance_SharedData(){
set_main_building, set_main_building,
get_main_building, get_main_building,
use_call_box, use_call_box,
call_elevator call_elevator,
decrement_active_passengers,
is_active_passengers_left
); );
} }
return new_shared_data; return new_shared_data;

View File

@ -11,8 +11,10 @@
typedef struct o_SharedData { typedef struct o_SharedData {
PRIVATE int threads_nb; PRIVATE int threads_nb;
PRIVATE int active_passengers;
PRIVATE pthread_t *threads; PRIVATE pthread_t *threads;
PRIVATE Building * main_building; PRIVATE Building * main_building;
PRIVATE pthread_mutex_t mutex_active_passengers;
PRIVATE void (*start_thread)(_THIS(SharedData), void * (*thread)(void *), void * data, int thread_number); PRIVATE void (*start_thread)(_THIS(SharedData), void * (*thread)(void *), void * data, int thread_number);
@ -22,6 +24,8 @@ typedef struct o_SharedData {
PUBLIC Building * (*get_main_building)(_THIS(SharedData)); PUBLIC Building * (*get_main_building)(_THIS(SharedData));
PUBLIC int (*call_elevator)(_THIS(SharedData), int starting_floor, int destination_floor); PUBLIC int (*call_elevator)(_THIS(SharedData), int starting_floor, int destination_floor);
PUBLIC int (*use_call_box)(_THIS(SharedData), char * resident_name); PUBLIC int (*use_call_box)(_THIS(SharedData), char * resident_name);
SYNCHRONIZE PUBLIC void (*decrement_active_passengers)(_THIS(SharedData));
SYNCHRONIZE PUBLIC int (*is_active_passengers_left)(_THIS(SharedData));
DESTRUCTOR(SharedData); DESTRUCTOR(SharedData);
} SharedData; } SharedData;

View File

@ -23,6 +23,7 @@ void * runnable_Visitor(void * void_this){
printf("Bonjour, je suis %s et je souhaite rendre visite a %s\n", this->name, this->contact_name); printf("Bonjour, je suis %s et je souhaite rendre visite a %s\n", this->name, this->contact_name);
printf("Bip, %s appel a l'interphone\n%s habite a l'etage %d\n", this->name, this->contact_name, (this->destination = data->use_call_box(data, this->contact_name))); printf("Bip, %s appel a l'interphone\n%s habite a l'etage %d\n", this->name, this->contact_name, (this->destination = data->use_call_box(data, this->contact_name)));
data->main_building->go_to_floor(data->main_building, this->position, this->destination, passenger); data->main_building->go_to_floor(data->main_building, this->position, this->destination, passenger);
data->decrement_active_passengers(data);
return NULL; return NULL;
} }