From fcbd39d9b3d4662ab58104f868d3d512847eae14 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Sat, 18 Jan 2025 14:01:36 +0100 Subject: [PATCH] Finish up simulation --- philo/include/philo.h | 3 ++- philo/src/main.c | 3 ++- philo/src/simulation.c | 54 +++++++++++++++++++++++++++++++----------- 3 files changed, 44 insertions(+), 16 deletions(-) diff --git a/philo/include/philo.h b/philo/include/philo.h index 308857b..faf1bbf 100644 --- a/philo/include/philo.h +++ b/philo/include/philo.h @@ -6,7 +6,7 @@ /* By: dkaiser forks[i].available = 1; result = pthread_mutex_init(&(data->forks[i].mutex), NULL); if (result != 0) diff --git a/philo/src/simulation.c b/philo/src/simulation.c index bc417cf..6685957 100644 --- a/philo/src/simulation.c +++ b/philo/src/simulation.c @@ -6,40 +6,59 @@ /* By: dkaiser is_alive = 0; + ft_log(philo->id, "has died"); + philo->data->simulation_running = 0; +} + void philo_eat(t_philo *philo) { t_fork *left_fork; t_fork *right_fork; int started_eating; int tte; + int ttd; left_fork = &philo->data->forks[philo->id]; right_fork = &philo->data->forks[(philo->id + 1) % philo->data->nbr_of_philos]; + ttd = philo->data->time_to_die; while (!left_fork->available || !right_fork->available) { - // die if waiting too long + if (!philo->data->simulation_running) + return; + if (ft_cur_time_in_ms() > philo->last_time_eaten + ttd) + return (philo_die(philo)); + usleep(1000); } pthread_mutex_lock(&left_fork->mutex); pthread_mutex_lock(&right_fork->mutex); - left_fork->available = 0; - ft_log(philo->id, "has taken a fork"); - right_fork->available = 0; - ft_log(philo->id, "has taken a fork"); - started_eating = ft_cur_time_in_ms(); - tte = philo->data->time_to_eat; - ft_log(philo->id, "is eating"); - while (ft_cur_time_in_ms() < started_eating + tte) + if (philo->data->simulation_running) { - usleep(1000); + left_fork->available = 0; + ft_log(philo->id, "has taken a fork"); + right_fork->available = 0; + ft_log(philo->id, "has taken a fork"); + started_eating = ft_cur_time_in_ms(); + tte = philo->data->time_to_eat; + philo->last_time_eaten = started_eating; + 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)); + usleep(1000); + } + left_fork->available = 1; + right_fork->available = 1; } - left_fork->available = 1; - right_fork->available = 1; pthread_mutex_unlock(&left_fork->mutex); pthread_mutex_unlock(&right_fork->mutex); } @@ -48,13 +67,16 @@ 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)); usleep(1000); } } @@ -77,7 +99,11 @@ int *process_philo(void *arg) while (philo->data->simulation_running) { philo_eat(philo); + if (!philo->data->simulation_running) + break; philo_sleep(philo); + if (!philo->data->simulation_running) + break; philo_think(philo); } return (result); -- 2.47.2