aboutsummaryrefslogtreecommitdiff
path: root/philo_one/src
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_one/src
parent473cf5d7576744b679b7a504232b5ebd4b5d689f (diff)
downloadphilosophers-47e1a7b4af69e1998182126310e42af83cf214ed.tar.gz
philosophers-47e1a7b4af69e1998182126310e42af83cf214ed.tar.bz2
philosophers-47e1a7b4af69e1998182126310e42af83cf214ed.zip
Norming and destroy on error
Diffstat (limited to 'philo_one/src')
-rw-r--r--philo_one/src/main.c36
-rw-r--r--philo_one/src/philo.c12
2 files changed, 37 insertions, 11 deletions
diff --git a/philo_one/src/main.c b/philo_one/src/main.c
index dce44fc..eec5d4e 100644
--- a/philo_one/src/main.c
+++ b/philo_one/src/main.c
@@ -6,13 +6,35 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/11/24 05:53:02 by cacharle #+# #+# */
-/* Updated: 2020/09/30 09:49:48 by cacharle ### ########.fr */
+/* Updated: 2020/10/05 15:42:09 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
#include "philo_one.h"
-int main(int argc, char **argv)
+static int st_setup(
+ t_philo_conf *conf,
+ t_philo **philos,
+ pthread_mutex_t **forks)
+{
+ if ((*forks = forks_new(conf->philo_num)) == NULL)
+ return (1);
+ if ((*philos = philos_new(conf, *forks)) == NULL)
+ {
+ forks_destroy(*forks, conf->philo_num);
+ return (1);
+ }
+ if (pthread_mutex_init(&conf->mutex_stdout, NULL) != 0)
+ {
+ forks_destroy(*forks, conf->philo_num);
+ free(*philos);
+ return (1);
+ }
+ conf->all_alive = true;
+ return (0);
+}
+
+int main(int argc, char **argv)
{
t_philo_conf conf;
t_philo *philos;
@@ -22,14 +44,14 @@ int main(int argc, char **argv)
return (1);
if (conf.philo_num == 0)
return (0);
- if ((forks = forks_new(conf.philo_num)) == NULL)
- return (1);
- if ((philos = philos_new(&conf, forks)) == NULL)
+ if (st_setup(&conf, &philos, &forks) != 0)
return (1);
- conf.all_alive = true;
- pthread_mutex_init(&conf.mutex_stdout, NULL);
if (!philos_start(philos, conf.philo_num))
+ {
+ forks_destroy(forks, conf.philo_num);
+ free(philos);
return (1);
+ }
while (conf.all_alive)
;
philos_detach(philos, conf.philo_num);
diff --git a/philo_one/src/philo.c b/philo_one/src/philo.c
index 6ea1024..30c0a7c 100644
--- a/philo_one/src/philo.c
+++ b/philo_one/src/philo.c
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/09 23:47:14 by cacharle #+# #+# */
-/* Updated: 2020/10/05 14:29:10 by cacharle ### ########.fr */
+/* Updated: 2020/10/05 16:13:10 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -43,8 +43,12 @@ bool philos_start(t_philo *philos, int num)
&philos[i].thread,
NULL,
(t_routine)routine_philo,
- (void*)(philos + i)) == -1)
+ (void*)(philos + i)) != 0)
+ {
+ while (--i >= 0)
+ pthread_detach(philos[i].thread);
return (false);
+ }
}
return (true);
}
@@ -53,9 +57,9 @@ void philos_detach(t_philo *philos, int num)
{
int i;
+ if (philos == NULL)
+ return ;
i = -1;
while (++i < num)
- {
pthread_detach(philos[i].thread);
- }
}