From ab17d4fa0e8c9c0aba7fbca36b4a2881b8535da8 Mon Sep 17 00:00:00 2001 From: klmp200 Date: Fri, 15 Jun 2018 11:50:38 +0200 Subject: [PATCH] Petit refactor avec des signaux --- Building/Building.c | 15 +++++++++------ Elevator/Elevator.c | 15 +++++++++++++-- Elevator/Elevator.h | 6 ++++-- List/List.c | 16 +++++++++++++++- List/List.h | 2 ++ Objects.c | 5 +++-- Objects.h | 3 ++- SharedData/SharedData.c | 3 ++- Visitor/Visitor.c | 6 +++++- main.c | 2 +- 10 files changed, 56 insertions(+), 17 deletions(-) diff --git a/Building/Building.c b/Building/Building.c index 1136fe4..fe2e1d1 100644 --- a/Building/Building.c +++ b/Building/Building.c @@ -38,8 +38,9 @@ void parse_residents_Building(THIS(Building), char * file){ char * trash; int i = 0; - if (f == NULL) + if (f == NULL) { CRASH("File for residents does not exist"); + } while (getline(&line, &len, f) > 0) { remove_end_char(line, '\n'); @@ -68,8 +69,9 @@ void parse_visitors_Building(THIS(Building), char * file){ char * line = NULL; int i = 0; - if (f == NULL) + if (f == NULL) { CRASH("File for visitors does not exist"); + } while (getline(&line, &len, f) > 0) { remove_end_char(line, '\n'); @@ -131,9 +133,10 @@ int get_inside_elevator_Building(THIS(Building), int current_floor, Passenger pa /* Make assumption that a waiting elevator is not full */ for (i=0; ielevators[i]->get_floor(this->elevators[i]) == current_floor && - this->elevators[i]->get_state(this->elevators[i]) == waiting){ + this->elevators[i]->get_state(this->elevators[i]) == WAITING){ /* pour faire taire le compilateur le temps que je revienne sur cette fonction */ - printf("visiteur %s, de type %d\n", passenger.visitor->name, type); + if (type == VISITOR) + this->elevators[i]->add_passenger(this->elevators[i], passenger.visitor->get_id(passenger.visitor)); /* Il faut faire des trucs ici */ return i; } @@ -144,8 +147,8 @@ int get_inside_elevator_Building(THIS(Building), int current_floor, Passenger pa void go_to_floor_Building(THIS(Building), int origin, int destination, Passenger passenger, PASSENGER_TYPE type){ int elevator_number; - if (origin < 0 || origin >= FLOORS) CRASH("You are trying to start from a non existing floor\n"); - if (destination < 0 || origin >= FLOORS) CRASH("You are trying to reach 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 || origin >= FLOORS) {CRASH("You are trying to reach a non existing floor\n");} pthread_cond_wait(this->condition_floors[origin], this->mutex_get_inside_elevator); elevator_number = this->get_inside_elevator(this, origin, passenger, type); diff --git a/Elevator/Elevator.c b/Elevator/Elevator.c index d6e8895..bdf40f9 100644 --- a/Elevator/Elevator.c +++ b/Elevator/Elevator.c @@ -27,6 +27,16 @@ void _free__Elevator(THIS(Elevator)){ free(this); } +void add_passenger_Elevator(THIS(Elevator), int passenger_id){ + pthread_mutex_lock(&this->mutex_passenger); + this->passenger_ids->insert_tail(this->passenger_ids, ((void *)&passenger_id), sizeof(int)); + printf("Le passager avec l'id %d est entre dans l'ascenseur %s\nIl y a maintenant %d passagers\n", + passenger_id, this->name, this->passenger_ids->get_size(this->passenger_ids)); + if (this->passenger_ids->get_size(this->passenger_ids) >= MAX_ELEVATOR_CAPACITY) + this->set_state(this, SLEEPING); + pthread_mutex_unlock(&this->mutex_passenger); +} + int get_number_of_passengers_Elevator(THIS(Elevator)){ int num; pthread_mutex_lock(&this->mutex_passenger); @@ -40,7 +50,7 @@ int can_get_more_passengers_Elevator(THIS(Elevator)){ } void repair_Elevator(THIS(Elevator)){ - this->set_state(this, running); + this->set_state(this, RUNNING); } void *runnable_Elevator(void * void_this){ @@ -52,7 +62,7 @@ void *runnable_Elevator(void * void_this){ Elevator *_init_Elevator(char * name){ Elevator * new_elevator = malloc_or_die(sizeof(Elevator)); - new_elevator->state = waiting; + new_elevator->state = WAITING; new_elevator->name = strdup(name); new_elevator->passenger_ids = NEW(List); pthread_mutex_init(&new_elevator->mutex_passenger, NULL); @@ -63,6 +73,7 @@ Elevator *_init_Elevator(char * name){ runnable, get_number_of_passengers, can_get_more_passengers, + add_passenger, get_state, set_state, get_floor, diff --git a/Elevator/Elevator.h b/Elevator/Elevator.h index 2f670e8..d988ddc 100644 --- a/Elevator/Elevator.h +++ b/Elevator/Elevator.h @@ -9,9 +9,10 @@ #include "../Objects.h" #include "../List/List.h" -#define MAX_ELEVATOR_CAPACITY 10 +//#define MAX_ELEVATOR_CAPACITY 10 +#define MAX_ELEVATOR_CAPACITY 3 -typedef enum {running, waiting, sleeping, broken} ELEVATOR_STATE; +typedef enum {RUNNING, WAITING, SLEEPING, BROKEN} ELEVATOR_STATE; typedef struct o_Elevator { PRIVATE ELEVATOR_STATE state; @@ -29,6 +30,7 @@ typedef struct o_Elevator { SYNCHRONIZE PUBLIC void (*repair)(_THIS(Elevator)); SYNCHRONIZE PUBLIC int (*get_number_of_passengers)(_THIS(Elevator)); + SYNCHRONIZE PUBLIC void (*add_passenger)(_THIS(Elevator), int passenger_id); SYNCHRONIZE PUBLIC ELEVATOR_STATE (*get_state)(_THIS(Elevator)); SYNCHRONIZE PUBLIC int (*get_floor)(_THIS(Elevator)); SYNCHRONIZE PUBLIC int (*can_get_more_passengers)(_THIS(Elevator)); diff --git a/List/List.c b/List/List.c index f042506..abc3175 100644 --- a/List/List.c +++ b/List/List.c @@ -7,6 +7,10 @@ GETTER(List, Element*, head) GETTER(List, Element*, tail) GETTER(List, int, size) +void set_custom_free_List(THIS(List), void (*custom_free)(void *)){ + this->custom_free = custom_free; +} + Element * get_element_List(THIS(List), int index){ Element * current = NULL; int i; @@ -31,7 +35,9 @@ Element * get_element_List(THIS(List), int index){ i--; } } - } else OUTSIDE_BOUNDS; + } else { + OUTSIDE_BOUNDS; + } return current; } @@ -81,6 +87,8 @@ void clear_List(THIS(List)){ void insert_tail_List(THIS(List), void * data, size_t data_size){ /* Create a new element */ Element *new_element = NEW(Element, data, data_size, this); + new_element->data_free = this->custom_free; + if (this->tail == NULL){ this->head = new_element; this->tail = new_element; @@ -94,6 +102,8 @@ void insert_tail_List(THIS(List), void * data, size_t data_size){ void insert_head_List(THIS(List), void * data, size_t data_size){ /* Create a new element */ Element *new_element = NEW(Element, data, data_size, this); + new_element->data_free = this->custom_free; + if (this->head != NULL) this->head->previous = new_element; else @@ -113,6 +123,8 @@ void insert_inside_List(THIS(List), void * data, size_t data_size, int index){ this->insert_tail(this, data, data_size); else if (index < this->size){ new_element = NEW(Element, data, data_size, this); + new_element->data_free = this->custom_free; + old_element = this->get_element(this, index); new_element->previous = old_element->previous; @@ -139,6 +151,7 @@ List *_init_List(){ l->size = 0; l->head = NULL; l->tail = NULL; + l->custom_free = free; LINK_ALL(List, l, get_head, @@ -148,6 +161,7 @@ List *_init_List(){ get_tail_data, get_element, get_element_data, + set_custom_free, insert_inside, insert_tail, insert_head, diff --git a/List/List.h b/List/List.h index ff8847d..6af0f0d 100644 --- a/List/List.h +++ b/List/List.h @@ -17,6 +17,7 @@ struct o_List { PRIVATE Element *head; PRIVATE Element *tail; PRIVATE int size; + PRIVATE void (*custom_free)(void *); PUBLIC Element *(*get_head)(_THIS(List)); PUBLIC Element *(*get_tail)(_THIS(List)); @@ -29,6 +30,7 @@ struct o_List { PUBLIC int (*get_size)(_THIS(List)); + PUBLIC void (*set_custom_free)(_THIS(List), void (*custom_free)(void *)); PUBLIC void (*insert_inside)(_THIS(List), void * data, size_t data_size, int index); PUBLIC void (*insert_tail)(_THIS(List), void * data, size_t data_size); PUBLIC void (*insert_head)(_THIS(List), void * data, size_t data_size); diff --git a/Objects.c b/Objects.c index 4fd490a..3bb8b90 100644 --- a/Objects.c +++ b/Objects.c @@ -6,7 +6,8 @@ void *malloc_or_die(size_t size){ void *ptr = malloc(size); - if (ptr == NULL) - perror("Error allocating object"); + if (ptr == NULL){ + CRASH("Error allocating object"); + } return ptr; } diff --git a/Objects.h b/Objects.h index 246e2a0..f9ca676 100644 --- a/Objects.h +++ b/Objects.h @@ -7,6 +7,7 @@ #include #include +#include #define NEW(type, ...) _init_##type(__VA_ARGS__) #define GET_INSTANCE(type, ...) _get_instance_##type(__VA_ARGS__) @@ -14,7 +15,7 @@ #define DESTRUCTOR(type) void (*_free_)(struct o_##type *this) #define THIS(type) type *this #define _THIS(type) struct o_##type *this -#define CRASH(message) perror(message) +#define CRASH(message) perror(message); raise(SIGINT) #define SYNCHRONIZE #define PRIVATE diff --git a/SharedData/SharedData.c b/SharedData/SharedData.c index 2e98e86..6b911fa 100644 --- a/SharedData/SharedData.c +++ b/SharedData/SharedData.c @@ -35,8 +35,9 @@ void start_all_threads_SharedData(THIS(SharedData)){ List * visitors = NULL; if (this->threads == NULL){ - if (this->main_building == NULL) + if (this->main_building == NULL) { CRASH("No building attached to SharedData and thus no thread can be created\n"); + } else { residents = this->main_building->residents; visitors = this->main_building->visitors; diff --git a/Visitor/Visitor.c b/Visitor/Visitor.c index c77c75a..56752c4 100644 --- a/Visitor/Visitor.c +++ b/Visitor/Visitor.c @@ -12,8 +12,12 @@ GETTER(Visitor, int, id); void * runnable_Visitor(void * void_this){ Visitor *this = (Visitor*) void_this; SharedData * data = GET_INSTANCE(SharedData); + Passenger passenger; + passenger.visitor = this; + 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, 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, VISITOR); return NULL; } diff --git a/main.c b/main.c index ce712f9..0872076 100644 --- a/main.c +++ b/main.c @@ -1,5 +1,4 @@ #include -#include #include #include "Objects.h" @@ -18,6 +17,7 @@ void clean_exit(int error_code){ int main() { SharedData * shared_data = GET_INSTANCE(SharedData); + signal(SIGINT, clean_exit); shared_data->set_main_building(shared_data, NEW(Building, "../residents.txt", "../visitors.txt")); shared_data->start_all_threads(shared_data); shared_data->wait_all_threads(shared_data);