From 3de1ac17b3b62c850d984538431222c4930d0e90 Mon Sep 17 00:00:00 2001 From: whaffman Date: Fri, 10 Jan 2025 16:00:52 +0100 Subject: [PATCH] splitphilos working on 1 5fork bug and death --- .vscode/launch.json | 33 ++++++++++ .vscode/tasks.json | 20 ++++++ philo/Makefile | 4 +- philo/inc/philo.h | 15 +++-- philo/philo | Bin 17608 -> 42944 bytes philo/src/check_alive.c | 18 ++--- philo/src/create_mutexes.c | 2 +- philo/src/create_philos.c | 2 +- philo/src/destroy_mutexes.c | 2 +- philo/src/free_philos.c | 2 +- philo/src/main.c | 4 +- philo/src/monitor_death.c | 12 ---- philo/src/parse_arguments.c | 4 +- philo/src/philo_routine.c | 94 ++++++++++++++++++++------- philo/src/{ => utils}/get_time.c | 0 philo/src/{ => utils}/print_rules.c | 0 philo/src/{ => utils}/print_status.c | 0 17 files changed, 146 insertions(+), 66 deletions(-) create mode 100644 .vscode/launch.json delete mode 100644 philo/src/monitor_death.c rename philo/src/{ => utils}/get_time.c (100%) rename philo/src/{ => utils}/print_rules.c (100%) rename philo/src/{ => utils}/print_status.c (100%) diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..e10d105 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,33 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug philo", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/philo/philo", + "args": [ + "5", "800", "200", "200", "7" + ], + "stopAtEntry": false, + "cwd": "${workspaceFolder}/philo", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + "preLaunchTask": "build philo", + "miDebuggerPath": "/usr/bin/gdb", + "logging": { + "moduleLoad": false, + "trace": false + }, + "internalConsoleOptions": "openOnSessionStart" + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index e69de29..58a7db6 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -0,0 +1,20 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build philo", + "type": "shell", + "command": "make", + "args": [ + "-C", + "philo" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": ["$gcc"], + "detail": "Build the philo project using the Makefile" + } + ] +} \ No newline at end of file diff --git a/philo/Makefile b/philo/Makefile index e772ede..a2a4c72 100644 --- a/philo/Makefile +++ b/philo/Makefile @@ -14,12 +14,10 @@ NAME = philo SRC_PATH = src INC_PATH = inc - OBJ_PATH = obj VPATH = src:src/utils SOURCES = $(shell basename -a $(shell find $(SRC_PATH) -type f -name "*.c")) - OBJECTS = $(addprefix $(OBJ_PATH)/, $(SOURCES:.c=.o)) DEPENDS = ${OBJECTS:.o=.d} @@ -27,7 +25,7 @@ CC = cc RM = rm -rf INCLUDES = -I./$(INC_PATH) -CFLAGS = -Wall -Wextra -Werror -MMD +CFLAGS = -Wall -Wextra -Werror -MMD -g UNAME_S := $(shell uname -s) ifeq ($(UNAME_S),Linux) diff --git a/philo/inc/philo.h b/philo/inc/philo.h index e58f18e..949fe08 100644 --- a/philo/inc/philo.h +++ b/philo/inc/philo.h @@ -12,6 +12,8 @@ # define SUCCESS 1 # define FAILURE 0 +# define START_DELAY 500 + # define ERROR_USAGE "Usage: ./philo number_of_philosophers time_to_die " \ "time_to_eat time_to_sleep [number_of_times_each_philosopher_must_eat]\n" # define ERROR_MUTEX "Can not create mutex" @@ -25,10 +27,10 @@ typedef struct s_rules int time_to_eat; int time_to_sleep; int n_must_eat; - int death; + int finished; int start_time; pthread_mutex_t *print_lock; - pthread_mutex_t *death_lock; + pthread_mutex_t *finished_lock; pthread_mutex_t *forks; struct s_philo *philos; @@ -64,10 +66,9 @@ void print_status(t_philo *philo, char *status); void *philo_routine(void *philo); int join_threads(t_rules *rules); void print_rules(t_rules *rules); -int check_alive(t_philo *philo); - - - - +int check_death(t_philo *philo); +void philo_die(t_philo *philo); +int philo_died_while_sleeping(t_philo *philo, int time); +int philo_eat(t_philo *philo); #endif \ No newline at end of file diff --git a/philo/philo b/philo/philo index 2de1e7f4f197977f5b1da43fc850c1dc241def79..8ce4455cf6858e8eae19805bc2606a361e15839a 100755 GIT binary patch literal 42944 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 > philo->rules->time_to_die) - { - print_status(philo, "died"); - philo->death = 1; - pthread_mutex_lock(philo->rules->death_lock); - philo->rules->death = 1; - pthread_mutex_unlock(philo->rules->death_lock); - pthread_mutex_unlock(philo->l_fork); - pthread_mutex_unlock(philo->r_fork); - return (FAILURE); - } - return (SUCCESS); -} \ No newline at end of file + return (get_time() - philo->last_meal >= philo->rules->time_to_die); +} + diff --git a/philo/src/create_mutexes.c b/philo/src/create_mutexes.c index edf94af..699e9ba 100644 --- a/philo/src/create_mutexes.c +++ b/philo/src/create_mutexes.c @@ -6,7 +6,7 @@ int create_mutexes(t_rules *rules) i = 0; printf("creating mutexes\n"); - if (pthread_mutex_init(rules->death_lock, NULL)) + if (pthread_mutex_init(rules->finished_lock, NULL)) return(printf("death mutex created"), FAILURE); if (pthread_mutex_init(rules->print_lock, NULL)) return(printf("print mutex created"), FAILURE); diff --git a/philo/src/create_philos.c b/philo/src/create_philos.c index c0cf919..08a8a76 100644 --- a/philo/src/create_philos.c +++ b/philo/src/create_philos.c @@ -18,7 +18,7 @@ int create_philos(t_rules *rules) philo->death = 0; philo->pid = 0; philo->rules = rules; - philo->last_meal = get_time(); + philo->last_meal = get_time() + START_DELAY; i++; } return (SUCCESS); diff --git a/philo/src/destroy_mutexes.c b/philo/src/destroy_mutexes.c index 89a7a89..e446f94 100644 --- a/philo/src/destroy_mutexes.c +++ b/philo/src/destroy_mutexes.c @@ -5,7 +5,7 @@ int destroy_mutexes(t_rules *rules) int i; i = 0; - if (pthread_mutex_destroy(rules->death_lock)) + if (pthread_mutex_destroy(rules->finished_lock)) return(FAILURE); if (pthread_mutex_destroy(rules->print_lock)) return(FAILURE); diff --git a/philo/src/free_philos.c b/philo/src/free_philos.c index 1950c1d..cc493fb 100644 --- a/philo/src/free_philos.c +++ b/philo/src/free_philos.c @@ -5,5 +5,5 @@ void free_philos(t_rules *rules) free(rules->philos); free(rules->forks); free(rules->print_lock); - free(rules->death_lock); + free(rules->finished_lock); } \ No newline at end of file diff --git a/philo/src/main.c b/philo/src/main.c index 7aba7cc..20da70c 100644 --- a/philo/src/main.c +++ b/philo/src/main.c @@ -13,13 +13,13 @@ int main(int argc, char *argv[]) if (FAILURE == create_mutexes(&rules)) return (printf(ERROR_MUTEX), EXIT_FAILURE); printf("mutexes created\n"); - rules.start_time = get_time(); + rules.start_time = get_time() + START_DELAY; if (FAILURE == create_threads(&rules)) return (printf(ERROR_THREADS), EXIT_FAILURE); printf("threads created\n"); if (FAILURE == join_threads(&rules)) return (printf(ERROR_THREADS), EXIT_FAILURE); - + printf("threads joined\n"); if (FAILURE == destroy_mutexes(&rules)) return (printf(ERROR_MUTEX), EXIT_FAILURE); printf("mutexes destroyed\n"); diff --git a/philo/src/monitor_death.c b/philo/src/monitor_death.c deleted file mode 100644 index 9835129..0000000 --- a/philo/src/monitor_death.c +++ /dev/null @@ -1,12 +0,0 @@ -#include "philo.h" - -void *monitor_death(void *arg) -{ - int i; - t_rules *rules; - - rules = (t_rules *) i = 0; - while (i < rules->n_philos) - if (rules->philos[i].last_meal - get_time() < rules->time_to_die) - -} \ No newline at end of file diff --git a/philo/src/parse_arguments.c b/philo/src/parse_arguments.c index 19131d7..4dae160 100644 --- a/philo/src/parse_arguments.c +++ b/philo/src/parse_arguments.c @@ -17,8 +17,8 @@ int parse_arguments(int argc,char *argv[], t_rules *rules) if (argc == 6 && !ph_atoi(argv[5], &rules->n_must_eat)) return (FAILURE); rules->print_lock = malloc(sizeof(pthread_mutex_t)); - rules->death_lock = malloc(sizeof(pthread_mutex_t)); - if (!rules->print_lock || !rules->death_lock) + rules->finished_lock = malloc(sizeof(pthread_mutex_t)); + if (!rules->print_lock || !rules->finished_lock) return (FAILURE); rules->forks = malloc(rules->n_philos * sizeof(pthread_mutex_t)); if (!rules->forks) diff --git a/philo/src/philo_routine.c b/philo/src/philo_routine.c index 79daba7..f2807e1 100644 --- a/philo/src/philo_routine.c +++ b/philo/src/philo_routine.c @@ -1,36 +1,86 @@ #include "philo.h" +void set_finished(t_rules *rules) +{ + pthread_mutex_lock(rules->finished_lock); + rules->finished = 1; + pthread_mutex_unlock(rules->finished_lock); +} + +int get_finished(t_rules *rules) +{ + int finished; + + pthread_mutex_lock(rules->finished_lock); + finished = rules->finished; + pthread_mutex_unlock(rules->finished_lock); + return (finished); +} +void philo_die(t_philo *philo) +{ + print_status(philo, "died 💀"); + philo->death = 1; + set_finished(philo->rules); + pthread_mutex_unlock(philo->l_fork); + pthread_mutex_unlock(philo->r_fork); +} + +int philo_died_while_sleeping(t_philo *philo, int time) +{ + const int start = get_time(); + while(get_time() - start < time) + { + if (philo->last_meal - get_time() >= philo->rules->time_to_die) + return (SUCCESS); + usleep(500); + } + return (FAILURE); +} +int philo_eat(t_philo *philo) +{ + if (philo->id % 2 == 1) + { + pthread_mutex_lock(philo->r_fork); + print_status(philo, "has taken a fork 🍴"); + } + pthread_mutex_lock(philo->l_fork); + print_status(philo, "has taken a fork 🍴"); + if (philo->id % 2 == 0) + { + pthread_mutex_lock(philo->r_fork); + print_status(philo, "has taken a fork 🍴"); + } + if (check_death(philo)) + return (philo_die(philo), FAILURE); + print_status(philo, "is eating 🍝"); + philo->last_meal = get_time(); + philo->n_eat++; + return (SUCCESS); +} void *philo_routine(void *arg) { t_philo *philo; philo = (t_philo *)arg; - while (!philo->death && !philo->rules->death + + while (get_time() < philo->rules->start_time) + usleep(50); + while (!philo->death && !philo->rules->finished && (philo->n_eat < philo->rules->n_must_eat || philo->rules->n_must_eat == -1)) { - if (philo->id % 2 == 1) - { - pthread_mutex_lock(philo->r_fork); - print_status(philo, "has taken a fork"); - } - pthread_mutex_lock(philo->l_fork); - print_status(philo, "has taken a fork"); - if (philo->id % 2 == 0) - { - pthread_mutex_lock(philo->r_fork); - print_status(philo, "has taken a fork"); - } - if (!check_alive(philo)) - break ; - print_status(philo, "is eating"); - philo->last_meal = get_time(); - philo->n_eat++; - usleep(philo->rules->time_to_eat * 1000); + + if (check_death(philo)) + return (philo_die(philo), NULL); + if (!philo_eat(philo)) + return (NULL); + if (philo_died_while_sleeping(philo, philo->rules->time_to_eat)) + return (philo_die(philo), NULL); pthread_mutex_unlock(philo->l_fork); pthread_mutex_unlock(philo->r_fork); - print_status(philo, "is sleeping"); - usleep(philo->rules->time_to_sleep * 1000); - print_status(philo, "is thinking"); + print_status(philo, "is sleeping 💤"); + if (philo_died_while_sleeping(philo, philo->rules->time_to_sleep)) + return (philo_die(philo), NULL); + print_status(philo, "is thinking 💭"); } return (NULL); } \ No newline at end of file diff --git a/philo/src/get_time.c b/philo/src/utils/get_time.c similarity index 100% rename from philo/src/get_time.c rename to philo/src/utils/get_time.c diff --git a/philo/src/print_rules.c b/philo/src/utils/print_rules.c similarity index 100% rename from philo/src/print_rules.c rename to philo/src/utils/print_rules.c diff --git a/philo/src/print_status.c b/philo/src/utils/print_status.c similarity index 100% rename from philo/src/print_status.c rename to philo/src/utils/print_status.c