/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* main.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: lfirmin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/11/21 15:42:31 by lfirmin #+# #+# */ /* Updated: 2025/04/17 13:48:43 by lfirmin ### ########.fr */ /* */ /* ************************************************************************** */ #include "../include/philo.h" int setup_simulation(int ac, char **av, t_data **data, pthread_t *death_thread) { *data = init_data(); if (!*data) return (1); if (parsing(ac, av, *data)) return (free_data(*data), 1); if ((*data)->t_die <= 0 || (*data)->t_eat <= 0 || (*data)->t_sleep <= 0) { printf("Error: Time values must be positive integers\n"); return (free_data(*data), 1); } if (init_philo_forks(*data)) return (free_data(*data), 1); if (init_forks(*data)) return (free_data(*data), 1); (*data)->start_time = get_time(); if (init_philos(*data)) return (free_data(*data), 1); if (pthread_create(death_thread, NULL, &death_check, *data)) { printf("Error: Failed to create death check thread\n"); return (free_data(*data), 1); } return (0); } int main(int ac, char **av) { t_data *data; pthread_t death_thread; if (setup_simulation(ac, av, &data, &death_thread)) return (1); if (create_threads(data)) { pthread_mutex_lock(&data->dead_mutex); data->dead_flag = 1; pthread_mutex_unlock(&data->dead_mutex); pthread_join(death_thread, NULL); printf("Error: Failed to create philosopher threads\n"); return (free_data(data), 1); } if (pthread_join(death_thread, NULL)) { printf("Error: Failed to join death check thread\n"); return (free_data(data), 1); } return (free_data(data), 0); }