From: Dominik Kaiser Date: Mon, 27 Jan 2025 13:37:55 +0000 (+0100) Subject: Outsource eating and fix norme again X-Git-Url: https://git.dkaiser.de/?a=commitdiff_plain;h=bf7b86398a99b1f9eea59f10daf00b8dee111502;p=42%2FPhilosophers.git Outsource eating and fix norme again --- diff --git a/philo/src/main.c b/philo/src/main.c index c455f0d..a43fe8d 100644 --- a/philo/src/main.c +++ b/philo/src/main.c @@ -6,7 +6,7 @@ /* By: dkaiser time_to_eat = ft_atoi(argv[3]); data->time_to_sleep = ft_atoi(argv[4]); if (argc == 6) + { data->times_must_eat = ft_atoi(argv[5]); + if (data->times_must_eat < 1) + return (ft_err("times_must_eat can't be negative or zero")); + } else data->times_must_eat = -1; if (data->nbr_of_philos <= 0) diff --git a/philo/src/philo_eat.c b/philo/src/philo_eat.c new file mode 100644 index 0000000..05f2cec --- /dev/null +++ b/philo/src/philo_eat.c @@ -0,0 +1,81 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* philo_eat.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: dkaiser + +static void take_fork(t_philo *philo, t_fork *fork) +{ + pthread_mutex_lock(&fork->mutex); + if (fork->owner == 0) + { + fork->owner = philo->id; + ft_log(philo->id, "has taken a fork"); + } + pthread_mutex_unlock(&fork->mutex); +} + +static void release_fork(t_fork *fork) +{ + pthread_mutex_lock(&fork->mutex); + fork->owner = 0; + pthread_mutex_unlock(&fork->mutex); +} + +static void eat(t_philo *philo, t_fork *left_fork, t_fork *right_fork) +{ + int started_eating; + + ft_log(philo->id, "is eating"); + started_eating = ft_cur_time_in_ms(); + while (ft_cur_time_in_ms() < started_eating + philo->data->time_to_eat) + { + if (!philo->data->simulation_running) + return ; + if (philo_die(philo)) + return ; + usleep(500); + } + philo->last_time_eaten = ft_cur_time_in_ms(); + philo->times_must_eat -= 1; + release_fork(left_fork); + release_fork(right_fork); +} + +void philo_eat(t_philo *philo) +{ + t_fork *left_fork; + t_fork *right_fork; + + left_fork = &philo->data->forks[philo->id - 1]; + right_fork = &philo->data->forks[philo->id % philo->data->nbr_of_philos]; + while (left_fork->owner != philo->id || right_fork->owner != philo->id) + { + if (philo->id % 2 == 0) + take_fork(philo, right_fork); + else if (philo->id % 2 == 1) + usleep(500); + take_fork(philo, left_fork); + take_fork(philo, right_fork); + if (!philo->data->simulation_running) + return ; + if (philo_die(philo)) + return ; + if (left_fork->owner == philo->id && right_fork->owner == philo->id) + break ; + if (philo->id % 2 == 0) + usleep(500); + } + if (philo->data->nbr_of_philos > 1) + eat(philo, left_fork, right_fork); +} diff --git a/philo/src/simulation.c b/philo/src/simulation.c index fd9f40b..71baf51 100644 --- a/philo/src/simulation.c +++ b/philo/src/simulation.c @@ -6,7 +6,7 @@ /* By: dkaiser