/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* main.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: cchauvet #include #include #include #include #include #include "./philos.h" #include "./data.h" #include "./parsing.h" #include "./threads.h" #include "./time.h" #include "./print.h" #include "./utils/utils.h" size_t get_min_meal(t_data *data) { size_t i; size_t min; size_t value; t_philo *philo; philo = data->philos[0]; pthread_mutex_lock(&philo->nb_meal_mutex); min = philo->nb_meal; pthread_mutex_unlock(&philo->nb_meal_mutex); i = 1; while (i < data->nb_philos) { philo = data->philos[i]; pthread_mutex_lock(&philo->nb_meal_mutex); value = philo->nb_meal; pthread_mutex_unlock(&philo->nb_meal_mutex); if (min > value) min = value; i++; } return (min); } void stop(t_data *data) { pthread_mutex_lock(&data->stop_mutex); data->stop = 1; pthread_mutex_unlock(&data->stop_mutex); } int routine(t_data *data) { size_t i; bool ok; t_philo *philo; i = 0; while (i < data->nb_philos) { philo = data->philos[i]; pthread_mutex_lock(&philo->last_eat_mutex); ok = !(philo->last_eat + data->life_expectency > get_time()); pthread_mutex_unlock(&philo->last_eat_mutex); if (ok == 1) { stop(data); print_died(philo); return (1); } if (get_min_meal(data) >= data->nb_meals) { stop(data); return (1); } i++; } return (0); } void *check_routine(t_data *data) { while (true) { if (routine(data)) { return (NULL); } } } int main(int ac, char **av) { t_data data; get_time(); if (parsing(&data, av + 1, ac - 1)) return (1); if (data_init(&data)) return (1); if (philos_init(&data)) { data_destroyer(&data); return (1); } if (threads_init(&data)) { data_destroyer(&data); return (1); } check_routine(&data); data_destroyer(&data); }