]> git.dkaiser.de - 42/Philosophers.git/commitdiff
Finish up simulation
authorDominik Kaiser <dkaiser@student.42heilbronn.de>
Sat, 18 Jan 2025 13:01:36 +0000 (14:01 +0100)
committerDominik Kaiser <dkaiser@student.42heilbronn.de>
Sat, 18 Jan 2025 13:01:36 +0000 (14:01 +0100)
philo/include/philo.h
philo/src/main.c
philo/src/simulation.c

index 308857be5dd7d0d697064871606b9b9d5896ea1c..faf1bbff145f7649b5d2e4b2332fc1055664a310 100644 (file)
@@ -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;
index 46d10507b5257a9d388a5b9c1e1430851bef35de..4e99d1ccdbb42f5146987eeb9cb6fb48d64db47c 100644 (file)
@@ -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)
index bc417cf5a91fe35c24bb2018733e4f4b2e80efaa..668595758a9a8932569071ac8ca74d71341d52b7 100644 (file)
@@ -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);