From 22e40654fadb2373697742e0ff8deb6ad87c6601 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Sat, 18 Jan 2025 17:04:56 +0100 Subject: Add handling for times_must_eat --- philo/src/simulation.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) (limited to 'philo/src/simulation.c') diff --git a/philo/src/simulation.c b/philo/src/simulation.c index 943d38c..75bbe12 100644 --- a/philo/src/simulation.c +++ b/philo/src/simulation.c @@ -6,17 +6,22 @@ /* By: dkaiser philo->last_time_eaten + philo->data->time_to_die) + { philo->is_alive = 0; ft_log(philo->id, "has died"); philo->data->simulation_running = 0; + return (1); + } + return (0); } void philo_eat(t_philo *philo) @@ -25,17 +30,15 @@ void philo_eat(t_philo *philo) t_fork *right_fork; int started_eating; int tte; - int ttd; left_fork = &philo->data->forks[philo->id - 1]; right_fork = &philo->data->forks[philo->id % philo->data->nbr_of_philos]; - ttd = philo->data->time_to_die; while (!left_fork->available || !right_fork->available) { if (!philo->data->simulation_running) return; - if (ft_cur_time_in_ms() > philo->last_time_eaten + ttd) - return (philo_die(philo)); + if (philo_die(philo)) + return ; usleep(1000); } pthread_mutex_lock(&left_fork->mutex); @@ -50,11 +53,12 @@ void philo_eat(t_philo *philo) started_eating = ft_cur_time_in_ms(); tte = philo->data->time_to_eat; philo->last_time_eaten = started_eating; + philo->times_must_eat -= 1; ft_log(philo->id, "is eating"); while (ft_cur_time_in_ms() < started_eating + tte) { - if (ft_cur_time_in_ms() > philo->last_time_eaten + ttd) - return (philo_die(philo)); + if (philo_die(philo)) + return; usleep(1000); } left_fork->available = 1; @@ -68,16 +72,14 @@ void philo_sleep(t_philo *philo) { int started_sleeping; int tts; - int ttd; started_sleeping = ft_cur_time_in_ms(); tts = philo->data->time_to_sleep; - ttd = philo->data->time_to_die; ft_log(philo->id, "is sleeping"); while (ft_cur_time_in_ms() < started_sleeping + tts) { - if (ft_cur_time_in_ms() > philo->last_time_eaten + ttd) - return (philo_die(philo)); + if (philo_die(philo)) + return; usleep(1000); } } @@ -100,6 +102,14 @@ int *process_philo(void *arg) while (philo->data->simulation_running) { philo_eat(philo); + if (philo->times_must_eat == 0) + { + pthread_mutex_lock(&philo->data->pme_mutex); + philo->data->philos_must_eat -= 1; + if (philo->data->philos_must_eat <= 0) + philo->data->simulation_running = 0; + pthread_mutex_unlock(&philo->data->pme_mutex); + } if (!philo->data->simulation_running) break; philo_sleep(philo); -- cgit v1.2.3