diff options
| author | Dominik Kaiser | 2025-01-18 14:01:36 +0100 |
|---|---|---|
| committer | Dominik Kaiser | 2025-01-18 14:01:36 +0100 |
| commit | fcbd39d9b3d4662ab58104f868d3d512847eae14 (patch) | |
| tree | 9f0bd731924feb71b80e2e3947efa558dc2535df | |
| parent | f38b5cc6975fc2126f4a09f8417cfba5cbcd845c (diff) | |
| download | Philosophers-fcbd39d9b3d4662ab58104f868d3d512847eae14.tar.gz Philosophers-fcbd39d9b3d4662ab58104f868d3d512847eae14.zip | |
Finish up simulation
| -rw-r--r-- | philo/include/philo.h | 3 | ||||
| -rw-r--r-- | philo/src/main.c | 3 | ||||
| -rw-r--r-- | 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 <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/17 10:23:19 by dkaiser #+# #+# */ -/* Updated: 2025/01/18 12:46:42 by dkaiser ### ########.fr */ +/* Updated: 2025/01/18 13:12:06 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -42,6 +42,7 @@ typedef struct s_phdata typedef struct s_philo { int id; + int last_time_eaten; int times_eaten; int is_alive; pthread_t thread; diff --git a/philo/src/main.c b/philo/src/main.c index 46d1050..4e99d1c 100644 --- a/philo/src/main.c +++ b/philo/src/main.c @@ -6,7 +6,7 @@ /* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/14 17:13:30 by dkaiser #+# #+# */ -/* Updated: 2025/01/18 12:02:24 by dkaiser ### ########.fr */ +/* Updated: 2025/01/18 13:06:09 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -55,6 +55,7 @@ int init(t_philo **philos, t_phdata *data) (*philos)[i].is_alive = 1; (*philos)[i].times_eaten = 0; (*philos)[i].data = data; + (*philos)[i].last_time_eaten = ft_cur_time_in_ms(); data->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 <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/17 14:38:04 by dkaiser #+# #+# */ -/* Updated: 2025/01/18 13:04:32 by dkaiser ### ########.fr */ +/* Updated: 2025/01/18 13:59:17 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ #include "philo.h" +void philo_die(t_philo *philo) +{ + philo->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); |
