From a237321ee53f44793ebc8b9db26b743f092b5e40 Mon Sep 17 00:00:00 2001 From: Charles Cabergs Date: Thu, 1 Oct 2020 09:36:07 +0200 Subject: Fixing philo_three working --- philo_three/Makefile | 4 +-- philo_three/src/child.c | 37 ++++++++++++++-------------- philo_three/src/event.c | 57 +++++++++++++++++++++---------------------- philo_three/src/main.c | 44 +++++++++++++++++++++------------ philo_three/src/philo_three.h | 23 ++++++++--------- 5 files changed, 89 insertions(+), 76 deletions(-) (limited to 'philo_three') diff --git a/philo_three/Makefile b/philo_three/Makefile index 6428673..a9f4640 100644 --- a/philo_three/Makefile +++ b/philo_three/Makefile @@ -6,12 +6,12 @@ # By: cacharle +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2019/11/24 05:50:15 by cacharle #+# #+# # -# Updated: 2020/09/30 08:48:37 by cacharle ### ########.fr # +# Updated: 2020/10/01 09:10:44 by cacharle ### ########.fr # # # # **************************************************************************** # RM = rm -f -MAKE = --no-print-directory +MAKE = make --no-print-directory COMMON_DIR = ../common diff --git a/philo_three/src/child.c b/philo_three/src/child.c index f0e7ebd..5bc0129 100644 --- a/philo_three/src/child.c +++ b/philo_three/src/child.c @@ -6,46 +6,47 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/09/30 14:36:16 by cacharle #+# #+# */ -/* Updated: 2020/09/30 14:39:58 by cacharle ### ########.fr */ +/* Updated: 2020/10/01 09:11:29 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "philo_three.h" -void *routine_death(t_philo_args *arg) +void *routine_death(t_philo *philo) { t_time current; current = h_time_now(); - while (current - arg->time_last_eat < arg->conf->timeout_death) + while (current - philo->time_last_eat < philo->conf->timeout_death) current = h_time_now(); - if (!arg->conf->all_alive) - return (NULL); - event_die(arg); + event_die(philo); return (NULL); } -pid_t child_start(t_philo_args *arg) +pid_t child_start(t_philo *philo) { - pid_t pid; - sem_t *forks; - sem_t *sem_stdout; - sem_t *sem_alive; + pid_t pid; + pthread_t thread_death; pid = fork(); if (pid == -1) return (-1); if (pid == 0) { - forks = sem_open(PHILO_SEM_NAME, 0); - sem_stdout = sem_open(PHILO_SEM_STDOUT_NAME, 0); - pthread_create(&death_thread, NULL, (t_routine)routine_death, &args); - event_think(); + philo->forks = sem_open(PHILO_SEM_NAME, 0); + philo->sem_stdout = sem_open(PHILO_SEM_STDOUT_NAME, 0); + philo->sem_dead = sem_open(PHILO_SEM_DEAD_NAME, 0); + philo->time_last_eat = h_time_now(); + pthread_create(&thread_death, NULL, (t_routine)routine_death, philo); + event_think(philo); while (true) { - event_eat(); - event_sleep(); - event_think(); + event_take_fork(philo); + event_take_fork(philo); + philo->time_last_eat = h_time_now(); + event_eat(philo); + event_sleep(philo); + event_think(philo); } exit(0); } diff --git a/philo_three/src/event.c b/philo_three/src/event.c index 9ff9012..edeeb38 100644 --- a/philo_three/src/event.c +++ b/philo_three/src/event.c @@ -6,56 +6,55 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/14 21:37:50 by cacharle #+# #+# */ -/* Updated: 2020/09/30 14:47:49 by cacharle ### ########.fr */ +/* Updated: 2020/10/01 09:04:39 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ -#include "philo_two.h" +#include "philo_three.h" -void event_take_fork(t_philo *arg) +void event_take_fork(t_philo *philo) { - sem_wait(arg->forks); - sem_wait(&arg->conf->mutex_stdout); - philo_put(arg->id, EVENT_FORK); - sem_post(&arg->conf->mutex_stdout); + sem_wait(philo->forks); + sem_wait(philo->sem_stdout); + philo_put(philo->id, EVENT_FORK); + sem_post(philo->sem_stdout); } -void event_eat(t_philo *arg) +void event_eat(t_philo *philo) { int eat_counter; eat_counter = 0; - while (eat_counter < arg->conf->meal_num) + while (eat_counter < philo->conf->meal_num) { - sem_wait(&arg->conf->mutex_stdout); - philo_put(arg->id, EVENT_EAT); - sem_post(&arg->conf->mutex_stdout); - usleep(arg->conf->timeout_eat * 1000); + sem_wait(philo->sem_stdout); + philo_put(philo->id, EVENT_EAT); + sem_post(philo->sem_stdout); + usleep(philo->conf->timeout_eat * 1000); eat_counter++; } } -void event_think(t_philo *arg) +void event_think(t_philo *philo) { - sem_wait(&arg->conf->mutex_stdout); - philo_put(arg->id, EVENT_THINK); - sem_post(&arg->conf->mutex_stdout); + sem_wait(philo->sem_stdout); + philo_put(philo->id, EVENT_THINK); + sem_post(philo->sem_stdout); } -void event_sleep(int id, t_time timeout_sleep, sem_t *sem_stdout, sem_t ) +void event_sleep(t_philo *philo) { - sem_wait(sem_stdout); - philo_put(id, EVENT_SLEEP); - sem_post(sem_stdout); - sem_post(arg->forks); - sem_post(arg->forks); - usleep(arg->conf->timeout_sleep * 1000); + sem_wait(philo->sem_stdout); + philo_put(philo->id, EVENT_SLEEP); + sem_post(philo->sem_stdout); + sem_post(philo->forks); + sem_post(philo->forks); + usleep(philo->conf->timeout_sleep * 1000); } -void event_die(int id, sem_t *sem_stdout, sem_t *sem_dead) +void event_die(t_philo *philo) { - sem_wait(sem_stdout); - philo_put(arg->id, EVENT_DIE); - arg->conf->all_alive = false; - sem_post(sem_dead); + sem_wait(philo->sem_stdout); + philo_put(philo->id, EVENT_DIE); + sem_post(philo->sem_dead); } diff --git a/philo_three/src/main.c b/philo_three/src/main.c index a69766f..a6c6370 100644 --- a/philo_three/src/main.c +++ b/philo_three/src/main.c @@ -6,15 +6,27 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/15 00:45:24 by cacharle #+# #+# */ -/* Updated: 2020/09/30 14:45:20 by cacharle ### ########.fr */ +/* Updated: 2020/10/01 09:34:55 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "philo_three.h" +sem_t *philo_sem_create(char *name, int value) +{ + sem_t *sem; + + sem_unlink(name); + sem = sem_open(name, O_CREAT | O_EXCL, 0700, value); + if (sem == SEM_FAILED) + return (NULL); + return (sem); +} + int main(int argc, char **argv) { t_philo_args args; + t_philo philo; sem_t *forks; sem_t *sem_stdout; sem_t *sem_dead; @@ -22,29 +34,28 @@ int main(int argc, char **argv) if (!parse_args(&args, argc, argv)) return (1); - sem_unlink(PHILO_SEM_NAME); - forks = sem_open(PHILO_SEM_NAME, O_CREAT | O_EXCL, 0700, args.philo_num); - if (forks == SEM_FAILED) - return (1); - sem_unlink(PHILO_SEM_STDOUT_NAME); - sem_stdout = sem_open(PHILO_SEM_STDOUT_NAME, O_CREAT | O_EXCL, 0700, 1); - if (sem_stdout == SEM_FAILED) - return (1); - - sem_unlink(PHILO_SEM_ALIVE_NAME); - sem_dead = sem_open(PHILO_SEM_ALIVE_NAME, O_CREAT | O_EXCL, 0700, 1); - if (sem_dead == SEM_FAILED) + if ((forks = philo_sem_create(PHILO_SEM_NAME, args.philo_num)) == NULL || + (sem_stdout = philo_sem_create(PHILO_SEM_STDOUT_NAME, 1)) == NULL || + (sem_dead = philo_sem_create(PHILO_SEM_DEAD_NAME, 1)) == NULL) return (1); - pid_t pid; pid_t *pids; pids = malloc(sizeof(pid_t) * args.philo_num); int i = -1; while (++i < args.philo_num) - pids[i] = child_start(&args); + { + philo.conf = &args; + philo.id = i + 1; + if ((pids[i] = child_start(&philo)) == -1) + { + free(pids); + return (1); + } + } + sem_wait(sem_dead); sem_wait(sem_dead); i = -1; @@ -54,8 +65,9 @@ int main(int argc, char **argv) sem_close(forks); sem_close(sem_stdout); + sem_close(sem_dead); sem_unlink(PHILO_SEM_NAME); sem_unlink(PHILO_SEM_STDOUT_NAME); + sem_unlink(PHILO_SEM_DEAD_NAME); return (0); } - diff --git a/philo_three/src/philo_three.h b/philo_three/src/philo_three.h index 97882d0..c0afe78 100644 --- a/philo_three/src/philo_three.h +++ b/philo_three/src/philo_three.h @@ -6,7 +6,7 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/15 00:46:26 by cacharle #+# #+# */ -/* Updated: 2020/09/30 14:47:49 by cacharle ### ########.fr */ +/* Updated: 2020/10/01 09:10:30 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,7 @@ # include # include +# include # include # include @@ -22,19 +23,19 @@ # define PHILO_SEM_NAME "semaphore_philo_three" # define PHILO_SEM_STDOUT_NAME "semaphore_philo_three_stdout" -# define PHILO_SEM_ALIVE_NAME "semaphore_philo_three_alive" +# define PHILO_SEM_DEAD_NAME "semaphore_philo_three_dead" typedef struct { - long int philo_num; - t_time timeout_death; - t_time timeout_eat; - t_time timeout_sleep; - long int meal_num; - -} t_philo_conf; - -pid_t child_start(t_philo_args *arg); + t_philo_args *conf; + int id; + t_time time_last_eat; + sem_t *forks; + sem_t *sem_stdout; + sem_t *sem_dead; +} t_philo; + +pid_t child_start(t_philo *arg); void event_take_fork(t_philo *arg); void event_eat(t_philo *arg); -- cgit