diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-02-14 21:24:22 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-02-14 21:24:22 +0100 |
| commit | f6a960c09c9593af72ff6da2c3ed501e01a0f429 (patch) | |
| tree | 783c452486c2528fe0df25d76f49d1d4f20c1d47 /philo_one/routine.c | |
| parent | adbe9cdb61e5d12299b8872b2ac27a48036bc95d (diff) | |
| download | philosophers-f6a960c09c9593af72ff6da2c3ed501e01a0f429.tar.gz philosophers-f6a960c09c9593af72ff6da2c3ed501e01a0f429.tar.bz2 philosophers-f6a960c09c9593af72ff6da2c3ed501e01a0f429.zip | |
philo one working (with what may be a hack)
Diffstat (limited to 'philo_one/routine.c')
| -rw-r--r-- | philo_one/routine.c | 79 |
1 files changed, 58 insertions, 21 deletions
diff --git a/philo_one/routine.c b/philo_one/routine.c index 713e4ee..c9e2339 100644 --- a/philo_one/routine.c +++ b/philo_one/routine.c @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/10 01:11:27 by cacharle #+# #+# */ -/* Updated: 2020/02/14 00:45:23 by cacharle ### ########.fr */ +/* Updated: 2020/02/14 21:22:52 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,26 +18,54 @@ void *routine_philo(void *void_arg) pthread_t thread_death; arg = (t_routine_arg*)void_arg; + + if (!arg->args->all_alive) + return (NULL); + arg->philo->time_last_eat = h_time_now(); if (pthread_create(&thread_death, NULL, routine_death, arg) != 0) return (NULL); - philo_think(arg->philo->id); - while (arg->philo->alive) + if (!arg->args->all_alive) + return (NULL); + pthread_mutex_lock(&arg->args->mutex_stdout); + if (arg->args->all_alive) + philo_think(arg->philo->id); + pthread_mutex_unlock(&arg->args->mutex_stdout); + while (arg->args->all_alive) { if (!arg->fork_left->used && !arg->fork_right->used) { pthread_mutex_lock(&arg->fork_left->mutex); pthread_mutex_lock(&arg->fork_right->mutex); - philo_eat(arg->philo->id, arg->args->timeout_eat); + arg->fork_left->used = TRUE; + arg->fork_right->used = TRUE; + pthread_mutex_unlock(&arg->fork_left->mutex); + pthread_mutex_unlock(&arg->fork_right->mutex); + + arg->philo->time_last_eat = h_time_now(); + pthread_mutex_lock(&arg->args->mutex_stdout); + if (arg->args->all_alive) + philo_eat(arg->philo->id, arg->args->timeout_eat); + pthread_mutex_unlock(&arg->args->mutex_stdout); + + pthread_mutex_lock(&arg->fork_left->mutex); + pthread_mutex_lock(&arg->fork_right->mutex); + arg->fork_left->used = FALSE; + arg->fork_right->used = FALSE; 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); + + pthread_mutex_lock(&arg->args->mutex_stdout); + if (arg->args->all_alive) + philo_sleep(arg->philo->id, arg->args->timeout_sleep); + pthread_mutex_unlock(&arg->args->mutex_stdout); + + pthread_mutex_lock(&arg->args->mutex_stdout); + if (arg->args->all_alive) + philo_think(arg->philo->id); + pthread_mutex_unlock(&arg->args->mutex_stdout); } } - if (arg->philo->alive) - philo_die(arg->philo->id); - /* pthread_join( */ - free(arg); + pthread_join(thread_death, NULL); return (NULL); } @@ -45,19 +73,28 @@ void *routine_death(void *void_arg) { t_routine_arg *arg; t_time current; - struct timeval tv; + /* if (!arg->args->all_alive) */ + /* return (NULL); */ arg = (t_routine_arg*)void_arg; - if (gettimeofday(&tv, NULL) == -1) - return (NULL); - current = h_timeval_to_time(&tv); - while (arg->philo->alive && + + current = h_time_now(); + /* pthread_mutex_lock(&arg->args->mutex_stdout); */ + /* printf("===\n"); */ + /* printf("%d crr %ld\n", arg->philo->id, current); */ + /* printf("%d lst %ld\n", arg->philo->id, arg->philo->time_last_eat); */ + /* printf("%d dif %ld\n", arg->philo->id, current - arg->philo->time_last_eat); */ + /* printf("===\n"); */ + /* pthread_mutex_unlock(&arg->args->mutex_stdout); */ + while (arg->args->all_alive && 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; + current = h_time_now(); + pthread_mutex_lock(&arg->args->mutex_stdout); + pthread_mutex_lock(&arg->args->mutex_all_alive); + if (arg->args->all_alive) + philo_die(arg->philo->id); + arg->args->all_alive = FALSE; + pthread_mutex_unlock(&arg->args->mutex_all_alive); + pthread_mutex_unlock(&arg->args->mutex_stdout); return (NULL); } |
