aboutsummaryrefslogtreecommitdiff
path: root/philo_two/src/main.c
diff options
context:
space:
mode:
authorCharles Cabergs <me@cacharle.xyz>2020-10-05 17:00:51 +0200
committerCharles Cabergs <me@cacharle.xyz>2020-10-05 17:00:51 +0200
commit47e1a7b4af69e1998182126310e42af83cf214ed (patch)
treeaedb74e78e9fdbd7a6593ea773d47364bd158e61 /philo_two/src/main.c
parent473cf5d7576744b679b7a504232b5ebd4b5d689f (diff)
downloadphilosophers-47e1a7b4af69e1998182126310e42af83cf214ed.tar.gz
philosophers-47e1a7b4af69e1998182126310e42af83cf214ed.tar.bz2
philosophers-47e1a7b4af69e1998182126310e42af83cf214ed.zip
Norming and destroy on error
Diffstat (limited to 'philo_two/src/main.c')
-rw-r--r--philo_two/src/main.c76
1 files changed, 52 insertions, 24 deletions
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 <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}