aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Cabergs <me@cacharle.xyz>2020-10-01 09:36:07 +0200
committerCharles Cabergs <me@cacharle.xyz>2020-10-01 09:36:07 +0200
commita237321ee53f44793ebc8b9db26b743f092b5e40 (patch)
tree2e983b03826f41bf64af16d3665b12d74a121fa1
parentf57ec76fd1be738d7b9d82c1f7548883efa15d0c (diff)
downloadphilosophers-a237321ee53f44793ebc8b9db26b743f092b5e40.tar.gz
philosophers-a237321ee53f44793ebc8b9db26b743f092b5e40.tar.bz2
philosophers-a237321ee53f44793ebc8b9db26b743f092b5e40.zip
Fixing philo_three working
-rw-r--r--philo_three/Makefile4
-rw-r--r--philo_three/src/child.c37
-rw-r--r--philo_three/src/event.c57
-rw-r--r--philo_three/src/main.c44
-rw-r--r--philo_three/src/philo_three.h23
5 files changed, 89 insertions, 76 deletions
diff --git a/philo_three/Makefile b/philo_three/Makefile
index 6428673..a9f4640 100644
--- a/philo_three/Makefile
+++ b/philo_three/Makefile
@@ -6,12 +6,12 @@
# By: cacharle <marvin@42.fr> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2019/11/24 05:50:15 by cacharle #+# #+# #
-# Updated: 2020/09/30 08:48:37 by cacharle ### ########.fr #
+# Updated: 2020/10/01 09:10:44 by cacharle ### ########.fr #
# #
# **************************************************************************** #
RM = rm -f
-MAKE = --no-print-directory
+MAKE = make --no-print-directory
COMMON_DIR = ../common
diff --git a/philo_three/src/child.c b/philo_three/src/child.c
index f0e7ebd..5bc0129 100644
--- a/philo_three/src/child.c
+++ b/philo_three/src/child.c
@@ -6,46 +6,47 @@
/* By: cacharle <me@cacharle.xyz> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/09/30 14:36:16 by cacharle #+# #+# */
-/* Updated: 2020/09/30 14:39:58 by cacharle ### ########.fr */
+/* Updated: 2020/10/01 09:11:29 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
#include "philo_three.h"
-void *routine_death(t_philo_args *arg)
+void *routine_death(t_philo *philo)
{
t_time current;
current = h_time_now();
- while (current - arg->time_last_eat < arg->conf->timeout_death)
+ while (current - philo->time_last_eat < philo->conf->timeout_death)
current = h_time_now();
- if (!arg->conf->all_alive)
- return (NULL);
- event_die(arg);
+ event_die(philo);
return (NULL);
}
-pid_t child_start(t_philo_args *arg)
+pid_t child_start(t_philo *philo)
{
- pid_t pid;
- sem_t *forks;
- sem_t *sem_stdout;
- sem_t *sem_alive;
+ pid_t pid;
+ pthread_t thread_death;
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();
+ philo->forks = sem_open(PHILO_SEM_NAME, 0);
+ philo->sem_stdout = sem_open(PHILO_SEM_STDOUT_NAME, 0);
+ philo->sem_dead = sem_open(PHILO_SEM_DEAD_NAME, 0);
+ philo->time_last_eat = h_time_now();
+ pthread_create(&thread_death, NULL, (t_routine)routine_death, philo);
+ event_think(philo);
while (true)
{
- event_eat();
- event_sleep();
- event_think();
+ event_take_fork(philo);
+ event_take_fork(philo);
+ philo->time_last_eat = h_time_now();
+ event_eat(philo);
+ event_sleep(philo);
+ event_think(philo);
}
exit(0);
}
diff --git a/philo_three/src/event.c b/philo_three/src/event.c
index 9ff9012..edeeb38 100644
--- a/philo_three/src/event.c
+++ b/philo_three/src/event.c
@@ -6,56 +6,55 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/14 21:37:50 by cacharle #+# #+# */
-/* Updated: 2020/09/30 14:47:49 by cacharle ### ########.fr */
+/* Updated: 2020/10/01 09:04:39 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
-#include "philo_two.h"
+#include "philo_three.h"
-void event_take_fork(t_philo *arg)
+void event_take_fork(t_philo *philo)
{
- sem_wait(arg->forks);
- sem_wait(&arg->conf->mutex_stdout);
- philo_put(arg->id, EVENT_FORK);
- sem_post(&arg->conf->mutex_stdout);
+ sem_wait(philo->forks);
+ sem_wait(philo->sem_stdout);
+ philo_put(philo->id, EVENT_FORK);
+ sem_post(philo->sem_stdout);
}
-void event_eat(t_philo *arg)
+void event_eat(t_philo *philo)
{
int eat_counter;
eat_counter = 0;
- while (eat_counter < arg->conf->meal_num)
+ while (eat_counter < philo->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);
+ sem_wait(philo->sem_stdout);
+ philo_put(philo->id, EVENT_EAT);
+ sem_post(philo->sem_stdout);
+ usleep(philo->conf->timeout_eat * 1000);
eat_counter++;
}
}
-void event_think(t_philo *arg)
+void event_think(t_philo *philo)
{
- sem_wait(&arg->conf->mutex_stdout);
- philo_put(arg->id, EVENT_THINK);
- sem_post(&arg->conf->mutex_stdout);
+ sem_wait(philo->sem_stdout);
+ philo_put(philo->id, EVENT_THINK);
+ sem_post(philo->sem_stdout);
}
-void event_sleep(int id, t_time timeout_sleep, sem_t *sem_stdout, sem_t )
+void event_sleep(t_philo *philo)
{
- 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);
+ sem_wait(philo->sem_stdout);
+ philo_put(philo->id, EVENT_SLEEP);
+ sem_post(philo->sem_stdout);
+ sem_post(philo->forks);
+ sem_post(philo->forks);
+ usleep(philo->conf->timeout_sleep * 1000);
}
-void event_die(int id, sem_t *sem_stdout, sem_t *sem_dead)
+void event_die(t_philo *philo)
{
- sem_wait(sem_stdout);
- philo_put(arg->id, EVENT_DIE);
- arg->conf->all_alive = false;
- sem_post(sem_dead);
+ sem_wait(philo->sem_stdout);
+ philo_put(philo->id, EVENT_DIE);
+ sem_post(philo->sem_dead);
}
diff --git a/philo_three/src/main.c b/philo_three/src/main.c
index a69766f..a6c6370 100644
--- a/philo_three/src/main.c
+++ b/philo_three/src/main.c
@@ -6,15 +6,27 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/15 00:45:24 by cacharle #+# #+# */
-/* Updated: 2020/09/30 14:45:20 by cacharle ### ########.fr */
+/* Updated: 2020/10/01 09:34:55 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
#include "philo_three.h"
+sem_t *philo_sem_create(char *name, int value)
+{
+ sem_t *sem;
+
+ sem_unlink(name);
+ sem = sem_open(name, O_CREAT | O_EXCL, 0700, value);
+ if (sem == SEM_FAILED)
+ return (NULL);
+ return (sem);
+}
+
int main(int argc, char **argv)
{
t_philo_args args;
+ t_philo philo;
sem_t *forks;
sem_t *sem_stdout;
sem_t *sem_dead;
@@ -22,30 +34,29 @@ int main(int argc, char **argv)
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)
+ if ((forks = philo_sem_create(PHILO_SEM_NAME, args.philo_num)) == NULL ||
+ (sem_stdout = philo_sem_create(PHILO_SEM_STDOUT_NAME, 1)) == NULL ||
+ (sem_dead = philo_sem_create(PHILO_SEM_DEAD_NAME, 1)) == NULL)
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);
+ {
+ philo.conf = &args;
+ philo.id = i + 1;
+ if ((pids[i] = child_start(&philo)) == -1)
+ {
+ free(pids);
+ return (1);
+ }
+ }
sem_wait(sem_dead);
+ sem_wait(sem_dead);
i = -1;
while (++i < args.philo_num)
@@ -54,8 +65,9 @@ int main(int argc, char **argv)
sem_close(forks);
sem_close(sem_stdout);
+ sem_close(sem_dead);
sem_unlink(PHILO_SEM_NAME);
sem_unlink(PHILO_SEM_STDOUT_NAME);
+ sem_unlink(PHILO_SEM_DEAD_NAME);
return (0);
}
-
diff --git a/philo_three/src/philo_three.h b/philo_three/src/philo_three.h
index 97882d0..c0afe78 100644
--- a/philo_three/src/philo_three.h
+++ b/philo_three/src/philo_three.h
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/15 00:46:26 by cacharle #+# #+# */
-/* Updated: 2020/09/30 14:47:49 by cacharle ### ########.fr */
+/* Updated: 2020/10/01 09:10:30 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -15,6 +15,7 @@
# include <unistd.h>
# include <stdlib.h>
+# include <signal.h>
# include <sys/time.h>
# include <semaphore.h>
@@ -22,19 +23,19 @@
# 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"
+# define PHILO_SEM_DEAD_NAME "semaphore_philo_three_dead"
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);
+ t_philo_args *conf;
+ int id;
+ t_time time_last_eat;
+ sem_t *forks;
+ sem_t *sem_stdout;
+ sem_t *sem_dead;
+} t_philo;
+
+pid_t child_start(t_philo *arg);
void event_take_fork(t_philo *arg);
void event_eat(t_philo *arg);