diff options
| author | Charles Cabergs <me@cacharle.xyz> | 2021-01-01 14:46:13 +0100 |
|---|---|---|
| committer | Charles Cabergs <me@cacharle.xyz> | 2021-01-01 14:46:13 +0100 |
| commit | b9d93edf40f228fcc6e18e9e6d0a1c5db498c004 (patch) | |
| tree | 5abb172c43b54adcf4caef33ede04f64c957246f /philo_two/src/main.c | |
| parent | 83df2b3a49bd3f627ae304bb1529e27d9b2d988c (diff) | |
| download | philosophers-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.c | 31 |
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) |
