aboutsummaryrefslogtreecommitdiff
path: root/philo_one/routine.c
diff options
context:
space:
mode:
Diffstat (limited to 'philo_one/routine.c')
-rw-r--r--philo_one/routine.c48
1 files changed, 29 insertions, 19 deletions
diff --git a/philo_one/routine.c b/philo_one/routine.c
index 48f3c0d..713e4ee 100644
--- a/philo_one/routine.c
+++ b/philo_one/routine.c
@@ -6,48 +6,58 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/10 01:11:27 by cacharle #+# #+# */
-/* Updated: 2020/02/10 01:19:13 by cacharle ### ########.fr */
+/* Updated: 2020/02/14 00:45:23 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
#include "philo_one.h"
-void *routine_philo(t_routine_arg *routine_arg)
+void *routine_philo(void *void_arg)
{
- pthread_t thread_death;
+ t_routine_arg *arg;
+ pthread_t thread_death;
- if (pthread_create(&thread_death, NULL, routine_death, routine_arg) != 0)
+ arg = (t_routine_arg*)void_arg;
+ if (pthread_create(&thread_death, NULL, routine_death, arg) != 0)
return (NULL);
- philo_think(routine_arg->philo->id);
- while (routine_arg->philo->alive && !philo_starved(routine_arg->philo))
+ philo_think(arg->philo->id);
+ while (arg->philo->alive)
{
- if (!routine_arg->fork_left->used && !routine_arg->fork_right->used)
+ if (!arg->fork_left->used && !arg->fork_right->used)
{
- pthread_mutex_lock(&routine_arg->fork_left->mutex);
- pthread_mutex_lock(&routine_arg->fork_right->mutex);
- philo_eat(routine_arg->philo->id, routine_arg->args->timeout_eat);
- pthread_mutex_unlock(&routine_arg->fork_left->mutex);
- pthread_mutex_unlock(&routine_arg->fork_right->mutex);
- philo_sleep(routine_arg->philo->id, routine_arg->args->timeout_sleep);
- philo_think(routine_arg->philo->id);
+ pthread_mutex_lock(&arg->fork_left->mutex);
+ pthread_mutex_lock(&arg->fork_right->mutex);
+ philo_eat(arg->philo->id, arg->args->timeout_eat);
+ pthread_mutex_unlock(&arg->fork_left->mutex);
+ pthread_mutex_unlock(&arg->fork_right->mutex);
+ philo_sleep(arg->philo->id, arg->args->timeout_sleep);
+ philo_think(arg->philo->id);
}
}
- if (routine_arg->philo->alive)
- philo_die(routine_arg->philo->id);
- free(routine_arg);
+ if (arg->philo->alive)
+ philo_die(arg->philo->id);
+ /* pthread_join( */
+ free(arg);
return (NULL);
}
-void *routine_death(t_routine_arg *arg)
+void *routine_death(void *void_arg)
{
+ t_routine_arg *arg;
+ t_time current;
struct timeval tv;
+ arg = (t_routine_arg*)void_arg;
if (gettimeofday(&tv, NULL) == -1)
return (NULL);
+ current = h_timeval_to_time(&tv);
while (arg->philo->alive &&
- arg->philo->time_last_eat - tv.asd > arg->args->timeout_death)
+ current - arg->philo->time_last_eat < arg->args->timeout_death)
+ {
if (gettimeofday(&tv, NULL) == -1)
return (NULL);
+ current = h_timeval_to_time(&tv);
+ }
arg->philo->alive = FALSE;
return (NULL);
}