From 47e1a7b4af69e1998182126310e42af83cf214ed Mon Sep 17 00:00:00 2001 From: Charles Cabergs Date: Mon, 5 Oct 2020 17:00:51 +0200 Subject: Norming and destroy on error --- philo_two/src/main.c | 76 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 52 insertions(+), 24 deletions(-) (limited to 'philo_two/src/main.c') diff --git a/philo_two/src/main.c b/philo_two/src/main.c index f53f892..b86dc51 100644 --- a/philo_two/src/main.c +++ b/philo_two/src/main.c @@ -6,7 +6,7 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/14 22:45:23 by cacharle #+# #+# */ -/* Updated: 2020/10/05 14:31:09 by cacharle ### ########.fr */ +/* Updated: 2020/10/05 16:23:19 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,7 +14,55 @@ #define PHILO_SEM_NAME "semaphore_philo_two" -int main(int argc, char **argv) +static int st_destroy( + sem_t *forks, + t_philo *philos, + pthread_t *threads, + int philo_num) +{ + int i; + + i = -1; + while (++i < philo_num) + sem_post(forks); + sem_close(forks); + sem_unlink(PHILO_SEM_NAME); + free(philos); + free(threads); + return (1); +} + +static int st_setup( + t_philo_conf *conf, + t_philo **philos, + sem_t **forks, + pthread_t **threads) +{ + int i; + + sem_unlink(PHILO_SEM_NAME); + *forks = sem_open(PHILO_SEM_NAME, O_CREAT | O_EXCL, 0700, conf->philo_num); + if (*forks == SEM_FAILED) + return (1); + *threads = NULL; + if ((*philos = routine_create_philos(conf, *forks)) == NULL || + (*threads = malloc(sizeof(pthread_t) * conf->philo_num)) == NULL || + pthread_mutex_init(&conf->mutex_stdout, NULL) != 0) + return (st_destroy(*forks, *philos, *threads, conf->philo_num)); + conf->all_alive = true; + i = -1; + while (++i < conf->philo_num) + if (pthread_create(*threads + i, NULL, + (t_routine)routine_philo, *philos + i) != 0) + { + while (--i >= 0) + pthread_detach((*threads)[i]); + return (st_destroy(*forks, *philos, *threads, conf->philo_num)); + } + return (0); +} + +int main(int argc, char **argv) { int i; t_philo_conf conf; @@ -26,33 +74,13 @@ int main(int argc, char **argv) return (1); if (conf.philo_num == 0) return (0); - sem_unlink(PHILO_SEM_NAME); - forks = sem_open(PHILO_SEM_NAME, O_CREAT | O_EXCL, 0700, conf.philo_num); - if (forks == SEM_FAILED) + if (st_setup(&conf, &philos, &forks, &threads) != 0) return (1); - if ((philos = routine_create_philos(&conf, forks)) == NULL) - return (1); - if ((threads = malloc(sizeof(pthread_t) * conf.philo_num)) == NULL) - return (1); - conf.all_alive = true; - pthread_mutex_init(&conf.mutex_stdout, NULL); - i = -1; - while (++i < conf.philo_num) - if (pthread_create(threads + i, NULL, - (t_routine)routine_philo, philos + i) < 0) - return (1); while (conf.all_alive) ; i = -1; while (++i < conf.philo_num) pthread_detach(threads[i]); - i = -1; - while (++i < conf.philo_num) - sem_post(forks); - sem_close(forks); - sem_unlink(PHILO_SEM_NAME); - pthread_mutex_destroy(&conf.mutex_stdout); - free(threads); - free(philos); + st_destroy(forks, philos, threads, conf.philo_num); return (0); } -- cgit