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:
parent
bd6920d5e9
commit
f6425b271e
@ -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);
|
||||||
|
|
||||||
|
@ -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)){
|
||||||
|
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user