aboutsummaryrefslogtreecommitdiff
path: root/philo_two/src/main.c
diff options
context:
space:
mode:
authorCharles Cabergs <me@cacharle.xyz>2021-01-01 14:46:13 +0100
committerCharles Cabergs <me@cacharle.xyz>2021-01-01 14:46:13 +0100
commitb9d93edf40f228fcc6e18e9e6d0a1c5db498c004 (patch)
tree5abb172c43b54adcf4caef33ede04f64c957246f /philo_two/src/main.c
parent83df2b3a49bd3f627ae304bb1529e27d9b2d988c (diff)
downloadphilosophers-b9d93edf40f228fcc6e18e9e6d0a1c5db498c004.tar.gz
philosophers-b9d93edf40f228fcc6e18e9e6d0a1c5db498c004.tar.bz2
philosophers-b9d93edf40f228fcc6e18e9e6d0a1c5db498c004.zip
Added meal counter to philo_two (still segfault 10% of the time)
Diffstat (limited to 'philo_two/src/main.c')
-rw-r--r--philo_two/src/main.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/philo_two/src/main.c b/philo_two/src/main.c
index 788122b..46ec474 100644
--- a/philo_two/src/main.c
+++ b/philo_two/src/main.c
@@ -6,14 +6,16 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/14 22:45:23 by cacharle #+# #+# */
-/* Updated: 2020/10/24 13:02:12 by charles ### ########.fr */
+/* Updated: 2021/01/01 14:44:21 by charles ### ########.fr */
/* */
/* ************************************************************************** */
#include "philo_two.h"
-#define PHILO_SEM_NAME "semaphore_philo_two"
-#define PHILO_SEM_STDOUT_NAME "semaphore_philo_two_stdout"
+#define PHILO_SEM_NAME "semaphore_philo_two"
+#define PHILO_SEM_STDOUT_NAME "semaphore_philo_two_stdout"
+#define PHILO_SEM_MEAL_NUM_FINISHED_COUNTER_NAME "semaphore_philo_two_meal_num"
+
static int st_destroy(
sem_t *forks,
@@ -21,15 +23,17 @@ static int st_destroy(
pthread_t *threads,
t_philo_conf *conf)
{
- int i;
-
- i = -1;
- while (++i < conf->philo_num)
- sem_post(forks);
+ /* int i; */
+ /* */
+ /* i = -1; */
+ /* while (++i < conf->philo_num) */
+ /* sem_post(forks); */
sem_close(forks);
sem_unlink(PHILO_SEM_NAME);
sem_close(conf->sem_stdout);
sem_unlink(PHILO_SEM_STDOUT_NAME);
+ sem_close(conf->sem_meal_num_finished_counter);
+ sem_unlink(PHILO_SEM_MEAL_NUM_FINISHED_COUNTER_NAME);
free(philos);
free(threads);
return (1);
@@ -51,13 +55,20 @@ static int st_setup(
conf->sem_stdout = sem_open(PHILO_SEM_STDOUT_NAME, O_CREAT | O_EXCL, 0700, 1);
if (conf->sem_stdout == SEM_FAILED)
return (1);
+ sem_unlink(PHILO_SEM_MEAL_NUM_FINISHED_COUNTER_NAME);
+ conf->sem_meal_num_finished_counter = sem_open(
+ PHILO_SEM_MEAL_NUM_FINISHED_COUNTER_NAME, O_CREAT | O_EXCL, 0700, 1);
+ if (conf->sem_meal_num_finished_counter == SEM_FAILED)
+ return (1);
*threads = NULL;
if ((*philos = routine_create_philos(conf, *forks)) == NULL ||
(*threads = malloc(sizeof(pthread_t) * conf->philo_num)) == NULL)
return (st_destroy(*forks, *philos, *threads, conf));
conf->all_alive = true;
+ conf->meal_num_finished_counter = 0;
i = -1;
while (++i < conf->philo_num)
+ {
if (pthread_create(*threads + i, NULL,
(t_routine)routine_philo, *philos + i) != 0)
{
@@ -65,6 +76,8 @@ static int st_setup(
pthread_detach((*threads)[i]);
return (st_destroy(*forks, *philos, *threads, conf));
}
+ usleep(200);
+ }
return (0);
}
@@ -82,7 +95,7 @@ int main(int argc, char **argv)
return (0);
if (st_setup(&conf, &philos, &forks, &threads) != 0)
return (1);
- while (conf.all_alive)
+ while (!philo_finished(&conf))
;
i = -1;
while (++i < conf.philo_num)