diff options
| author | Charles Cabergs <me@cacharle.xyz> | 2020-09-29 16:16:20 +0200 |
|---|---|---|
| committer | Charles Cabergs <me@cacharle.xyz> | 2020-09-29 16:16:20 +0200 |
| commit | b6f4db572d7d40c178ec286373422faa2172f135 (patch) | |
| tree | 03fd9601de99de8111994f487cfdacc7127ce6d0 /philo_two/src/routine.c | |
| parent | 6bfcd3c6f921e7717e61167b291bb27bd3f66386 (diff) | |
| download | philosophers-b6f4db572d7d40c178ec286373422faa2172f135.tar.gz philosophers-b6f4db572d7d40c178ec286373422faa2172f135.tar.bz2 philosophers-b6f4db572d7d40c178ec286373422faa2172f135.zip | |
philo_two file restructuration
Diffstat (limited to 'philo_two/src/routine.c')
| -rw-r--r-- | philo_two/src/routine.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/philo_two/src/routine.c b/philo_two/src/routine.c new file mode 100644 index 0000000..fefeb34 --- /dev/null +++ b/philo_two/src/routine.c @@ -0,0 +1,74 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* routine.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/14 23:00:07 by cacharle #+# #+# */ +/* Updated: 2020/02/15 00:35:26 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "philo_two.h" + +void *routine_philo(void *void_arg) +{ + t_routine_arg *arg; + pthread_t thread_death; + + arg = (t_routine_arg*)void_arg; + io_think(arg); + if (!arg->args->all_alive) + return (NULL); + arg->time_last_eat = h_time_now(); + if (pthread_create(&thread_death, NULL, routine_death, arg) != 0) + return (NULL); + while (arg->args->all_alive) + { + sem_wait(arg->forks); + sem_wait(arg->forks); + io_eat(arg); + sem_post(arg->forks); + sem_post(arg->forks); + arg->time_last_eat = h_time_now(); + io_sleep(arg); + io_think(arg); + } + pthread_join(thread_death, NULL); + return (NULL); +} + +void *routine_death(void *void_arg) +{ + t_routine_arg *arg; + t_time current; + + arg = (t_routine_arg*)void_arg; + current = h_time_now(); + while (arg->args->all_alive && + current - arg->time_last_eat < arg->args->timeout_death) + current = h_time_now(); + io_die(arg); + pthread_mutex_lock(&arg->args->mutex_all_alive); + arg->args->all_alive = FALSE; + pthread_mutex_unlock(&arg->args->mutex_all_alive); + return (NULL); +} + +t_routine_arg *routine_args_create(t_philo_args *philo_args, sem_t *forks) +{ + int i; + t_routine_arg *routine_args; + + if ((routine_args = malloc(sizeof(t_routine_arg) * philo_args->philo_num)) == NULL) + return (NULL); + i = -1; + while (++i < philo_args->philo_num) + { + routine_args[i].id = i + 1; + routine_args[i].forks = forks; + routine_args[i].args = philo_args; + } + return (routine_args); +} |
