blob: 7c74b4d6de431c75daceb2b4e7a36174be6fc993 (
plain)
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
|
#include "codexion.h"
# include <unistd.h> // for usleep()
static int check_if_philos_done(t_sim *sim)
{
t_philo **philos;
t_philo *philo;
int number_of_philos;
int diff;
(void)pthread_mutex_lock(&sim->mutex_philos);
philos = sim->philos;
(void)pthread_mutex_unlock(&sim->mutex_philos);
(void)pthread_mutex_lock(&sim->mutex_number_of_philos);
number_of_philos = sim->number_of_philos;
(void)pthread_mutex_unlock(&sim->mutex_number_of_philos);
while (number_of_philos-- > 0)
{
philo = *philos++;
(void)pthread_mutex_lock(&sim->mutex_number_of_eat_required);
(void)pthread_mutex_lock(&philo->mutex_number_of_eats_done);
diff = philo->number_of_eats_done
!= sim->number_of_eat_required;
(void)pthread_mutex_unlock(&philo->mutex_number_of_eats_done);
(void)pthread_mutex_unlock(&sim->mutex_number_of_eat_required);
if (diff != 0)
return (0);
}
return (1);
}
void *monitoring_routine(void *arg)
{
t_sim *sim;
sim = (t_sim *)arg;
while (check_if_philos_done(sim) == 0)
{
if (check_for_starves(sim) == 1)
return (NULL);
usleep(100);
}
return (NULL);
}
|