mirror of
https://gitlab.com/klmp200/LO41.git
synced 2024-11-24 18:14:19 +00:00
du refactor
This commit is contained in:
parent
f066e22419
commit
92c784a76b
@ -8,12 +8,19 @@
|
|||||||
|
|
||||||
#define LINE_BUFFER 256
|
#define LINE_BUFFER 256
|
||||||
|
|
||||||
|
SYNCHRONIZED_GETTER(Building, int*, waiting_floors)
|
||||||
|
|
||||||
void remove_end_char(char * string, char character){
|
void remove_end_char(char * string, char character){
|
||||||
size_t string_size = strlen(string);
|
size_t string_size = strlen(string);
|
||||||
if (string[string_size - 1] == character)
|
if (string[string_size - 1] == character)
|
||||||
string[string_size - 1] = '\0';
|
string[string_size - 1] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int get_target_Building(THIS(Building)){
|
||||||
|
int* waiting_floors = this->get_waiting_floors(this);
|
||||||
|
return waiting_floors[1];
|
||||||
|
}
|
||||||
|
|
||||||
List * split(char * line, char * separator){
|
List * split(char * line, char * separator){
|
||||||
List * split = NEW(List);
|
List * split = NEW(List);
|
||||||
char * to_delete = strdup(line);
|
char * to_delete = strdup(line);
|
||||||
@ -118,6 +125,9 @@ void _free__Building(THIS(Building)){
|
|||||||
pthread_mutex_unlock(this->mutex_func_get_inside_elevator);
|
pthread_mutex_unlock(this->mutex_func_get_inside_elevator);
|
||||||
pthread_mutex_destroy(this->mutex_func_get_inside_elevator);
|
pthread_mutex_destroy(this->mutex_func_get_inside_elevator);
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&this->mutex_waiting_floors);
|
||||||
|
pthread_mutex_destroy(&this->mutex_waiting_floors);
|
||||||
|
|
||||||
DELETE(this->residents);
|
DELETE(this->residents);
|
||||||
DELETE(this->visitors);
|
DELETE(this->visitors);
|
||||||
for (i=0; i<ELEVATOR_NB; i++)
|
for (i=0; i<ELEVATOR_NB; i++)
|
||||||
@ -130,6 +140,7 @@ void _free__Building(THIS(Building)){
|
|||||||
free(this->mutex_cond_get_inside_elevator);
|
free(this->mutex_cond_get_inside_elevator);
|
||||||
free(this->mutex_cond_get_outside_elevator);
|
free(this->mutex_cond_get_outside_elevator);
|
||||||
free(this->mutex_func_get_inside_elevator);
|
free(this->mutex_func_get_inside_elevator);
|
||||||
|
//free(&this->mutex_waiting_floors);
|
||||||
free(this->elevators);
|
free(this->elevators);
|
||||||
|
|
||||||
free(this);
|
free(this);
|
||||||
@ -164,9 +175,9 @@ void go_to_floor_Building(THIS(Building), int origin, int destination, Passenger
|
|||||||
if (origin < 0 || origin >= FLOORS) {CRASH("You are trying to start from a non existing floor\n");}
|
if (origin < 0 || origin >= FLOORS) {CRASH("You are trying to start from a non existing floor\n");}
|
||||||
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");}
|
||||||
|
|
||||||
if(!this->waiting_passengers->contains(this->waiting_passengers, (void*) passenger, passenger->compare)){
|
/*if(!this->waiting_passengers->contains(this->waiting_passengers, (void*) passenger, passenger->compare)){
|
||||||
this->waiting_passengers->insert_tail(this->waiting_passengers, (void*) passenger, sizeof(Passenger));//todo : check if inside list
|
this->waiting_passengers->insert_tail(this->waiting_passengers, (void*) passenger, sizeof(Passenger));//todo : check if inside list
|
||||||
}
|
}*/
|
||||||
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);
|
||||||
|
|
||||||
elevator_number = this->get_inside_elevator(this, origin, passenger);
|
elevator_number = this->get_inside_elevator(this, origin, passenger);
|
||||||
@ -215,8 +226,12 @@ Building *_init_Building(char * residents_file, char * visitors_file){
|
|||||||
Building * new_building = malloc_or_die(sizeof(Building));
|
Building * new_building = malloc_or_die(sizeof(Building));
|
||||||
char elevator_name[] = "@";
|
char elevator_name[] = "@";
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
new_building->floors = FLOORS;
|
new_building->floors = FLOORS;
|
||||||
|
|
||||||
|
for (i=0; i<FLOORS; i++)
|
||||||
|
new_building->waiting_floors[i] = 0;
|
||||||
|
pthread_mutex_init(&new_building->mutex_waiting_floors, NULL);
|
||||||
|
|
||||||
new_building->elevators = malloc_or_die(sizeof(Elevator*) * ELEVATOR_NB);
|
new_building->elevators = malloc_or_die(sizeof(Elevator*) * ELEVATOR_NB);
|
||||||
|
|
||||||
new_building->mutex_cond_get_inside_elevator = malloc_or_die(sizeof(pthread_mutex_t));
|
new_building->mutex_cond_get_inside_elevator = malloc_or_die(sizeof(pthread_mutex_t));
|
||||||
@ -230,7 +245,6 @@ Building *_init_Building(char * residents_file, char * visitors_file){
|
|||||||
new_building->condition_floors = malloc_or_die(sizeof(pthread_cond_t*) * FLOORS);
|
new_building->condition_floors = malloc_or_die(sizeof(pthread_cond_t*) * FLOORS);
|
||||||
new_building->residents = NEW(List);
|
new_building->residents = NEW(List);
|
||||||
new_building->visitors = NEW(List);
|
new_building->visitors = NEW(List);
|
||||||
new_building->waiting_passengers = NEW(List);
|
|
||||||
for (i=0; i<ELEVATOR_NB; i++) {
|
for (i=0; i<ELEVATOR_NB; i++) {
|
||||||
elevator_name[0]++;
|
elevator_name[0]++;
|
||||||
new_building->elevators[i] = NEW(Elevator, elevator_name);
|
new_building->elevators[i] = NEW(Elevator, elevator_name);
|
||||||
@ -243,12 +257,14 @@ Building *_init_Building(char * residents_file, char * visitors_file){
|
|||||||
|
|
||||||
|
|
||||||
LINK_ALL(Building, new_building,
|
LINK_ALL(Building, new_building,
|
||||||
parse_residents,
|
parse_residents,
|
||||||
parse_visitors,
|
parse_visitors,
|
||||||
get_inside_elevator,
|
get_inside_elevator,
|
||||||
use_call_box,
|
use_call_box,
|
||||||
go_to_floor,
|
go_to_floor,
|
||||||
signal_elevator_at_floor
|
get_target,
|
||||||
|
get_waiting_floors,
|
||||||
|
signal_elevator_at_floor
|
||||||
)
|
)
|
||||||
|
|
||||||
if (residents_file != NULL)
|
if (residents_file != NULL)
|
||||||
|
@ -17,10 +17,11 @@
|
|||||||
|
|
||||||
typedef struct o_Building {
|
typedef struct o_Building {
|
||||||
PRIVATE int floors;
|
PRIVATE int floors;
|
||||||
|
PRIVATE int waiting_floors[FLOORS];
|
||||||
PRIVATE List * residents;
|
PRIVATE List * residents;
|
||||||
PRIVATE List * visitors;
|
PRIVATE List * visitors;
|
||||||
PRIVATE List * waiting_passengers;
|
|
||||||
PRIVATE Elevator ** elevators;
|
PRIVATE Elevator ** elevators;
|
||||||
|
PRIVATE pthread_mutex_t mutex_waiting_floors;
|
||||||
PRIVATE pthread_mutex_t * mutex_cond_get_inside_elevator;
|
PRIVATE pthread_mutex_t * mutex_cond_get_inside_elevator;
|
||||||
PRIVATE pthread_mutex_t * mutex_cond_get_outside_elevator;
|
PRIVATE pthread_mutex_t * mutex_cond_get_outside_elevator;
|
||||||
PRIVATE pthread_mutex_t * mutex_func_get_inside_elevator;
|
PRIVATE pthread_mutex_t * mutex_func_get_inside_elevator;
|
||||||
@ -32,6 +33,8 @@ typedef struct o_Building {
|
|||||||
|
|
||||||
PUBLIC int (*use_call_box)(_THIS(Building), char * resident_name);
|
PUBLIC int (*use_call_box)(_THIS(Building), char * resident_name);
|
||||||
PUBLIC void (*signal_elevator_at_floor)(_THIS(Building), int floor);
|
PUBLIC void (*signal_elevator_at_floor)(_THIS(Building), int floor);
|
||||||
|
PUBLIC int (*get_target)(_THIS(Building));
|
||||||
|
PUBLIC int* (*get_waiting_floors)(_THIS(Building));
|
||||||
|
|
||||||
SYNCHRONIZE PUBLIC void (*go_to_floor)(_THIS(Building), int origin, int destination, Passenger * passenger);
|
SYNCHRONIZE PUBLIC void (*go_to_floor)(_THIS(Building), int origin, int destination, Passenger * passenger);
|
||||||
|
|
||||||
|
@ -110,6 +110,7 @@ void *runnable_Elevator(void * void_this){
|
|||||||
|
|
||||||
printf("Je suis l'ascenseur %s\n", this->name);
|
printf("Je suis l'ascenseur %s\n", this->name);
|
||||||
for (;;){
|
for (;;){
|
||||||
|
data->main_building->get_waiting_floors(data->main_building);
|
||||||
data->main_building->signal_elevator_at_floor(data->main_building, this->get_floor(this));
|
data->main_building->signal_elevator_at_floor(data->main_building, this->get_floor(this));
|
||||||
this->set_floor(this, this->get_next_floor(this));
|
this->set_floor(this, this->get_next_floor(this));
|
||||||
}
|
}
|
||||||
|
@ -19,19 +19,21 @@ void * runnable_Resident(void * void_this){
|
|||||||
|
|
||||||
AGENT_OPTIONS;
|
AGENT_OPTIONS;
|
||||||
|
|
||||||
|
this->passenger = passenger;
|
||||||
passenger->resident = this;
|
passenger->resident = this;
|
||||||
passenger->type = RESIDENT;
|
passenger->type = RESIDENT;
|
||||||
|
|
||||||
printf("Je suis le resident %s et je suis a l'etage %d en direction de l'etage %d\n",
|
printf("Je suis le resident %s et je suis a l'etage %d en direction de l'etage %d\n",
|
||||||
this->name, this->apartment_floor, this->destination);
|
this->name, this->apartment_floor, this->destination);
|
||||||
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);
|
||||||
DELETE(passenger);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _free__Resident(THIS(Resident)){
|
void _free__Resident(THIS(Resident)){
|
||||||
if (this->name != NULL)
|
if (this->name != NULL)
|
||||||
free(this->name);
|
free(this->name);
|
||||||
|
if(this->passenger != NULL)
|
||||||
|
free(this->passenger);
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,6 +45,7 @@ Resident *_init_Resident(int id, char* name, int apartment_floor, int destinatio
|
|||||||
new_resident->apartment_floor = apartment_floor;
|
new_resident->apartment_floor = apartment_floor;
|
||||||
new_resident->position = new_resident->apartment_floor;
|
new_resident->position = new_resident->apartment_floor;
|
||||||
new_resident->destination = destination;
|
new_resident->destination = destination;
|
||||||
|
new_resident->passenger = NULL;
|
||||||
|
|
||||||
LINK_ALL(Resident, new_resident,
|
LINK_ALL(Resident, new_resident,
|
||||||
get_name,
|
get_name,
|
||||||
|
@ -13,6 +13,7 @@ typedef struct o_Resident {
|
|||||||
PRIVATE int destination;
|
PRIVATE int destination;
|
||||||
PRIVATE int position;
|
PRIVATE int position;
|
||||||
PRIVATE char* name;
|
PRIVATE char* name;
|
||||||
|
PRIVATE void* passenger;
|
||||||
|
|
||||||
PUBLIC void * (*runnable)(void * void_this);
|
PUBLIC void * (*runnable)(void * void_this);
|
||||||
PUBLIC char * (*get_name)(_THIS(Resident));
|
PUBLIC char * (*get_name)(_THIS(Resident));
|
||||||
|
@ -16,13 +16,13 @@ void * runnable_Visitor(void * void_this){
|
|||||||
Passenger * passenger = NEW(Passenger, (void*) this, VISITOR);
|
Passenger * passenger = NEW(Passenger, (void*) this, VISITOR);
|
||||||
|
|
||||||
AGENT_OPTIONS;
|
AGENT_OPTIONS;
|
||||||
|
this->passenger = (void*) passenger;
|
||||||
|
|
||||||
passenger->visitor = this;
|
passenger->visitor = 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);
|
||||||
DELETE(passenger);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,6 +31,8 @@ void _free__Visitor(THIS(Visitor)){
|
|||||||
free(this->name);
|
free(this->name);
|
||||||
if (this->contact_name != NULL)
|
if (this->contact_name != NULL)
|
||||||
free(this->contact_name);
|
free(this->contact_name);
|
||||||
|
if (this->passenger != NULL)
|
||||||
|
free(this->passenger);
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,6 +42,7 @@ Visitor *_init_Visitor(int id, char* name, char * contact_name){
|
|||||||
new_visitor->id = id;
|
new_visitor->id = id;
|
||||||
new_visitor->position = 0;
|
new_visitor->position = 0;
|
||||||
new_visitor->destination = -1;
|
new_visitor->destination = -1;
|
||||||
|
new_visitor->passenger = NULL;
|
||||||
|
|
||||||
if (contact_name != NULL)
|
if (contact_name != NULL)
|
||||||
new_visitor->contact_name = strdup(contact_name);
|
new_visitor->contact_name = strdup(contact_name);
|
||||||
|
@ -13,6 +13,7 @@ typedef struct o_Visitor {
|
|||||||
PRIVATE char * contact_name;
|
PRIVATE char * contact_name;
|
||||||
PRIVATE int position;
|
PRIVATE int position;
|
||||||
PRIVATE int destination;
|
PRIVATE int destination;
|
||||||
|
PRIVATE void * passenger;
|
||||||
|
|
||||||
PUBLIC void * (*runnable)(void* void_this);
|
PUBLIC void * (*runnable)(void* void_this);
|
||||||
PUBLIC char * (*get_name)(_THIS(Visitor));
|
PUBLIC char * (*get_name)(_THIS(Visitor));
|
||||||
|
Loading…
Reference in New Issue
Block a user