From f57ec76fd1be738d7b9d82c1f7548883efa15d0c Mon Sep 17 00:00:00 2001 From: Charles Cabergs Date: Wed, 30 Sep 2020 14:48:12 +0200 Subject: Added philo_three draft --- philo_three/src/child.c | 53 +++++++++++++++++++++++++++++++++++++ philo_three/src/event.c | 61 +++++++++++++++++++++++++++++++++++++++++++ philo_three/src/main.c | 61 +++++++++++++++++++++++++++++++++++++++++++ philo_three/src/philo_three.h | 45 +++++++++++++++++++++++++++++++ 4 files changed, 220 insertions(+) create mode 100644 philo_three/src/child.c create mode 100644 philo_three/src/event.c create mode 100644 philo_three/src/main.c create mode 100644 philo_three/src/philo_three.h (limited to 'philo_three/src') diff --git a/philo_three/src/child.c b/philo_three/src/child.c new file mode 100644 index 0000000..f0e7ebd --- /dev/null +++ b/philo_three/src/child.c @@ -0,0 +1,53 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* child.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/09/30 14:36:16 by cacharle #+# #+# */ +/* Updated: 2020/09/30 14:39:58 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "philo_three.h" + +void *routine_death(t_philo_args *arg) +{ + t_time current; + + current = h_time_now(); + while (current - arg->time_last_eat < arg->conf->timeout_death) + current = h_time_now(); + if (!arg->conf->all_alive) + return (NULL); + event_die(arg); + return (NULL); +} + +pid_t child_start(t_philo_args *arg) +{ + pid_t pid; + sem_t *forks; + sem_t *sem_stdout; + sem_t *sem_alive; + + pid = fork(); + if (pid == -1) + return (-1); + if (pid == 0) + { + forks = sem_open(PHILO_SEM_NAME, 0); + sem_stdout = sem_open(PHILO_SEM_STDOUT_NAME, 0); + pthread_create(&death_thread, NULL, (t_routine)routine_death, &args); + event_think(); + while (true) + { + event_eat(); + event_sleep(); + event_think(); + } + exit(0); + } + return pid; +} diff --git a/philo_three/src/event.c b/philo_three/src/event.c new file mode 100644 index 0000000..9ff9012 --- /dev/null +++ b/philo_three/src/event.c @@ -0,0 +1,61 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* event.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/14 21:37:50 by cacharle #+# #+# */ +/* Updated: 2020/09/30 14:47:49 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "philo_two.h" + +void event_take_fork(t_philo *arg) +{ + sem_wait(arg->forks); + sem_wait(&arg->conf->mutex_stdout); + philo_put(arg->id, EVENT_FORK); + sem_post(&arg->conf->mutex_stdout); +} + +void event_eat(t_philo *arg) +{ + int eat_counter; + + eat_counter = 0; + while (eat_counter < arg->conf->meal_num) + { + sem_wait(&arg->conf->mutex_stdout); + philo_put(arg->id, EVENT_EAT); + sem_post(&arg->conf->mutex_stdout); + usleep(arg->conf->timeout_eat * 1000); + eat_counter++; + } +} + +void event_think(t_philo *arg) +{ + sem_wait(&arg->conf->mutex_stdout); + philo_put(arg->id, EVENT_THINK); + sem_post(&arg->conf->mutex_stdout); +} + +void event_sleep(int id, t_time timeout_sleep, sem_t *sem_stdout, sem_t ) +{ + sem_wait(sem_stdout); + philo_put(id, EVENT_SLEEP); + sem_post(sem_stdout); + sem_post(arg->forks); + sem_post(arg->forks); + usleep(arg->conf->timeout_sleep * 1000); +} + +void event_die(int id, sem_t *sem_stdout, sem_t *sem_dead) +{ + sem_wait(sem_stdout); + philo_put(arg->id, EVENT_DIE); + arg->conf->all_alive = false; + sem_post(sem_dead); +} diff --git a/philo_three/src/main.c b/philo_three/src/main.c new file mode 100644 index 0000000..a69766f --- /dev/null +++ b/philo_three/src/main.c @@ -0,0 +1,61 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/15 00:45:24 by cacharle #+# #+# */ +/* Updated: 2020/09/30 14:45:20 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "philo_three.h" + +int main(int argc, char **argv) +{ + t_philo_args args; + sem_t *forks; + sem_t *sem_stdout; + sem_t *sem_dead; + + if (!parse_args(&args, argc, argv)) + return (1); + + sem_unlink(PHILO_SEM_NAME); + forks = sem_open(PHILO_SEM_NAME, O_CREAT | O_EXCL, 0700, args.philo_num); + if (forks == SEM_FAILED) + return (1); + + sem_unlink(PHILO_SEM_STDOUT_NAME); + sem_stdout = sem_open(PHILO_SEM_STDOUT_NAME, O_CREAT | O_EXCL, 0700, 1); + if (sem_stdout == SEM_FAILED) + return (1); + + sem_unlink(PHILO_SEM_ALIVE_NAME); + sem_dead = sem_open(PHILO_SEM_ALIVE_NAME, O_CREAT | O_EXCL, 0700, 1); + if (sem_dead == SEM_FAILED) + return (1); + + pid_t pid; + pid_t *pids; + pids = malloc(sizeof(pid_t) * args.philo_num); + + int i = -1; + while (++i < args.philo_num) + pids[i] = child_start(&args); + + sem_wait(sem_dead); + + i = -1; + while (++i < args.philo_num) + kill(pids[i], SIGKILL); + free(pids); + + sem_close(forks); + sem_close(sem_stdout); + sem_unlink(PHILO_SEM_NAME); + sem_unlink(PHILO_SEM_STDOUT_NAME); + return (0); +} + diff --git a/philo_three/src/philo_three.h b/philo_three/src/philo_three.h new file mode 100644 index 0000000..97882d0 --- /dev/null +++ b/philo_three/src/philo_three.h @@ -0,0 +1,45 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* philo_three.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/15 00:46:26 by cacharle #+# #+# */ +/* Updated: 2020/09/30 14:47:49 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef PHILO_THREE_H +# define PHILO_THREE_H + +# include +# include +# include +# include + +# include "common.h" + +# define PHILO_SEM_NAME "semaphore_philo_three" +# define PHILO_SEM_STDOUT_NAME "semaphore_philo_three_stdout" +# define PHILO_SEM_ALIVE_NAME "semaphore_philo_three_alive" + +typedef struct +{ + long int philo_num; + t_time timeout_death; + t_time timeout_eat; + t_time timeout_sleep; + long int meal_num; + +} t_philo_conf; + +pid_t child_start(t_philo_args *arg); + +void event_take_fork(t_philo *arg); +void event_eat(t_philo *arg); +void event_think(t_philo *arg); +void event_sleep(t_philo *arg); +void event_die(t_philo *arg); + +#endif -- cgit