diff options
| author | Dominik Kaiser | 2025-01-27 14:37:55 +0100 |
|---|---|---|
| committer | Dominik Kaiser | 2025-01-27 14:37:55 +0100 |
| commit | bf7b86398a99b1f9eea59f10daf00b8dee111502 (patch) | |
| tree | 0f84592002dcc06715ebf3a11127b15969ca5ba6 /philo/src/philo_eat.c | |
| parent | 0dad3463b22e541153dcfded178eb0f3fe428cbd (diff) | |
| download | Philosophers-bf7b86398a99b1f9eea59f10daf00b8dee111502.tar.gz Philosophers-bf7b86398a99b1f9eea59f10daf00b8dee111502.zip | |
Outsource eating and fix norme again
Diffstat (limited to 'philo/src/philo_eat.c')
| -rw-r--r-- | philo/src/philo_eat.c | 81 |
1 files changed, 81 insertions, 0 deletions
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 <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/01/21 18:15:40 by dkaiser #+# #+# */ +/* Updated: 2025/01/27 14:37:24 by dkaiser ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_utils.h" +#include "philo.h" +#include <pthread.h> + +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); +} |
