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))
/* 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 */
/* */
/* ************************************************************************** */
int philos_must_eat;
pthread_mutex_t pme_mutex;
int simulation_running;
+ pthread_mutex_t sr_mutex;
t_fork *forks;
} t_phdata;
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
*/
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
/* 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)
{
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)
/* 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);
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);
}
/* 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 */
/* */
/* ************************************************************************** */
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);
/* 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 */
/* */
/* ************************************************************************** */
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);
}
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 ;
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 ;
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* 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);
+}
/* 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 */
/* */
/* ************************************************************************** */
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);
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);
}
}
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)
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)
{
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");
}
}
i = 0;
result = EXIT_SUCCESS;
+ data->simulation_running = 1;
while (i < nbr_of_philos)
{
result = pthread_create(&(philos[i].thread), NULL,
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);