Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
yabtaour
GitHub Repository: yabtaour/Philosophers-42
Path: blob/master/philo_bonus/ft_start_philos_bonus.c
882 views
1
/* ************************************************************************** */
2
/* */
3
/* ::: :::::::: */
4
/* ft_start_philos_bonus.c :+: :+: :+: */
5
/* +:+ +:+ +:+ */
6
/* By: yabtaour <[email protected]> +#+ +:+ +#+ */
7
/* +#+#+#+#+#+ +#+ */
8
/* Created: 2022/05/23 00:08:10 by yabtaour #+# #+# */
9
/* Updated: 2022/05/23 11:43:41 by yabtaour ### ########.fr */
10
/* */
11
/* ************************************************************************** */
12
#include "philosophers_bonus.h"
13
14
void ft_eat(t_philo *philosopher)
15
{
16
sem_wait(philosopher->data->fork);
17
ft_output(philosopher->data, philosopher->philo_id, "has taken a fork");
18
sem_wait(philosopher->data->fork);
19
ft_output(philosopher->data, philosopher->philo_id, "has taken a fork");
20
philosopher->last_meal = ft_timestamp();
21
ft_output(philosopher->data, philosopher->philo_id, "is eating");
22
ft_sleep(philosopher->data->time_to_eat, philosopher->data);
23
sem_post(philosopher->data->fork);
24
sem_post(philosopher->data->fork);
25
philosopher->eat++;
26
}
27
28
void ft_routine(t_philo *philo)
29
{
30
while (!(philo->is_dead) && philo->eat != philo->data->must_eat)
31
{
32
ft_eat(philo);
33
ft_output(philo->data, philo->philo_id, "is sleeping");
34
ft_sleep(philo->data->time_to_sleep, philo->data);
35
ft_output(philo->data, philo->philo_id, "is thinking");
36
}
37
}
38
39
void *ft_start_philosophers(t_data *data, int i)
40
{
41
t_philo philo;
42
43
philo.data = data;
44
philo.philo_id = i + 1;
45
philo.is_dead = 0;
46
philo.eat = 0;
47
philo.last_meal = ft_timestamp();
48
pthread_create(philo.thread_id, NULL, (void *)ft_check_dead, &philo);
49
ft_routine(&philo);
50
pthread_detach(*philo.thread_id);
51
return (NULL);
52
}
53
54