1
0
mirror of https://gitlab.com/klmp200/LO41.git synced 2024-11-21 16:23:22 +00:00

Pthread KILL

This commit is contained in:
Antoine Bartuccio 2018-06-15 19:14:30 +02:00
parent 415ef4807c
commit 3126e57610
Signed by: klmp200
GPG Key ID: E7245548C53F904B
7 changed files with 37 additions and 6 deletions

View File

@ -122,8 +122,10 @@ void _free__Building(THIS(Building)){
DELETE(this->visitors); DELETE(this->visitors);
for (i=0; i<ELEVATOR_NB; i++) for (i=0; i<ELEVATOR_NB; i++)
DELETE(this->elevators[i]); DELETE(this->elevators[i]);
for (i=0; i<FLOORS; i++) for (i=0; i<FLOORS; i++) {
pthread_cond_destroy(this->condition_floors[i]);
free(this->condition_floors[i]); free(this->condition_floors[i]);
}
free(this->condition_floors); free(this->condition_floors);
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);
@ -156,7 +158,7 @@ void go_to_floor_Building(THIS(Building), int origin, int destination, Passenger
int elevator_number; int elevator_number;
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 || origin >= 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");}
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, type); elevator_number = this->get_inside_elevator(this, origin, passenger, type);

View File

@ -71,6 +71,8 @@ void *runnable_Elevator(void * void_this){
Elevator * this = (Elevator*) void_this; Elevator * this = (Elevator*) void_this;
SharedData * data = GET_INSTANCE(SharedData); SharedData * data = GET_INSTANCE(SharedData);
AGENT_OPTIONS
printf("Je suis l'ascenseur %s\n", this->name); printf("Je suis l'ascenseur %s\n", this->name);
for (;;) for (;;)
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));
@ -79,7 +81,6 @@ void *runnable_Elevator(void * void_this){
Elevator *_init_Elevator(char * name){ Elevator *_init_Elevator(char * name){
Elevator * new_elevator = malloc_or_die(sizeof(Elevator)); Elevator * new_elevator = malloc_or_die(sizeof(Elevator));
new_elevator->state = WAITING;
new_elevator->name = strdup(name); new_elevator->name = strdup(name);
new_elevator->passenger_ids = NEW(List); new_elevator->passenger_ids = NEW(List);
pthread_mutex_init(&new_elevator->mutex_passenger, NULL); pthread_mutex_init(&new_elevator->mutex_passenger, NULL);
@ -98,5 +99,8 @@ Elevator *_init_Elevator(char * name){
repair repair
); );
new_elevator->set_floor(new_elevator, 0);
new_elevator->set_state(new_elevator, WAITING);
return new_elevator; return new_elevator;
} }

View File

@ -11,3 +11,8 @@ void *malloc_or_die(size_t size){
} }
return ptr; return ptr;
} }
void agent_exit(int error_code){
printf("Agent receiving code %d, exiting\n", error_code);
pthread_exit(NULL);
}

View File

@ -8,6 +8,9 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <signal.h> #include <signal.h>
#include <pthread.h>
void agent_exit(int error_code);
#define NEW(type, ...) _init_##type(__VA_ARGS__) #define NEW(type, ...) _init_##type(__VA_ARGS__)
#define GET_INSTANCE(type, ...) _get_instance_##type(__VA_ARGS__) #define GET_INSTANCE(type, ...) _get_instance_##type(__VA_ARGS__)
@ -15,7 +18,15 @@
#define DESTRUCTOR(type) void (*_free_)(struct o_##type *this) #define DESTRUCTOR(type) void (*_free_)(struct o_##type *this)
#define THIS(type) type *this #define THIS(type) type *this
#define _THIS(type) struct o_##type *this #define _THIS(type) struct o_##type *this
#define CRASH(message) perror(message); raise(SIGINT) #define CRASH(message) perror(message); raise(SIGINT); pthread_exit(NULL)
#define AGENT_OPTIONS sigset_t set; \
sigemptyset(&set); \
sigaddset(&set, SIGINT); \
signal(SIGUSR1, agent_exit); \
pthread_sigmask(SIG_BLOCK, &set, NULL); \
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); \
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
#define SYNCHRONIZE #define SYNCHRONIZE
#define PRIVATE #define PRIVATE

View File

@ -3,6 +3,7 @@
// //
#include <string.h> #include <string.h>
#include <pthread.h>
#include "Resident.h" #include "Resident.h"
GETTER(Resident, char *, name); GETTER(Resident, char *, name);
@ -11,6 +12,9 @@ GETTER(Resident, int, apartment_floor);
void * runnable_Resident(void * void_this){ void * runnable_Resident(void * void_this){
Resident * this = (Resident*) void_this; Resident * this = (Resident*) void_this;
AGENT_OPTIONS
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);
return NULL; return NULL;

View File

@ -81,8 +81,10 @@ int use_call_box_SharedData(THIS(SharedData), char * resident_name){
void _free__SharedData(THIS(SharedData)){ void _free__SharedData(THIS(SharedData)){
int i; int i;
if (this->threads != NULL){ if (this->threads != NULL){
for (i=0; i<this->threads_nb; i++) for (i=0; i<this->threads_nb; i++) {
pthread_cancel(this->threads[i]); printf("Quitting thread %d\n", (int) this->threads[i]);
pthread_kill(this->threads[i], SIGUSR1);
}
free(this->threads); free(this->threads);
} }
if (this->main_building != NULL) if (this->main_building != NULL)

View File

@ -13,6 +13,9 @@ void * runnable_Visitor(void * void_this){
Visitor *this = (Visitor*) void_this; Visitor *this = (Visitor*) void_this;
SharedData * data = GET_INSTANCE(SharedData); SharedData * data = GET_INSTANCE(SharedData);
Passenger passenger; Passenger passenger;
AGENT_OPTIONS
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);