]> git.dkaiser.de - 42/Philosophers.git/commitdiff
Protect simulation_running with mutex
authorDominik Kaiser <dkaiser@3-F-5.42heilbronn.de>
Tue, 28 Jan 2025 12:56:07 +0000 (13:56 +0100)
committerDominik Kaiser <dkaiser@3-F-5.42heilbronn.de>
Tue, 28 Jan 2025 12:56:07 +0000 (13:56 +0100)
philo/Makefile
philo/include/philo.h
philo/src/ft_utils.c
philo/src/init.c
philo/src/main.c
philo/src/philo_eat.c
philo/src/sim_controls.c [new file with mode: 0644]
philo/src/simulation.c

index 9cd7e26da4dcc9aeb657ea337790b3b5f942499e..0f33d418daca9e6919a912c01a38cc2b66b688f3 100644 (file)
@@ -9,7 +9,7 @@ CFLAGS  =  -Wall -Wextra -Werror
 HEADERS =  -Iinclude
 
 VPATH   := src
-SRC     := main.c init.c ft_utils.c simulation.c philo_eat.c
+SRC     := main.c init.c ft_utils.c simulation.c philo_eat.c sim_controls.c
 
 OBJ_DIR := _obj
 OBJ     := $(addprefix $(OBJ_DIR)/, $(SRC:%.c=%.o))
index 07e4e960b5f9131add46046dd27ec05877b00380..ef5565e9e670715c181261bb6867549672f4b18d 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/01/17 10:23:19 by dkaiser           #+#    #+#             */
-/*   Updated: 2025/01/28 13:16:12 by dkaiser          ###   ########.fr       */
+/*   Updated: 2025/01/28 13:34:48 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -38,6 +38,7 @@ typedef struct s_phdata
        int                             philos_must_eat;
        pthread_mutex_t pme_mutex;
        int                             simulation_running;
+       pthread_mutex_t sr_mutex;
        t_fork                  *forks;
 }                                      t_phdata;
 
@@ -57,6 +58,9 @@ int                                   run_simulation(int nbr_of_philos, t_philo *philos,
 int                                    philo_die(t_philo *philo);
 void                           philo_eat(t_philo *philo);
 
+int                                    is_simulation_running(t_phdata *data);
+void                           stop_simulation(t_phdata *data);
+
 /*
 ** Prints error message and returns EXIT_FAILURE
 */
@@ -73,8 +77,8 @@ int                                   ft_atoi(const char *str);
 int                                    ft_cur_time_in_ms(void);
 
 /*
-** Prints "timestamp_in_ms id str"
+** Prints "timestamp_in_ms philo->id str"
 */
-void                           ft_log(int id, const char *str);
+void                           ft_log(t_philo *philo, const char *str);
 
 #endif
index d77ee3ffa732433175bbacead31c497cc12423c7..0bcd17c56af5d6f869366f35c09451112f40c519 100644 (file)
@@ -6,11 +6,12 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/01/17 11:57:11 by dkaiser           #+#    #+#             */
-/*   Updated: 2025/01/28 13:04:10 by dkaiser          ###   ########.fr       */
+/*   Updated: 2025/01/28 13:52:09 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
 #include "philo.h"
+#include <pthread.h>
 
 int    ft_err(const char *str)
 {
@@ -28,9 +29,12 @@ int  ft_cur_time_in_ms(void)
        return (time_in_ms);
 }
 
-void   ft_log(int id, const char *str)
+void   ft_log(t_philo *philo, const char *str)
 {
-       printf("%u %d %s\n", ft_cur_time_in_ms(), id, str);
+       pthread_mutex_lock(&philo->data->sr_mutex);
+       if (philo->data->simulation_running)
+               printf("%u %d %s\n", ft_cur_time_in_ms(), philo->id, str);
+       pthread_mutex_unlock(&philo->data->sr_mutex);
 }
 
 int    ft_atoi(const char *str)
index 6f91f7eab381553934fc73353e5234a736de66d9..1afa104c4484bad23c492e6b5bb2486d3dc20595 100644 (file)
@@ -6,11 +6,12 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/01/28 13:12:57 by dkaiser           #+#    #+#             */
-/*   Updated: 2025/01/28 13:15:30 by dkaiser          ###   ########.fr       */
+/*   Updated: 2025/01/28 13:25:15 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
 #include "philo.h"
+#include <pthread.h>
 
 static void    init_philo(t_philo *philo, t_phdata *data, int id);
 static int     init_philos(t_philo **philos, t_phdata *data);
@@ -35,6 +36,13 @@ int  init(t_philo **philos, t_phdata *data)
                free(data->forks);
                return (result);
        }
+       result = pthread_mutex_init(&data->sr_mutex, NULL);
+       if (result != 0)
+       {
+               free(*philos);
+               free(data->forks);
+               return (result);
+       }
        result = init_philos(philos, data);
        return (result);
 }
index ae0e54be5f73ebaff495fba8c9402ce910ebdf6f..c92879597d415010070ca856dc35d181efb819e2 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/01/14 17:13:30 by dkaiser           #+#    #+#             */
-/*   Updated: 2025/01/28 13:20:47 by dkaiser          ###   ########.fr       */
+/*   Updated: 2025/01/28 13:49:55 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -52,7 +52,6 @@ int   main(int argc, char *argv[])
        result = init(&philos, &data);
        if (result != EXIT_SUCCESS)
                return (result);
-       data.simulation_running = 1;
        result = run_simulation(data.nbr_of_philos, philos, &data);
        free(philos);
        free(data.forks);
index 3a0208e50a2ad443640b85fa950df11876a98a4e..b689f1f473bb24576a3f53dd2e8781be5626d182 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/01/21 18:15:40 by dkaiser           #+#    #+#             */
-/*   Updated: 2025/01/28 13:05:31 by dkaiser          ###   ########.fr       */
+/*   Updated: 2025/01/28 13:42:19 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -18,7 +18,7 @@ static void   take_fork(t_philo *philo, t_fork *fork)
        if (fork->owner == 0)
        {
                fork->owner = philo->id;
-               ft_log(philo->id, "has taken a fork");
+               ft_log(philo, "has taken a fork");
        }
        pthread_mutex_unlock(&fork->mutex);
 }
@@ -35,10 +35,10 @@ static void eat(t_philo *philo, t_fork *left_fork, t_fork *right_fork)
        int     started_eating;
 
        started_eating = ft_cur_time_in_ms();
-       ft_log(philo->id, "is eating");
+       ft_log(philo, "is eating");
        while (ft_cur_time_in_ms() < started_eating + philo->data->time_to_eat)
        {
-               if (!philo->data->simulation_running)
+               if (!is_simulation_running(philo->data))
                        return ;
                if (philo_die(philo))
                        return ;
@@ -65,7 +65,7 @@ void  philo_eat(t_philo *philo)
                        usleep(250);
                take_fork(philo, left_fork);
                take_fork(philo, right_fork);
-               if (!philo->data->simulation_running)
+               if (!is_simulation_running(philo->data))
                        return ;
                if (philo_die(philo))
                        return ;
diff --git a/philo/src/sim_controls.c b/philo/src/sim_controls.c
new file mode 100644 (file)
index 0000000..6489211
--- /dev/null
@@ -0,0 +1,30 @@
+/* ************************************************************************** */
+/*                                                                            */
+/*                                                        :::      ::::::::   */
+/*   sim_controls.c                                     :+:      :+:    :+:   */
+/*                                                    +:+ +:+         +:+     */
+/*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
+/*                                                +#+#+#+#+#+   +#+           */
+/*   Created: 2025/01/28 13:32:28 by dkaiser           #+#    #+#             */
+/*   Updated: 2025/01/28 13:45:20 by dkaiser          ###   ########.fr       */
+/*                                                                            */
+/* ************************************************************************** */
+
+#include "philo.h"
+
+int    is_simulation_running(t_phdata *data)
+{
+       int     result;
+
+       pthread_mutex_lock(&data->sr_mutex);
+       result = data->simulation_running;
+       pthread_mutex_unlock(&data->sr_mutex);
+       return (result);
+}
+
+void   stop_simulation(t_phdata *data)
+{
+       pthread_mutex_lock(&data->sr_mutex);
+       data->simulation_running = 0;
+       pthread_mutex_unlock(&data->sr_mutex);
+}
index 53bb6f873ef2be814171a4f529a7204a666ca2c8..4ce51782ace732a1f5edb633819cdd489b358b4c 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2025/01/17 14:38:04 by dkaiser           #+#    #+#             */
-/*   Updated: 2025/01/27 15:01:42 by dkaiser          ###   ########.fr       */
+/*   Updated: 2025/01/28 13:41:46 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -17,8 +17,8 @@ int   philo_die(t_philo *philo)
        if (ft_cur_time_in_ms() > philo->last_time_eaten + philo->data->time_to_die)
        {
                philo->is_alive = 0;
-               ft_log(philo->id, "has died");
-               philo->data->simulation_running = 0;
+               ft_log(philo, "has died");
+               stop_simulation(philo->data);
                return (1);
        }
        return (0);
@@ -31,11 +31,13 @@ void        philo_sleep(t_philo *philo)
 
        started_sleeping = ft_cur_time_in_ms();
        tts = philo->data->time_to_sleep;
-       ft_log(philo->id, "is sleeping");
+       ft_log(philo, "is sleeping");
        while (ft_cur_time_in_ms() < started_sleeping + tts)
        {
                if (philo_die(philo))
                        return ;
+               if (!is_simulation_running(philo->data))
+                       return ;
                usleep(250);
        }
 }
@@ -45,7 +47,7 @@ void  process_philo(void *arg)
        t_philo *philo;
 
        philo = (t_philo *)arg;
-       while (philo->data->simulation_running)
+       while (is_simulation_running(philo->data))
        {
                philo_eat(philo);
                if (philo->times_must_eat == 0)
@@ -54,7 +56,7 @@ void  process_philo(void *arg)
                        philo->data->philos_must_eat -= 1;
                        pthread_mutex_unlock(&philo->data->pme_mutex);
                }
-               if (!philo->data->simulation_running)
+               if (!is_simulation_running(philo->data))
                        break ;
                if (philo->data->nbr_of_philos < 2)
                {
@@ -63,9 +65,9 @@ void  process_philo(void *arg)
                        continue ;
                }
                philo_sleep(philo);
-               if (!philo->data->simulation_running)
+               if (!is_simulation_running(philo->data))
                        break ;
-               ft_log(philo->id, "is thinking");
+               ft_log(philo, "is thinking");
        }
 }
 
@@ -76,6 +78,7 @@ int   run_simulation(int nbr_of_philos, t_philo *philos, t_phdata *data)
 
        i = 0;
        result = EXIT_SUCCESS;
+       data->simulation_running = 1;
        while (i < nbr_of_philos)
        {
                result = pthread_create(&(philos[i].thread), NULL,
@@ -85,11 +88,11 @@ int run_simulation(int nbr_of_philos, t_philo *philos, t_phdata *data)
                i++;
        }
        if (result != EXIT_SUCCESS)
-               data->simulation_running = 0;
-       while (data->simulation_running)
+               stop_simulation(data);
+       while (is_simulation_running(data))
        {
                if (data->philos_must_eat <= 0)
-                       data->simulation_running = 0;
+                       stop_simulation(data);
        }
        while (i--)
                pthread_join(philos[i].thread, NULL);