-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathphilo_life.c
107 lines (99 loc) · 2.42 KB
/
philo_life.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "philo.h"
void ft_check_finish(t_philo *philo, t_data *data)
{
int i;
int x;
if (philo->who == philo->datas->total_philos)
{
i = -1;
while (++i < philo->datas->total_philos)
{
if (data->philo[i].m_count == data->eat_count_max)
x = 1;
else
x = 0;
}
if (philo->datas->eat_count_max == philo->m_count && x == 1)
{
pthread_mutex_lock(&philo->datas->m_stop);
pthread_mutex_lock(&philo->datas->pprint);
philo->datas->eat_count_max = -2;
}
}
}
void ft_print(t_philo *philo, char c)
{
if (c == 'e')
{
pthread_mutex_lock(&philo->datas->pprint);
printf("%llu %d is eating \n", \
get_tick_count() - philo->datas->start_time, philo->who);
pthread_mutex_unlock(&philo->datas->pprint);
}
else if (c == 's')
{
pthread_mutex_lock(&philo->datas->pprint);
printf("%llu %d is sleeping \n", \
get_tick_count() - philo->datas->start_time, philo->who);
pthread_mutex_unlock(&philo->datas->pprint);
}
else if (c == 't')
{
pthread_mutex_lock(&philo->datas->pprint);
printf("%llu %d is thinking \n", \
get_tick_count() - philo->datas->start_time, philo->who);
pthread_mutex_unlock(&philo->datas->pprint);
}
}
void one_philo(t_philo *philo)
{
if (philo->datas->total_philos == 1)
{
ft_sleep_time(philo->datas->time_to_die, philo);
philo->is_dead = 1;
philo->datas->is_dead = 1;
}
}
void *checks_3(void *philos)
{
t_philo *philo;
philo = (t_philo *)philos;
while (1 && !(philo->datas->eat_count_max > 0))
{
pthread_mutex_lock(&philo->datas->dead);
if (get_tick_count() > philo->last_eat + philo->datas->time_to_die)
{
philo->is_dead = 1;
pthread_mutex_unlock(&philo->datas->dead);
pthread_mutex_lock(&philo->datas->pprint);
return ((void *)0);
}
pthread_mutex_unlock(&philo->datas->dead);
usleep(1000);
}
return ((void *)0);
}
void *philo_life(void *philos)
{
t_philo *philo;
pthread_t tid;
philo = (t_philo *)philos;
pthread_create(&tid, NULL, &checks_3, philos);
pthread_detach(tid);
if (philo->who % 2 == 0)
ft_sleep_time(philo->datas->time_to_eat, philo);
while (!(check(philo)) && philo->datas->eat_count_max != philo->m_count)
{
take_fork(philo);
pthread_mutex_lock(&philo->datas->m_stop);
check(philo);
ft_print(philo, 'e');
last_eat(philo);
philo_finished_eating(philo);
ft_print(philo, 's');
ft_sleep_time(philo->datas->time_to_sleep, philo);
ft_print(philo, 't');
}
ft_check_finish(philo, philo->datas);
return (NULL);
}