#include "codexion.h" # include // for usleep() # include // for printf() static void send_signal(t_fork *fork) { (void)pthread_mutex_lock(&fork->mutex_cond); pthread_cond_signal(&fork->cond_signal); (void)pthread_mutex_unlock(&fork->mutex_cond); } static void lock_forks(t_philo *philo, t_fork *f1, t_fork *f2) { if (get_id(philo) % 2 == 0) { (void)pthread_mutex_lock(&f1->mutex); (void)pthread_mutex_lock(&f2->mutex); } else { if (philo->number_of_eats_done < 1) usleep(50); (void)pthread_mutex_lock(&f2->mutex); (void)pthread_mutex_lock(&f1->mutex); } wait_for_longest_cooldown(philo, f1, f2); } int philo_routine(t_philo *philo, t_fork *f1, t_fork *f2) { t_sim *sim; (void)pthread_mutex_lock(&philo->mutex_sim); sim = philo->sim; (void)pthread_mutex_unlock(&philo->mutex_sim); if (check_if_philo_starved(sim)) return (1); if (queue_routine(philo, f1, f2) == 1) return (1); if (check_if_philo_starved(sim)) return (1); lock_forks(philo, f1, f2); print_log(philo, "has taken a fork", 0); print_log(philo, "has taken a fork", 0); update_last_released(sim, f1, f2); eat(philo); (void)pthread_mutex_unlock(&f2->mutex); dequeue(f2); send_signal(f2); (void)pthread_mutex_unlock(&f1->mutex); dequeue(f1); send_signal(f1); reflect_and_think(philo); return (0); }