mirror of
https://gitlab.com/klmp200/LO41.git
synced 2024-11-21 16:23:22 +00:00
Pthread KILL
This commit is contained in:
parent
415ef4807c
commit
3126e57610
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
13
Objects.h
13
Objects.h
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user