mirror of
https://gitlab.com/klmp200/LO41.git
synced 2024-11-24 10:04:21 +00:00
Le réparateur, j'ai pas testé lol
This commit is contained in:
parent
6b7bb7e119
commit
3334f77d22
@ -3,6 +3,7 @@
|
|||||||
//
|
//
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <unistd.h>
|
||||||
#include "Building.h"
|
#include "Building.h"
|
||||||
#include "../Resident/Resident.h"
|
#include "../Resident/Resident.h"
|
||||||
#include "../Visitor/Visitor.h"
|
#include "../Visitor/Visitor.h"
|
||||||
@ -150,6 +151,9 @@ void _free__Building(THIS(Building)){
|
|||||||
pthread_mutex_unlock(&this->mutex_waiting_floors);
|
pthread_mutex_unlock(&this->mutex_waiting_floors);
|
||||||
pthread_mutex_destroy(&this->mutex_waiting_floors);
|
pthread_mutex_destroy(&this->mutex_waiting_floors);
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&this->mutex_repair);
|
||||||
|
pthread_mutex_destroy(&this->mutex_repair);
|
||||||
|
|
||||||
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++)
|
||||||
@ -236,6 +240,15 @@ void signal_elevator_at_floor_Building(THIS(Building), int floor){
|
|||||||
pthread_cond_signal(this->condition_floors[floor]);
|
pthread_cond_signal(this->condition_floors[floor]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ask_elevator_reparation_Building(THIS(Building), Elevator* elevator){
|
||||||
|
printf("Technicien : l'ascenseur %s attend pour se faire réparer\n", elevator->name);
|
||||||
|
pthread_mutex_lock(&this->mutex_repair);
|
||||||
|
usleep(10000);
|
||||||
|
elevator->repair(elevator);
|
||||||
|
pthread_mutex_unlock(&this->mutex_repair);
|
||||||
|
printf("Technicien : l'ascenseur %s est maintenant réparé\n", elevator->name);
|
||||||
|
}
|
||||||
|
|
||||||
Building *_init_Building(char * residents_file, char * visitors_file){
|
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[] = "@";
|
||||||
@ -245,6 +258,7 @@ Building *_init_Building(char * residents_file, char * visitors_file){
|
|||||||
for (i=0; i<FLOORS; i++)
|
for (i=0; i<FLOORS; i++)
|
||||||
new_building->waiting_floors[i] = 0;
|
new_building->waiting_floors[i] = 0;
|
||||||
pthread_mutex_init(&new_building->mutex_waiting_floors, NULL);
|
pthread_mutex_init(&new_building->mutex_waiting_floors, NULL);
|
||||||
|
pthread_mutex_init(&new_building->mutex_repair, NULL);
|
||||||
|
|
||||||
new_building->elevators = malloc_or_die(sizeof(Elevator*) * ELEVATOR_NB);
|
new_building->elevators = malloc_or_die(sizeof(Elevator*) * ELEVATOR_NB);
|
||||||
|
|
||||||
@ -273,14 +287,15 @@ 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,
|
||||||
get_next_call,
|
get_next_call,
|
||||||
get_waiting_floors,
|
get_waiting_floors,
|
||||||
signal_elevator_at_floor
|
signal_elevator_at_floor,
|
||||||
|
ask_elevator_reparation
|
||||||
)
|
)
|
||||||
|
|
||||||
if (residents_file != NULL)
|
if (residents_file != NULL)
|
||||||
|
@ -22,6 +22,7 @@ typedef struct o_Building {
|
|||||||
PRIVATE List * visitors;
|
PRIVATE List * visitors;
|
||||||
PRIVATE Elevator ** elevators;
|
PRIVATE Elevator ** elevators;
|
||||||
PRIVATE pthread_mutex_t mutex_waiting_floors;
|
PRIVATE pthread_mutex_t mutex_waiting_floors;
|
||||||
|
PRIVATE pthread_mutex_t mutex_repair;
|
||||||
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;
|
||||||
@ -37,6 +38,8 @@ typedef struct o_Building {
|
|||||||
PUBLIC int (*get_next_call)(_THIS(Building), int elevator_floor);
|
PUBLIC int (*get_next_call)(_THIS(Building), int elevator_floor);
|
||||||
PUBLIC int* (*get_waiting_floors)(_THIS(Building));
|
PUBLIC int* (*get_waiting_floors)(_THIS(Building));
|
||||||
|
|
||||||
|
SYNCHRONIZE PUBLIC void (*ask_elevator_reparation)(_THIS(Building), Elevator* elevator);
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
DESTRUCTOR(Building);
|
DESTRUCTOR(Building);
|
||||||
|
@ -8,4 +8,4 @@ if(CMAKE_COMPILER_IS_GNUCC)
|
|||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_executable(LO41 main.c List/List.h List/List.c Objects.h List/Element.c List/Element.h Objects.c Building/Building.c Building/Building.h Elevator/Elevator.c Elevator/Elevator.h SharedData/SharedData.c SharedData/SharedData.h Visitor/Visitor.c Visitor/Visitor.h Resident/Resident.c Resident/Resident.h Passenger/Passenger.h Passenger/Passenger.c)
|
add_executable(LO41 main.c List/List.h List/List.c Objects.h List/Element.c List/Element.h Objects.c Building/Building.c Building/Building.h Elevator/Elevator.c Elevator/Elevator.h SharedData/SharedData.c SharedData/SharedData.h Visitor/Visitor.c Visitor/Visitor.h Resident/Resident.c Resident/Resident.h Passenger/Passenger.h Passenger/Passenger.c ElevatorBreaker/ElevatorBreaker.c ElevatorBreaker/ElevatorBreaker.h)
|
@ -121,6 +121,10 @@ void repair_Elevator(THIS(Elevator)){
|
|||||||
this->set_state(this, RUNNING);
|
this->set_state(this, RUNNING);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void damage_Elevator(THIS(Elevator)){
|
||||||
|
this->set_state(this, BROKEN);
|
||||||
|
}
|
||||||
|
|
||||||
void *runnable_Elevator(void * void_this){
|
void *runnable_Elevator(void * void_this){
|
||||||
/* This is where the thread logic will be implemented */
|
/* This is where the thread logic will be implemented */
|
||||||
Elevator * this = (Elevator*) void_this;
|
Elevator * this = (Elevator*) void_this;
|
||||||
@ -196,6 +200,7 @@ Elevator *_init_Elevator(char * name){
|
|||||||
get_floor,
|
get_floor,
|
||||||
set_floor,
|
set_floor,
|
||||||
repair,
|
repair,
|
||||||
|
damage,
|
||||||
set_thread_number
|
set_thread_number
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@ typedef struct o_Elevator {
|
|||||||
SYNCHRONIZE PRIVATE int (*get_next_passenger_stop)(_THIS(Elevator));
|
SYNCHRONIZE PRIVATE int (*get_next_passenger_stop)(_THIS(Elevator));
|
||||||
|
|
||||||
SYNCHRONIZE PUBLIC void (*repair)(_THIS(Elevator));
|
SYNCHRONIZE PUBLIC void (*repair)(_THIS(Elevator));
|
||||||
|
SYNCHRONIZE PUBLIC void (*damage)(_THIS(Elevator));
|
||||||
SYNCHRONIZE PUBLIC int (*get_number_of_passengers)(_THIS(Elevator));
|
SYNCHRONIZE PUBLIC int (*get_number_of_passengers)(_THIS(Elevator));
|
||||||
SYNCHRONIZE PUBLIC void (*remove_passenger) (_THIS(Elevator), Passenger * passenger);
|
SYNCHRONIZE PUBLIC void (*remove_passenger) (_THIS(Elevator), Passenger * passenger);
|
||||||
SYNCHRONIZE PUBLIC void (*add_passenger)(_THIS(Elevator), Passenger * passenger);
|
SYNCHRONIZE PUBLIC void (*add_passenger)(_THIS(Elevator), Passenger * passenger);
|
||||||
|
47
ElevatorBreaker/ElevatorBreaker.c
Normal file
47
ElevatorBreaker/ElevatorBreaker.c
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
//
|
||||||
|
// Created by Antoine Bartuccio on 22/06/2018.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "ElevatorBreaker.h"
|
||||||
|
#include "../SharedData/SharedData.h"
|
||||||
|
|
||||||
|
SETTER(ElevatorBreaker, int, thread_number);
|
||||||
|
|
||||||
|
void _free__ElevatorBreaker(THIS(ElevatorBreaker)){
|
||||||
|
free(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void * runnable_ElevatorBreaker(void * void_this){
|
||||||
|
ElevatorBreaker *this = (ElevatorBreaker*) void_this;
|
||||||
|
Elevator *selected_elevator = NULL;
|
||||||
|
SharedData *data = GET_INSTANCE(SharedData);
|
||||||
|
|
||||||
|
AGENT_OPTIONS
|
||||||
|
|
||||||
|
while (data->is_active_passengers_left(data)){
|
||||||
|
usleep(900000);
|
||||||
|
// One chance out of two to break something
|
||||||
|
if ((rand() % 101) > 50) {
|
||||||
|
selected_elevator = data->get_main_building(data)->elevators[rand() % ELEVATOR_NB];
|
||||||
|
selected_elevator->damage(selected_elevator);
|
||||||
|
printf("ALERTE : L'ascenseur %s est endommagé\n", selected_elevator->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data->unregister_thread(data, this->thread_number);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ElevatorBreaker *_init_ElevatorBreaker(){
|
||||||
|
ElevatorBreaker *new_elevator_breaker = malloc_or_die(sizeof(ElevatorBreaker));
|
||||||
|
new_elevator_breaker->thread_number = -1;
|
||||||
|
|
||||||
|
LINK_ALL(ElevatorBreaker, new_elevator_breaker,
|
||||||
|
set_thread_number,
|
||||||
|
runnable
|
||||||
|
)
|
||||||
|
|
||||||
|
return new_elevator_breaker;
|
||||||
|
}
|
22
ElevatorBreaker/ElevatorBreaker.h
Normal file
22
ElevatorBreaker/ElevatorBreaker.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
//
|
||||||
|
// Created by Antoine Bartuccio on 22/06/2018.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef LO41_ELEVATORBREAKER_H
|
||||||
|
#define LO41_ELEVATORBREAKER_H
|
||||||
|
|
||||||
|
#include "../Objects.h"
|
||||||
|
|
||||||
|
typedef struct o_ElevatorBreaker {
|
||||||
|
PRIVATE int thread_number;
|
||||||
|
|
||||||
|
PUBLIC void * (*runnable)(void * void_this);
|
||||||
|
PUBLIC void (*set_thread_number)(_THIS(ElevatorBreaker), int data);
|
||||||
|
|
||||||
|
DESTRUCTOR(ElevatorBreaker);
|
||||||
|
|
||||||
|
} ElevatorBreaker;
|
||||||
|
|
||||||
|
ElevatorBreaker *_init_ElevatorBreaker();
|
||||||
|
|
||||||
|
#endif //LO41_ELEVATORBREAKER_H
|
@ -46,8 +46,13 @@ void start_all_threads_SharedData(THIS(SharedData)){
|
|||||||
|
|
||||||
pthread_mutex_lock(&this->mutex_active_passengers);
|
pthread_mutex_lock(&this->mutex_active_passengers);
|
||||||
pthread_mutex_lock(&this->mutex_threads);
|
pthread_mutex_lock(&this->mutex_threads);
|
||||||
|
|
||||||
|
/* starting the elevator breaker */
|
||||||
|
this->start_thread(this, this->elevator_breaker->runnable, this->elevator_breaker, 0);
|
||||||
|
this->elevator_breaker->set_thread_number(this->elevator_breaker, 0);
|
||||||
|
|
||||||
/* starts threading elevators */
|
/* starts threading elevators */
|
||||||
for (i=0; i<ELEVATOR_NB; i++) {
|
for (i=1; i<ELEVATOR_NB; i++) {
|
||||||
this->start_thread(this, this->main_building->elevators[i]->runnable,
|
this->start_thread(this, this->main_building->elevators[i]->runnable,
|
||||||
this->main_building->elevators[i], i);
|
this->main_building->elevators[i], i);
|
||||||
this->main_building->elevators[i]->set_thread_number(this->main_building->elevators[i], i);
|
this->main_building->elevators[i]->set_thread_number(this->main_building->elevators[i], i);
|
||||||
@ -105,6 +110,8 @@ void _free__SharedData(THIS(SharedData)){
|
|||||||
if (this->main_building != NULL)
|
if (this->main_building != NULL)
|
||||||
DELETE(this->main_building);
|
DELETE(this->main_building);
|
||||||
|
|
||||||
|
DELETE(this->elevator_breaker);
|
||||||
|
|
||||||
pthread_mutex_unlock(&this->mutex_active_passengers);
|
pthread_mutex_unlock(&this->mutex_active_passengers);
|
||||||
pthread_mutex_destroy(&this->mutex_active_passengers);
|
pthread_mutex_destroy(&this->mutex_active_passengers);
|
||||||
pthread_mutex_unlock(&this->mutex_threads);
|
pthread_mutex_unlock(&this->mutex_threads);
|
||||||
@ -143,6 +150,7 @@ SharedData *_get_instance_SharedData(){
|
|||||||
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;
|
new_shared_data->active_passengers = 0;
|
||||||
|
new_shared_data->elevator_breaker = NEW(ElevatorBreaker);
|
||||||
|
|
||||||
pthread_mutex_init(&new_shared_data->mutex_active_passengers, NULL);
|
pthread_mutex_init(&new_shared_data->mutex_active_passengers, NULL);
|
||||||
pthread_mutex_init(&new_shared_data->mutex_threads, NULL);
|
pthread_mutex_init(&new_shared_data->mutex_threads, NULL);
|
||||||
|
@ -8,10 +8,12 @@
|
|||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include "../Objects.h"
|
#include "../Objects.h"
|
||||||
#include "../Building/Building.h"
|
#include "../Building/Building.h"
|
||||||
|
#include "../ElevatorBreaker/ElevatorBreaker.h"
|
||||||
|
|
||||||
typedef struct o_SharedData {
|
typedef struct o_SharedData {
|
||||||
PRIVATE int threads_nb;
|
PRIVATE int threads_nb;
|
||||||
PRIVATE int active_passengers;
|
PRIVATE int active_passengers;
|
||||||
|
PRIVATE ElevatorBreaker * elevator_breaker;
|
||||||
PRIVATE pthread_t ** threads;
|
PRIVATE pthread_t ** threads;
|
||||||
PRIVATE Building * main_building;
|
PRIVATE Building * main_building;
|
||||||
PRIVATE pthread_mutex_t mutex_active_passengers;
|
PRIVATE pthread_mutex_t mutex_active_passengers;
|
||||||
|
2
main.c
2
main.c
@ -1,5 +1,6 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
#include "Objects.h"
|
#include "Objects.h"
|
||||||
#include "List/List.h"
|
#include "List/List.h"
|
||||||
@ -17,6 +18,7 @@ void clean_exit(int error_code){
|
|||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
SharedData * shared_data = GET_INSTANCE(SharedData);
|
SharedData * shared_data = GET_INSTANCE(SharedData);
|
||||||
|
|
||||||
|
srand((unsigned int) time(NULL));
|
||||||
signal(SIGINT, clean_exit);
|
signal(SIGINT, clean_exit);
|
||||||
if(argc == 3){
|
if(argc == 3){
|
||||||
shared_data->set_main_building(shared_data, NEW(Building, argv[1], argv[2]));
|
shared_data->set_main_building(shared_data, NEW(Building, argv[1], argv[2]));
|
||||||
|
Loading…
Reference in New Issue
Block a user