mirror of
				https://gitlab.com/klmp200/LO41.git
				synced 2025-11-04 11:13:06 +00:00 
			
		
		
		
	Le réparateur, j'ai pas testé lol
This commit is contained in:
		@@ -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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -280,7 +294,8 @@ Building *_init_Building(char * residents_file, char * visitors_file){
 | 
				
			|||||||
			 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]));
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user