aboutsummaryrefslogtreecommitdiff
path: root/philo/src
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
parent0dad3463b22e541153dcfded178eb0f3fe428cbd (diff)
downloadPhilosophers-bf7b86398a99b1f9eea59f10daf00b8dee111502.tar.gz
Philosophers-bf7b86398a99b1f9eea59f10daf00b8dee111502.zip
Outsource eating and fix norme again
Diffstat (limited to 'philo/src')
-rw-r--r--philo/src/main.c6
-rw-r--r--philo/src/philo_eat.c81
-rw-r--r--philo/src/simulation.c4
3 files changed, 88 insertions, 3 deletions
diff --git a/philo/src/main.c b/philo/src/main.c
index c455f0d..a43fe8d 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/26 12:05:55 by dkaiser ### ########.fr */
+/* Updated: 2025/01/27 12:07:13 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
@@ -19,7 +19,11 @@ int load_data(t_phdata *data, int argc, char *argv[])
data->time_to_eat = ft_atoi(argv[3]);
data->time_to_sleep = ft_atoi(argv[4]);
if (argc == 6)
+ {
data->times_must_eat = ft_atoi(argv[5]);
+ if (data->times_must_eat < 1)
+ return (ft_err("times_must_eat can't be negative or zero"));
+ }
else
data->times_must_eat = -1;
if (data->nbr_of_philos <= 0)
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);
+}
diff --git a/philo/src/simulation.c b/philo/src/simulation.c
index fd9f40b..71baf51 100644
--- a/philo/src/simulation.c
+++ b/philo/src/simulation.c
@@ -6,7 +6,7 @@
/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/01/17 14:38:04 by dkaiser #+# #+# */
-/* Updated: 2025/01/26 12:43:53 by dkaiser ### ########.fr */
+/* Updated: 2025/01/27 14:22:40 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
@@ -36,7 +36,7 @@ void philo_sleep(t_philo *philo)
{
if (philo_die(philo))
return ;
- usleep(1000);
+ usleep(500);
}
}