diff --git a/philo/includes/philo.h b/philo/includes/philo.h index 073f9b6..1b4f95c 100644 --- a/philo/includes/philo.h +++ b/philo/includes/philo.h @@ -49,7 +49,7 @@ typedef struct s_philo t_i32 eating_count; t_usize t_last_eat; t_usize start_time; - t_i32 *dead_check; + t_bool dead_check; t_mutex *check_eating_count; t_mutex *r_fork; t_mutex *l_fork; diff --git a/philo/sources/ft_actions.c b/philo/sources/ft_actions.c index 7598b83..70186ac 100644 --- a/philo/sources/ft_actions.c +++ b/philo/sources/ft_actions.c @@ -30,7 +30,6 @@ t_error ft_start_eating(t_philo *philo) { const t_usize time = ft_time() - philo->start_time; - printf("\n\nOn as au pheno ?\n\n"); if (philo->id % 2 == 0) { pthread_mutex_lock(philo->l_fork); diff --git a/philo/sources/parsing_args.c b/philo/sources/parsing_args.c index d38a553..90f0be9 100644 --- a/philo/sources/parsing_args.c +++ b/philo/sources/parsing_args.c @@ -54,7 +54,7 @@ t_usize ft_time(void) if (gettimeofday(&time, NULL) == -1) ft_exit("Error of during ft_time !\n", 1); - return (time.tv_sec * 1000 + time.tv_usec / 1000); + return (time.tv_sec * 1000 + time.tv_usec * 0.001); } void ft_pause(size_t milliseconds) @@ -76,11 +76,11 @@ t_error ft_init_philo(t_i32 argc, t_str *argv, t_program *prog, t_mutex *forks) prog->philos[i].eating = 0; ft_parsing_args(argc, argv, &prog->philos[i]); prog->philos[i].start_time = ft_time(); - prog->philos[i].t_last_eat = ft_time(); + prog->philos[i].t_last_eat = 0; prog->philos[i].print_lock = &prog->print_lock; prog->philos[i].dead_lock = &prog->dead_lock; prog->philos[i].meal_lock = &prog->meal_lock; - prog->philos[i].dead_check = &prog->dead_flag; + prog->philos[i].dead_check = false; prog->philos[i].check_eating_count = &prog->check_eating_count; prog->philos[i].l_fork = &forks[i]; if (i == 0) diff --git a/philo/sources/routine.c b/philo/sources/routine.c index a5af511..3bd1769 100644 --- a/philo/sources/routine.c +++ b/philo/sources/routine.c @@ -15,7 +15,7 @@ t_bool dead_loop(t_philo *philo) { pthread_mutex_lock(philo->dead_lock); - if (*philo->dead_check == true) + if (philo[0].dead_check == true) return (pthread_mutex_unlock(philo->dead_lock), true); pthread_mutex_unlock(philo->dead_lock); return (false); @@ -24,18 +24,23 @@ t_bool dead_loop(t_philo *philo) t_bool check_dead(t_philo *philo) { t_usize i; + t_usize timecheck; i = 0; while (i < philo[0].nb_philo) { - if (ft_time() - philo[i].t_last_eat > philo[i].t_eat) + timecheck = ft_time() - philo[i].start_time - philo[i].t_last_eat; + if (philo[i].t_last_eat != 0 && timecheck >= philo[i].t_death) + { + ft_logs("died\n", &philo[i]); return (true); + } i++; } return (false); } -t_bool check_eat(t_philo *philo) +t_bool check_eat(t_philo *philo) { t_usize i; t_u8 check; @@ -47,14 +52,23 @@ t_bool check_eat(t_philo *philo) while (i < philo[0].nb_philo) { pthread_mutex_lock(philo[i].check_eating_count); - printf("\n\n\n eating_time for philo n%d = %d\n\n\n", philo[i].id, philo[i].eating_count); if (philo[i].eating_count >= philo[i].nb_eat) check++; pthread_mutex_unlock(philo[i].check_eating_count); i++; } + i = 0; if (check == philo[0].nb_philo) + { + pthread_mutex_lock(philo[0].dead_lock); + while (i < philo[0].nb_philo) + { + philo[i].dead_check = true; + i++; + } + pthread_mutex_unlock(philo[0].dead_lock); return (true); + } return (false); } @@ -67,10 +81,10 @@ void *ft_watch_dogs(void *ptr) return (NULL); while (true) { - if (check_dead(philo) == true) - break ; if (check_eat(philo) == true) break ; + if (check_dead(philo) == true) + break ; } return (philo); } @@ -97,7 +111,6 @@ t_error ft_init_thread(t_program *prog, t_mutex *forks) t_usize i; i = 0; - ft_logs("garfi lpb\n", prog->philos); if (pthread_create(&o_block, NULL, &ft_watch_dogs, prog->philos)) ft_destroy_exit("Allocation of watch_dogs failed\n", \ ERROR, prog, forks); @@ -109,8 +122,8 @@ t_error ft_init_thread(t_program *prog, t_mutex *forks) ERROR, prog, forks); i++; } - pthread_join(o_block, NULL); while (--i > 0) pthread_join(prog->philos[i].thread, NULL); + pthread_join(o_block, NULL); return (NO_ERROR); }