diff options
Diffstat (limited to 'philo/src/simulation.c')
| -rw-r--r-- | philo/src/simulation.c | 34 |
1 files changed, 22 insertions, 12 deletions
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 <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/17 14:38:04 by dkaiser #+# #+# */ -/* Updated: 2025/01/18 16:37:14 by dkaiser ### ########.fr */ +/* Updated: 2025/01/18 17:02:27 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ #include "philo.h" -void philo_die(t_philo *philo) +int philo_die(t_philo *philo) { + if (ft_cur_time_in_ms() > 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); |
