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

View File

@ -11,3 +11,8 @@ void *malloc_or_die(size_t size){
}
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 <stdlib.h>
#include <signal.h>
#include <pthread.h>
void agent_exit(int error_code);
#define NEW(type, ...) _init_##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 THIS(type) 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 PRIVATE

View File

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

View File

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

View File

@ -13,6 +13,9 @@ void * runnable_Visitor(void * void_this){
Visitor *this = (Visitor*) void_this;
SharedData * data = GET_INSTANCE(SharedData);
Passenger passenger;
AGENT_OPTIONS
passenger.visitor = this;
printf("Bonjour, je suis %s et je souhaite rendre visite a %s\n", this->name, this->contact_name);