Skip to content

Latest commit

 

History

History
111 lines (105 loc) · 2.99 KB

File metadata and controls

111 lines (105 loc) · 2.99 KB

Project 9: Philosophers - Ninth project for the formation of software engineers at school 42 São Paulo.

🏠 home    

/**
 * It taken the forks
 * 
 * @param philo a pointer to a t_philo struct
 * 
 * @return a void.
 */
void	philo_fork_lock(t_philo *philo)
{
	if (check_stop(philo->data))
	{
		pthread_mutex_lock(&philo->fork);
		pthread_mutex_lock(&philo->data->printer_mutex);
		if (check_stop(philo->data))
			printf ("%lli %i has taken a fork\n", get_time() \
					- philo->data->start_time, philo->id);
		pthread_mutex_unlock(&philo->data->printer_mutex);
		if (philo->data->number_of_philosophers == 1)
		{
			while (check_stop(philo->data))
				usleep(1000);
			pthread_mutex_unlock(&philo->fork);
			return ;
		}
		pthread_mutex_lock(&philo->prev->fork);
		pthread_mutex_lock(&philo->data->printer_mutex);
		if (check_stop(philo->data))
			printf ("%lli %i has taken a fork\n", get_time() \
					- philo->data->start_time, philo->id);
		pthread_mutex_unlock(&philo->data->printer_mutex);
	}
}

/**
 * Unlock the forks
 * 
 * @param philo the philosopher
 */
void	philo_fork_unlock(t_philo *philo)
{
	pthread_mutex_unlock(&philo->prev->fork);
	pthread_mutex_unlock(&philo->fork);
}

/**
 * Loop for the philosopher to eat
 * 
 * @param philo a pointer to the philosopher struct
 */
void	philo_eat(t_philo *philo)
{
	if (check_stop(philo->data))
	{
		pthread_mutex_lock(&philo->data->time_to_eat_mutex);
		philo->last_time_to_eat = get_time();
		pthread_mutex_unlock(&philo->data->time_to_eat_mutex);
		pthread_mutex_lock(&philo->data->printer_mutex);
		if (check_stop(philo->data))
			printf ("%lli %i is eating\n", get_time() \
					- philo->data->start_time, philo->id);
		pthread_mutex_lock(&philo->data->eat_mutex);
		philo->eat_count++;
		pthread_mutex_unlock(&philo->data->eat_mutex);
		eat_count_check(philo->data);
		pthread_mutex_unlock(&philo->data->printer_mutex);
		if (check_stop(philo->data))
			usleep(philo->data->time_to_eat * 1000);
	}
}

/**
 * Loop for the philosopher to sleep
 * 
 * @param philo a pointer to the philosopher struct
 */
void	philo_sleep(t_philo *philo)
{
	if (check_stop(philo->data))
	{
		pthread_mutex_lock(&philo->data->printer_mutex);
		if (check_stop(philo->data))
			printf ("%lli %i is sleeping\n", get_time() \
					- philo->data->start_time, philo->id);
		pthread_mutex_unlock(&philo->data->printer_mutex);
		if (check_stop(philo->data))
			usleep(philo->data->time_to_sleep * 1000);
	}
}

/**
 * Loop for the philosopher to think
 * 
 * @param philo a pointer to the philosopher struct
 */
void	philo_think(t_philo *philo)
{
	if (check_stop(philo->data))
	{
		pthread_mutex_lock(&philo->data->printer_mutex);
		if (check_stop(philo->data))
			printf ("%lli %i is thinking\n", get_time() \
					- philo->data->start_time, philo->id);
		pthread_mutex_unlock(&philo->data->printer_mutex);
	}
}