Matthos Denys 5f1937beec update
2021-05-18 21:36:56 +03:00

95 lines
1.8 KiB
C

#include "../includes/philo_header.h"
void *run_trhead(t_philo *philo)
{
while(philo->all_struct->smert != 42)
{
if (philo->all_struct->opt)
{
if (philo->count_eat == philo->all_struct->number_of_times_each_philosopher_must_eat)
philo->all_struct->smert = 42;
}
cycle(philo);
}
return(NULL);
}
void take_forks(t_philo *philo)
{
t_all *all;
all = philo->all_struct;
sem_wait(all->data_philo->sems);
messages(philo->all_struct, philo, "has taken a fork");
sem_wait(all->data_philo->sems);
messages(philo->all_struct, philo, "has taken a fork");
}
void eating(t_philo *philo)
{
t_all *all;
all = philo->all_struct;
sem_wait(philo->eat_sem);
messages(philo->all_struct, philo, "eating");
philo->last_eat = ft_get_time() - philo->all_struct->start_time;
philo->count_eat++;
ft_msleep(philo->all_struct->time_to_eat);
sem_post(all->data_philo->sems);
sem_post(all->data_philo->sems);
sem_post(philo->eat_sem);
}
void sleeping(t_philo *philo)
{
t_all *all;
all = philo->all_struct;
messages(philo->all_struct, philo, "sleeping");
ft_msleep(philo->all_struct->time_to_sleep);
}
void cycle(t_philo *philo)
{
messages(philo->all_struct, philo, "thinking");
take_forks(philo);
eating(philo);
sleeping(philo);
}
int run_observer(t_all *all)
{
int i;
i = 0;
time_t time_eat;
while(1)
{
i = 0;
while(i < all->number_of_philosophers)
{
if (all->smert != 42)
{
time_eat = (ft_get_time() - all->start_time) - all->data_philo->philors[i].last_eat;
if (time_eat > all->time_to_die)
{
printf("%ld %d died\n", ft_get_time() - all->start_time, i + 1);
all->smert = 42;
return(2);
}
}
else
return(2);
i++;
}
ft_msleep(1);
}
return (0);
}
int runner(t_all *all)
{
prepare_resources(all);
all->start_time = ft_get_time();
run_all_phils(all);
if (!run_observer(all))
return(0);
return(1);
}