From 8db8d2c8d4d6d4dc14a1d2edd994827c392b462d Mon Sep 17 00:00:00 2001 From: Danny Jonker Date: Mon, 22 May 2023 05:51:23 +0200 Subject: [PATCH] just the norm --- philo_bonus/philo.h | 6 ++++- philo_bonus/src/init.c | 6 +++-- philo_bonus/src/philo.c | 51 ++++++++++++++++++++++++++++------------- philo_bonus/src/util.c | 3 ++- 4 files changed, 46 insertions(+), 20 deletions(-) diff --git a/philo_bonus/philo.h b/philo_bonus/philo.h index fe43a38..2a8a1db 100644 --- a/philo_bonus/philo.h +++ b/philo_bonus/philo.h @@ -6,7 +6,7 @@ /* By: houtworm // \ \ __| | | \ \/ / */ /* (| | )|_| |_| |> < */ /* Created: 2023/03/11 07:19:18 by houtworm /'\_ _/`\__|\__,_/_/\_\ */ -/* Updated: 2023/05/21 22:38:50 by djonker \___)=(___/ */ +/* Updated: 2023/05/22 04:46:06 by djonker \___)=(___/ */ /* */ /* ************************************************************************** */ @@ -19,6 +19,7 @@ # include # include # include +# include # include # include @@ -36,11 +37,13 @@ typedef struct s_philo long long *eattime; long long *sleeptime; long long *strtt; + int *alive; int *target; sem_t *done; sem_t *dead; sem_t *hold; sem_t *print; + pthread_t thrd; } t_philo; typedef struct s_strct @@ -54,6 +57,7 @@ typedef struct s_strct long long sleeptime; long long strtt; int target; + int alive; sem_t *done; sem_t *dead; sem_t *hold; diff --git a/philo_bonus/src/init.c b/philo_bonus/src/init.c index 43f5477..f386690 100644 --- a/philo_bonus/src/init.c +++ b/philo_bonus/src/init.c @@ -6,7 +6,7 @@ /* By: houtworm // \ \ __| | | \ \/ / */ /* (| | )|_| |_| |> < */ /* Created: 2023/03/15 02:00:19 by houtworm /'\_ _/`\__|\__,_/_/\_\ */ -/* Updated: 2023/05/21 23:42:42 by djonker \___)=(___/ */ +/* Updated: 2023/05/22 05:47:07 by djonker \___)=(___/ */ /* */ /* ************************************************************************** */ @@ -98,6 +98,7 @@ int ft_releasetheminds(t_strct *strct, int m) i = 0; if (m) { + strct->strtt = ft_time(); while (i < strct->philos) { sem_post(strct->hold); @@ -123,6 +124,7 @@ int ft_releasetheminds(t_strct *strct, int m) void ft_safeprint(t_philo *ps, char *str) { sem_wait(ps->print); - printf("%lld %d %s\n", ft_time() - *ps->strtt, ps->id, str); + if (*ps->alive) + printf("%lld %d %s\n", ft_time() - *ps->strtt, ps->id, str); sem_post(ps->print); } diff --git a/philo_bonus/src/philo.c b/philo_bonus/src/philo.c index b9d0f75..f2a92fe 100644 --- a/philo_bonus/src/philo.c +++ b/philo_bonus/src/philo.c @@ -6,7 +6,7 @@ /* By: houtworm // \ \ __| | | \ \/ / */ /* (| | )|_| |_| |> < */ /* Created: 2023/03/11 06:42:31 by houtworm /'\_ _/`\__|\__,_/_/\_\ */ -/* Updated: 2023/05/21 23:42:45 by djonker \___)=(___/ */ +/* Updated: 2023/05/22 05:49:17 by djonker \___)=(___/ */ /* */ /* ************************************************************************** */ @@ -15,11 +15,11 @@ int ft_eatsleepthink(t_philo *ps) { sem_wait(ps->forks); - if (ft_time() - ps->lastfood > *ps->dietime) - return (1); + /*if (ft_time() - ps->lastfood > *ps->dietime)*/ + /*return (1);*/ ft_safeprint(ps, "has taken a fork"); - if (*ps->philos == 1) - return (1); + /*if (*ps->philos == 1)*/ + /*return (1);*/ sem_wait(ps->forks); ft_safeprint(ps, "has taken a fork"); ps->lastfood = ft_time(); @@ -36,10 +36,24 @@ int ft_eatsleepthink(t_philo *ps) ft_safeprint(ps, "is thinking"); ps->cycles++; if (ps->cycles == *ps->target) - return (2); + sem_post(ps->done); return (0); } +void *ft_alivecheck(void *pointer) +{ + t_philo *philo; + + philo = pointer; + while (ft_time() - philo->lastfood < *philo->dietime) + usleep(500); + sem_post(philo->dead); + sem_wait(philo->print); + if (*philo->alive) + printf("%lld %d died\n", ft_time() - *philo->strtt, philo->id); + return (NULL); +} + void ft_cycle(void *pointer) { t_philo *philo; @@ -51,17 +65,14 @@ void ft_cycle(void *pointer) sem_wait(philo->hold); philo->dead = sem_open("dead", 0); philo->done = sem_open("done", 0); + philo->print = sem_open("print", 0); if ((philo->id - 1) % 2) usleep(*philo->eattime * 1000); while (!ret) ret = ft_eatsleepthink(philo); - if (ret == 1) - { - printf("%lld %d died\n", ft_time() - *philo->strtt, philo->id); - sem_post(philo->dead); - } - if (ret == 2) - sem_post(philo->done); + sem_wait(philo->print); + *philo->alive = 0; + sem_post(philo->print); } int ft_startcycle(t_strct *strct) @@ -72,20 +83,25 @@ int ft_startcycle(t_strct *strct) strct->strtt = ft_time(); while (i < strct->philos) { - strct->philo[i].lastfood = ft_time(); strct->pid[i] = fork(); + strct->alive = 1; if (strct->pid[i] == 0) { + strct->philo[i].alive = &strct->alive; + pthread_create(&strct->philo[i].thrd, NULL, ft_alivecheck, &strct->philo[i]); + strct->philo[i].lastfood = ft_time(); ft_cycle(&strct->philo[i]); sem_close(strct->dead); sem_close(strct->done); sem_close(strct->hold); sem_close(strct->forks); sem_close(strct->print); + pthread_join(strct->philo[i].thrd, NULL); free(strct); exit(0); } i++; + usleep(1000); } return (0); } @@ -94,6 +110,7 @@ int ft_cyclecounter(t_strct *strct) { int i; sem_t *done; + sem_t *print; int philos; int target; @@ -106,15 +123,17 @@ int ft_cyclecounter(t_strct *strct) sem_close(strct->print); free(strct); done = sem_open("done", 0); + print = sem_open("print", 0); i = 0; while (i < philos) { sem_wait(done); i++; } - printf("All %d philosophers have", philos); - printf(" finished all %d cycles\n", target); sem_close(done); + sem_wait(print); + printf("All philosophers have finished all %d cycles\n", target); + sem_close(print); exit (0); } diff --git a/philo_bonus/src/util.c b/philo_bonus/src/util.c index 8790664..9c25fc5 100644 --- a/philo_bonus/src/util.c +++ b/philo_bonus/src/util.c @@ -6,7 +6,7 @@ /* By: houtworm // \ \ __| | | \ \/ / */ /* (| | )|_| |_| |> < */ /* Created: 2023/03/15 02:01:41 by houtworm /'\_ _/`\__|\__,_/_/\_\ */ -/* Updated: 2023/05/21 22:11:28 by djonker \___)=(___/ */ +/* Updated: 2023/05/22 04:34:47 by djonker \___)=(___/ */ /* */ /* ************************************************************************** */ @@ -81,6 +81,7 @@ int ft_cleanup(t_strct *strct) kill(strct->pid[502], 15); while (i < strct->philos) { + pthread_join(strct->philo[i].thrd, NULL); kill(strct->pid[i], 15); i++; }