From b9d93edf40f228fcc6e18e9e6d0a1c5db498c004 Mon Sep 17 00:00:00 2001 From: Charles Cabergs Date: Fri, 1 Jan 2021 14:46:13 +0100 Subject: Added meal counter to philo_two (still segfault 10% of the time) --- philo_two/src/main.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) (limited to 'philo_two/src/main.c') 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 +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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) -- cgit