philosopher/philo/utils_threads.c
Etienne Rey-bethbeder 29832e45c3 _
2023-04-09 22:41:29 +02:00

81 lines
2.4 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* utils_threads.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/03/29 20:44:51 by erey-bet #+# #+# */
/* Updated: 2023/04/09 19:29:54 by erey-bet ### ########.fr */
/* */
/* ************************************************************************** */
#include "philo.h"
long long get_utime(void)
{
struct timeval time;
gettimeofday(&time, NULL);
return (time.tv_sec * 1000000 + time.tv_usec);
}
void message_die(t_philo *philo, char *msg)
{
t_config *config;
char send[1024];
int i;
config = philo->same->config;
pthread_mutex_lock(&philo->same->mutex[config->nbr_philo + 2]);
i = ft_lltos(send, (get_utime() - philo->same->time) / 1000);
send[i++] = ' ';
i += ft_lltos(send + i, philo->only->id + 1);
send[i++] = ' ';
while (*msg)
send[i++] = *msg++;
write(1, send, i);
pthread_mutex_unlock(&philo->same->mutex[config->nbr_philo + 2]);
}
void message(t_philo *philo, char *msg)
{
t_config *config;
char send[1024];
int i;
config = philo->same->config;
pthread_mutex_lock(&philo->same->mutex[config->nbr_philo + 2]);
i = ft_lltos(send, (get_utime() - philo->same->time) / 1000);
send[i++] = ' ';
i += ft_lltos(send + i, philo->only->id + 1);
send[i++] = ' ';
while (*msg)
send[i++] = *msg++;
if (!finish(philo, philo->only->last_eat_time))
write(1, send, i);
pthread_mutex_unlock(&philo->same->mutex[config->nbr_philo + 2]);
}
int verif_finish(t_philo *philo, t_only *only)
{
if (finish(philo, only->last_eat_time))
{
drop_fork(philo, only->id, only->next_id);
return (1);
}
return (0);
}
int verif_die_eating(t_philo *philo, t_only *only, t_config *config)
{
if (get_utime() - only->last_eat_time + config->time_eat
>= config->time_die)
{
usleep(config->time_die - (get_utime() - only->last_eat_time));
drop_fork(philo, only->id, only->next_id);
return (0);
}
return (1);
}