Compare commits
	
		
			8 Commits
		
	
	
		
			622c2bf226
			...
			1461285dbf
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 1461285dbf | |||
| 7e77316d53 | |||
| 6148d6effe | |||
| 9281e9f508 | |||
| c674f68b2e | |||
| 07a72c7f89 | |||
| 23e8774c44 | |||
| f19a96a233 | 
							
								
								
									
										4
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								Makefile
									
									
									
									
									
								
							@ -15,13 +15,13 @@ NAME = philo
 | 
			
		||||
 | 
			
		||||
CC = clang
 | 
			
		||||
 | 
			
		||||
FLAGS = -Wall -Wextra -Werror -g
 | 
			
		||||
FLAGS = -Wall -Wextra -Werror -g -pthread
 | 
			
		||||
 | 
			
		||||
%.o: %.c
 | 
			
		||||
	${CC} ${FLAGS} -c -o $@ $<
 | 
			
		||||
 | 
			
		||||
${NAME}: ${OBJS}
 | 
			
		||||
	${CC} ${OBJS} -o ${NAME}
 | 
			
		||||
	${CC} ${FLAGS} ${OBJS} -o ${NAME}
 | 
			
		||||
 | 
			
		||||
all: ${NAME}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										19
									
								
								data.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								data.c
									
									
									
									
									
								
							@ -2,6 +2,7 @@
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include "./data.h"
 | 
			
		||||
#include "philo.h"
 | 
			
		||||
#include "philos.h"
 | 
			
		||||
@ -35,9 +36,23 @@ bool	data_init(t_data *data)
 | 
			
		||||
 | 
			
		||||
void	data_destroyer(t_data *data)
 | 
			
		||||
{
 | 
			
		||||
	free(data->threads);
 | 
			
		||||
	free(data->forks);
 | 
			
		||||
	size_t	i;
 | 
			
		||||
	t_philo	*philo;
 | 
			
		||||
	bool	stop;
 | 
			
		||||
 | 
			
		||||
	i = 0;
 | 
			
		||||
	while (i < data->nb_philos)
 | 
			
		||||
	{
 | 
			
		||||
		philo = data->philos[i];
 | 
			
		||||
		pthread_mutex_lock(&philo->stop_mutex);
 | 
			
		||||
		stop = philo->stop;
 | 
			
		||||
		pthread_mutex_unlock(&philo->stop_mutex);
 | 
			
		||||
		if (stop)
 | 
			
		||||
			i++;
 | 
			
		||||
	}
 | 
			
		||||
	pthread_mutex_destroy(&data->forks_mutex);
 | 
			
		||||
	pthread_mutex_destroy(&data->stop_mutex);
 | 
			
		||||
	free(data->threads);
 | 
			
		||||
	free(data->forks);
 | 
			
		||||
	philos_destroyer(data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										4
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								main.c
									
									
									
									
									
								
							@ -53,8 +53,8 @@ void	check_routine(t_data *data)
 | 
			
		||||
	{
 | 
			
		||||
		if ((ssize_t) get_min_meal(data) == data->nb_meals)
 | 
			
		||||
		{
 | 
			
		||||
			printf("g pu faim\n");
 | 
			
		||||
			stop(data);
 | 
			
		||||
			printf("g pu faim\n");
 | 
			
		||||
			return ;
 | 
			
		||||
		}
 | 
			
		||||
		i = 0;
 | 
			
		||||
@ -67,6 +67,7 @@ void	check_routine(t_data *data)
 | 
			
		||||
			if (ok == 1)
 | 
			
		||||
			{
 | 
			
		||||
				print_died(philo);
 | 
			
		||||
				stop(data);
 | 
			
		||||
				return ;
 | 
			
		||||
			}
 | 
			
		||||
			i++;
 | 
			
		||||
@ -78,6 +79,7 @@ int	main(int ac, char **av)
 | 
			
		||||
{
 | 
			
		||||
	t_data	data;
 | 
			
		||||
 | 
			
		||||
	get_time();
 | 
			
		||||
	if (parsing(&data, av + 1, ac - 1))
 | 
			
		||||
		return (1);
 | 
			
		||||
	if (data_init(&data))
 | 
			
		||||
 | 
			
		||||
@ -44,5 +44,7 @@ bool	parsing(t_data *data, char **args, size_t n)
 | 
			
		||||
		return (1);
 | 
			
		||||
	}
 | 
			
		||||
	set_value(data, args, n);
 | 
			
		||||
	return (0);
 | 
			
		||||
	if (data->nb_philos == 0)
 | 
			
		||||
		write(2, "Argument error !\n", 16);
 | 
			
		||||
	return (data->nb_philos == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										26
									
								
								philo.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								philo.c
									
									
									
									
									
								
							@ -17,13 +17,19 @@ void	philo_destroyer(t_philo *philo)
 | 
			
		||||
	free(philo);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool	check(t_data *data)
 | 
			
		||||
bool	check(t_philo *philo, t_data *data)
 | 
			
		||||
{
 | 
			
		||||
	bool	stop;
 | 
			
		||||
 | 
			
		||||
	pthread_mutex_lock(&data->stop_mutex);
 | 
			
		||||
	stop = data->stop;
 | 
			
		||||
	pthread_mutex_unlock(&data->stop_mutex);
 | 
			
		||||
	if (stop)
 | 
			
		||||
	{
 | 
			
		||||
		pthread_mutex_lock(&philo->stop_mutex);
 | 
			
		||||
		philo->stop = 1;
 | 
			
		||||
		pthread_mutex_unlock(&philo->stop_mutex);
 | 
			
		||||
	}
 | 
			
		||||
	return (stop);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -51,11 +57,12 @@ bool	philo_eat(t_philo *philo, t_data *data)
 | 
			
		||||
	right_fork = 0;
 | 
			
		||||
	while (left_fork == 0 || right_fork == 0)
 | 
			
		||||
	{
 | 
			
		||||
		if (check(data))
 | 
			
		||||
		if (check(philo, data))
 | 
			
		||||
			return (1);
 | 
			
		||||
		pthread_mutex_lock(&data->forks_mutex);
 | 
			
		||||
		left_fork = data->forks[philo->id]; 
 | 
			
		||||
		right_fork = data->forks[(philo->id + 1) % data->nb_philos];
 | 
			
		||||
		if (((philo->id + 1) % data->nb_philos) != philo->id)
 | 
			
		||||
			right_fork = data->forks[(philo->id + 1) % data->nb_philos];
 | 
			
		||||
		if (right_fork && left_fork)
 | 
			
		||||
		{
 | 
			
		||||
			data->forks[philo->id] = 0;
 | 
			
		||||
@ -85,18 +92,20 @@ void	*philo_routine(void *arg)
 | 
			
		||||
 | 
			
		||||
	philo = arg;
 | 
			
		||||
	data = philo->data;
 | 
			
		||||
	if (philo->id % 2)
 | 
			
		||||
		usleep(data->sleep_time * 1000);
 | 
			
		||||
	print_thinking(philo);
 | 
			
		||||
	usleep(philo->id * (data->life_expectency / data->nb_philos));
 | 
			
		||||
	while (true)
 | 
			
		||||
	{
 | 
			
		||||
		print_thinking(philo);
 | 
			
		||||
		if (check(data))
 | 
			
		||||
		if (check(philo, data))
 | 
			
		||||
			return (NULL);
 | 
			
		||||
		if (philo_eat(philo, data))
 | 
			
		||||
			return (NULL);
 | 
			
		||||
		if (check(data))
 | 
			
		||||
		if (check(philo, data))
 | 
			
		||||
			return (NULL);
 | 
			
		||||
		philo_sleep(data, philo);
 | 
			
		||||
		if (check(philo, data))
 | 
			
		||||
			return (NULL);
 | 
			
		||||
		print_thinking(philo);
 | 
			
		||||
	}
 | 
			
		||||
	return (NULL);
 | 
			
		||||
}
 | 
			
		||||
@ -116,5 +125,6 @@ t_philo	*philo_init(t_data *data)
 | 
			
		||||
	pthread_mutex_init(&philo->nb_meal_mutex, NULL);
 | 
			
		||||
	pthread_mutex_init(&philo->last_eat_mutex, NULL);
 | 
			
		||||
	pthread_mutex_init(&philo->last_sleep_mutex, NULL);
 | 
			
		||||
	pthread_mutex_init(&philo->stop_mutex, NULL);
 | 
			
		||||
	return (philo);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										4
									
								
								print.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								print.c
									
									
									
									
									
								
							@ -19,7 +19,7 @@ static void	print(t_data *data, size_t id, char *str)
 | 
			
		||||
	pthread_mutex_unlock(&data->stop_mutex);
 | 
			
		||||
	time = get_time();
 | 
			
		||||
	pthread_mutex_lock(&print_mutex);
 | 
			
		||||
	printf("%6zu %3zu %s\n", time, id, str);
 | 
			
		||||
	printf("%07zu %3zu %s\n", time, id + 1, str);
 | 
			
		||||
	pthread_mutex_unlock(&print_mutex);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -45,5 +45,5 @@ void	print_thinking(t_philo *philo)
 | 
			
		||||
 | 
			
		||||
void	print_died(t_philo *philo)
 | 
			
		||||
{
 | 
			
		||||
	print(philo->data, philo->id, "is died");
 | 
			
		||||
	print(philo->data, philo->id, "died");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								struct.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								struct.h
									
									
									
									
									
								
							@ -28,6 +28,8 @@ typedef struct s_philo
 | 
			
		||||
	size_t			last_eat;
 | 
			
		||||
	pthread_mutex_t	last_sleep_mutex;
 | 
			
		||||
	size_t			last_sleep;
 | 
			
		||||
	pthread_mutex_t	stop_mutex;
 | 
			
		||||
	bool			stop;
 | 
			
		||||
	t_data			*data;
 | 
			
		||||
}	t_philo;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										5
									
								
								time.c
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								time.c
									
									
									
									
									
								
							@ -6,9 +6,12 @@
 | 
			
		||||
size_t	get_time(void)
 | 
			
		||||
{
 | 
			
		||||
	size_t				time;
 | 
			
		||||
	static size_t		start_time = 0;
 | 
			
		||||
	struct timeval		tv;
 | 
			
		||||
	
 | 
			
		||||
	gettimeofday(&tv, NULL);
 | 
			
		||||
	time = tv.tv_sec * 1000000 + tv.tv_usec;
 | 
			
		||||
	return (time / 1000);
 | 
			
		||||
	if (start_time == 0)
 | 
			
		||||
		start_time = time;
 | 
			
		||||
	return ((time - start_time) / 1000);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -6,21 +6,28 @@
 | 
			
		||||
/*   By: cchauvet <cchauvet@student.42angoulem      +#+  +:+       +#+        */
 | 
			
		||||
/*                                                +#+#+#+#+#+   +#+           */
 | 
			
		||||
/*   Created: 2023/03/08 14:43:33 by cchauvet          #+#    #+#             */
 | 
			
		||||
/*   Updated: 2023/04/11 14:47:30 by cchauvet         ###   ########.fr       */
 | 
			
		||||
/*   Updated: 2023/04/19 13:49:58 by cchauvet         ###   ########.fr       */
 | 
			
		||||
/*                                                                            */
 | 
			
		||||
/* ************************************************************************** */
 | 
			
		||||
 | 
			
		||||
#include "../philo.h"
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
 | 
			
		||||
bool	ft_isnum(char str[])
 | 
			
		||||
{
 | 
			
		||||
	size_t	i;
 | 
			
		||||
	size_t	num;
 | 
			
		||||
 | 
			
		||||
	num = 0;
 | 
			
		||||
	i = 0;
 | 
			
		||||
	while (str[i] != '\0')
 | 
			
		||||
	{
 | 
			
		||||
		if (str[i] > '9' || str[i] < '0')
 | 
			
		||||
			return (0);
 | 
			
		||||
		num = num * 10 + str[i] - 48;
 | 
			
		||||
		if (num > INT_MAX)
 | 
			
		||||
			return (0);
 | 
			
		||||
		i++;
 | 
			
		||||
	}
 | 
			
		||||
	return (1);
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user