summaryrefslogtreecommitdiff
path: root/src/monitoring.c
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);
}