aboutsummaryrefslogtreecommitdiff
path: root/philo_two/src/routine.c
diff options
context:
space:
mode:
authorCharles Cabergs <me@cacharle.xyz>2021-01-01 14:46:13 +0100
committerCharles Cabergs <me@cacharle.xyz>2021-01-01 14:46:13 +0100
commitb9d93edf40f228fcc6e18e9e6d0a1c5db498c004 (patch)
tree5abb172c43b54adcf4caef33ede04f64c957246f /philo_two/src/routine.c
parent83df2b3a49bd3f627ae304bb1529e27d9b2d988c (diff)
downloadphilosophers-b9d93edf40f228fcc6e18e9e6d0a1c5db498c004.tar.gz
philosophers-b9d93edf40f228fcc6e18e9e6d0a1c5db498c004.tar.bz2
philosophers-b9d93edf40f228fcc6e18e9e6d0a1c5db498c004.zip
Added meal counter to philo_two (still segfault 10% of the time)
Diffstat (limited to 'philo_two/src/routine.c')
-rw-r--r--philo_two/src/routine.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/philo_two/src/routine.c b/philo_two/src/routine.c
index 29f2e23..783011c 100644
--- a/philo_two/src/routine.c
+++ b/philo_two/src/routine.c
@@ -6,28 +6,45 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/14 23:00:07 by cacharle #+# #+# */
-/* Updated: 2020/12/31 19:16:32 by charles ### ########.fr */
+/* Updated: 2021/01/01 14:23:59 by charles ### ########.fr */
/* */
/* ************************************************************************** */
#include "philo_two.h"
+inline bool philo_finished(t_philo_conf *conf)
+{
+ return (!conf->all_alive ||
+ (conf->meal_num != -1 &&
+ conf->meal_num_finished_counter == conf->philo_num));
+}
+
void *routine_philo(t_philo *arg)
{
+ long int eat_counter;
pthread_t thread_death;
- event_think(arg);
- if (!arg->conf->all_alive)
+ if (philo_finished(arg->conf))
return (NULL);
arg->time_last_eat = h_time_now();
if (pthread_create(&thread_death, NULL, (t_routine)routine_death, arg) != 0)
return (NULL);
- while (arg->conf->all_alive)
+ eat_counter = 0;
+ event_think(arg);
+ while (!philo_finished(arg->conf))
{
event_take_fork(arg);
event_take_fork(arg);
event_eat(arg);
arg->time_last_eat = h_time_now();
+ eat_counter++;
+ if (!philo_finished(arg->conf) && arg->conf->meal_num != -1 &&
+ eat_counter == arg->conf->meal_num)
+ {
+ sem_wait(arg->conf->sem_meal_num_finished_counter);
+ arg->conf->meal_num_finished_counter++;
+ sem_post(arg->conf->sem_meal_num_finished_counter);
+ }
event_sleep(arg);
event_think(arg);
}
@@ -40,7 +57,7 @@ void *routine_death(t_philo *arg)
t_time current;
current = h_time_now();
- while (arg->conf->all_alive
+ while (!philo_finished(arg->conf)
&& current - arg->time_last_eat < arg->conf->timeout_death)
{
current = h_time_now();