aboutsummaryrefslogtreecommitdiff
path: root/philo
diff options
context:
space:
mode:
authorDominik Kaiser2025-01-18 14:01:36 +0100
committerDominik Kaiser2025-01-18 14:01:36 +0100
commitfcbd39d9b3d4662ab58104f868d3d512847eae14 (patch)
tree9f0bd731924feb71b80e2e3947efa558dc2535df /philo
parentf38b5cc6975fc2126f4a09f8417cfba5cbcd845c (diff)
downloadPhilosophers-fcbd39d9b3d4662ab58104f868d3d512847eae14.tar.gz
Philosophers-fcbd39d9b3d4662ab58104f868d3d512847eae14.zip
Finish up simulation
Diffstat (limited to 'philo')
-rw-r--r--philo/include/philo.h3
-rw-r--r--philo/src/main.c3
-rw-r--r--philo/src/simulation.c54
3 files changed, 44 insertions, 16 deletions
diff --git a/philo/include/philo.h b/philo/include/philo.h
index 308857b..faf1bbf 100644
--- a/philo/include/philo.h
+++ b/philo/include/philo.h
@@ -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;
diff --git a/philo/src/main.c b/philo/src/main.c
index 46d1050..4e99d1c 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/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)
diff --git a/philo/src/simulation.c b/philo/src/simulation.c
index bc417cf..6685957 100644
--- a/philo/src/simulation.c
+++ b/philo/src/simulation.c
@@ -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);