From a197fdc79c0f07551813ffa306a4c9be17e021eb Mon Sep 17 00:00:00 2001 From: whaffman Date: Mon, 27 Jan 2025 18:38:41 +0100 Subject: [PATCH] mutexes fial --- philo/inc/philo.h | 2 ++ philo/src/create_mutexes.c | 18 ++++++++++++++++++ philo/src/destroy_mutexes.c | 9 ++++++++- philo/src/free_philos.c | 3 +++ philo/src/main.c | 4 ++-- 5 files changed, 33 insertions(+), 3 deletions(-) diff --git a/philo/inc/philo.h b/philo/inc/philo.h index f5ac269..512919c 100644 --- a/philo/inc/philo.h +++ b/philo/inc/philo.h @@ -57,8 +57,10 @@ typedef struct s_philo int death; pthread_mutex_t *death_lock; int last_meal; + pthread_mutex_t *last_meal_lock; t_rules *rules; int n_eat; + pthread_mutex_t *n_eat_lock; } t_philo; // memset, printf, malloc, free, write, diff --git a/philo/src/create_mutexes.c b/philo/src/create_mutexes.c index 21ec089..fbcb2b1 100644 --- a/philo/src/create_mutexes.c +++ b/philo/src/create_mutexes.c @@ -12,6 +12,22 @@ #include "philo.h" +int create_philo_mutexes(t_philo *philo) +{ + philo->death_lock = malloc(sizeof(pthread_mutex_t)); + philo->last_meal_lock = malloc(sizeof(pthread_mutex_t)); + philo->n_eat_lock = malloc(sizeof(pthread_mutex_t)); + if (!philo->death_lock || !philo->last_meal_lock || !philo->n_eat_lock) + return (FAILURE); + if (pthread_mutex_init(philo->death_lock, NULL)) + return (FAILURE); + if (pthread_mutex_init(philo->last_meal_lock, NULL)) + return (FAILURE); + if (pthread_mutex_init(philo->n_eat_lock, NULL)) + return (FAILURE); + return (SUCCESS); +} + int create_mutexes(t_rules *rules) { int i; @@ -25,6 +41,8 @@ int create_mutexes(t_rules *rules) { if (pthread_mutex_init(&rules->forks[i], NULL)) return (FAILURE); + if (create_philo_mutexes(&rules->philos[i]) == FAILURE) + return (FAILURE); i++; } return (SUCCESS); diff --git a/philo/src/destroy_mutexes.c b/philo/src/destroy_mutexes.c index a687857..73cb9fe 100644 --- a/philo/src/destroy_mutexes.c +++ b/philo/src/destroy_mutexes.c @@ -24,7 +24,14 @@ int destroy_mutexes(t_rules *rules) while (i < rules->n_philos) { if (pthread_mutex_destroy(&rules->forks[i])) - return (FAILURE); + return (printf("1"), FAILURE); + if (pthread_mutex_destroy(rules->philos[i].death_lock)) + return (printf("2"), FAILURE); + // pthread_mutex_lock(rules->philos[i].last_meal_lock); + if (pthread_mutex_destroy(rules->philos[i].last_meal_lock)) + return (printf("3: %d\n", i), perror("Error"), FAILURE); + if (pthread_mutex_destroy(rules->philos[i].n_eat_lock)) + return (printf("4"), FAILURE); i++; } return (SUCCESS); diff --git a/philo/src/free_philos.c b/philo/src/free_philos.c index 8fb77c0..84bbf6b 100644 --- a/philo/src/free_philos.c +++ b/philo/src/free_philos.c @@ -19,6 +19,9 @@ void free_philos(t_rules *rules) while (i < rules->n_philos) { free(rules->philos[i].pid); + free(rules->philos[i].death_lock); + free(rules->philos[i].last_meal_lock); + free(rules->philos[i].n_eat_lock); i++; } free(rules->monitor); diff --git a/philo/src/main.c b/philo/src/main.c index eb9cca0..b69fde8 100644 --- a/philo/src/main.c +++ b/philo/src/main.c @@ -18,10 +18,10 @@ int main(int argc, char *argv[]) if (FAILURE == parse_arguments(argc, argv, &rules)) return (printf(ERROR_USAGE), EXIT_FAILURE); - if (FAILURE == create_mutexes(&rules)) - return (printf(ERROR_MUTEX), EXIT_FAILURE); if (FAILURE == create_philos(&rules)) return (printf(ERROR_MALLOC), EXIT_FAILURE); + if (FAILURE == create_mutexes(&rules)) + return (printf(ERROR_MUTEX), EXIT_FAILURE); rules.start_time = get_time() + START_DELAY; pthread_mutex_lock(rules.finished_lock); if (FAILURE == create_threads(&rules))