aboutsummaryrefslogtreecommitdiff
path: root/philo/src/philo_eat.c
diff options
context:
space:
mode:
authorDominik Kaiser2025-01-27 14:37:55 +0100
committerDominik Kaiser2025-01-27 14:37:55 +0100
commitbf7b86398a99b1f9eea59f10daf00b8dee111502 (patch)
tree0f84592002dcc06715ebf3a11127b15969ca5ba6 /philo/src/philo_eat.c
parent0dad3463b22e541153dcfded178eb0f3fe428cbd (diff)
downloadPhilosophers-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.c81
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);
+}