diff --git a/Makefile b/Makefile index 12dec78..275f740 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,8 @@ LIBFT_D = ./libft LIBFT = $(LIBFT_D)/libft.a SRCS = main.c \ - init.c + init.c \ + exec.c DIR_OBJS = builds OBJS = $(SRCS:%.c=$(DIR_OBJS)/%.o) diff --git a/headers/philo_proto.h b/headers/philo_proto.h index a97cd0d..c007515 100644 --- a/headers/philo_proto.h +++ b/headers/philo_proto.h @@ -1,8 +1,13 @@ #ifndef PHILO_PROTO_H # define PHILO_PROTO_H +pthread_mutex_t mutex; + // init.c -t_philo *init(char **av, pthread_t **id); +t_philo *init(int ac, char **av, pthread_t **id); + +// exec.c +void *philo_exec(void *arg); #endif diff --git a/srcs/exec.c b/srcs/exec.c new file mode 100644 index 0000000..acdaa15 --- /dev/null +++ b/srcs/exec.c @@ -0,0 +1,19 @@ +#include "philo.h" + +void *philo_exec(void *arg) +{ + t_philo *philo; + int nbr; + + philo = (t_philo*)arg; + nbr = philo->philo_nbr; + + pthread_mutex_lock(&mutex); + write(1, "-", 1); + ft_putnbr_fd(nbr, 1); + write(1, "\n", 1); + pthread_mutex_unlock(&mutex); + + return (NULL); +} + diff --git a/srcs/init.c b/srcs/init.c index 54b4fba..a2512a6 100644 --- a/srcs/init.c +++ b/srcs/init.c @@ -7,6 +7,13 @@ t_philo *init_struc_philo(t_philo *new, t_conditions *conditions, int i) return (new); } +// it's just because init_chain_philo was too long +void put_prev_n_next(t_philo *new, t_philo *philo) +{ + new->prev = philo; + philo->next = new; +} + t_philo *init_chain_philo(t_conditions *conditions, int n) { t_philo *start; @@ -18,14 +25,13 @@ t_philo *init_chain_philo(t_conditions *conditions, int n) while (i < n) { new = malloc(sizeof(t_philo) * 1); + if (new == NULL) + return (NULL); new = init_struc_philo(new, conditions, i); if (i == 0) start = new; else - { - new->prev = philo; - philo->next = new; - } + put_prev_n_next(new, philo); philo = new; i++; } @@ -35,16 +41,38 @@ t_philo *init_chain_philo(t_conditions *conditions, int n) return (philo); } -t_philo *init(char **av, pthread_t **id) +t_conditions *init_conditions(int ac, char **av) +{ + t_conditions *conditions; + + if (ac == 5 || ac == 6) + { + conditions = malloc(sizeof(t_conditions)); + conditions->n_phi = ft_atoi(av[1]); + conditions->t_die = ft_atoi(av[2]); + conditions->t_eat = ft_atoi(av[3]); + conditions->t_slp = ft_atoi(av[4]); + if (ac == 6) + conditions->n_eat = ft_atoi(av[5]); + } + else + return (NULL); + return (conditions); +} + +t_philo *init(int ac, char **av, pthread_t **id) { t_philo *philo; t_conditions *conditions; - int n; - n = ft_atoi(av[1]); - conditions = malloc(sizeof(t_conditions)); - conditions->n_phi = n; - *id = malloc(sizeof(int) * n); - philo = init_chain_philo(conditions, n); + conditions = init_conditions(ac, av); + if (conditions == NULL) + return (NULL); + *id = malloc(sizeof(int) * conditions->n_phi); + if (*id == NULL) + return (NULL); + philo = init_chain_philo(conditions, conditions->n_phi); + if (philo == NULL) + return (NULL); return (philo); } diff --git a/srcs/main.c b/srcs/main.c index a57525e..10e3d78 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -1,22 +1,16 @@ #include "philo.h" -pthread_mutex_t mutex; - -void *philo_exec(void *arg) +void create_threads(t_philo *philo, pthread_t *id, int n) { - t_philo *philo; - int nbr; + int i; - philo = (t_philo*)arg; - nbr = philo->philo_nbr; - - pthread_mutex_lock(&mutex); - write(1, "-", 1); - ft_putnbr_fd(nbr, 1); - write(1, "\n", 1); - pthread_mutex_unlock(&mutex); - - return (NULL); + i = 0; + while (i < n) + { + pthread_create(&id[i], NULL, &philo_exec, philo); + philo = philo->next; + i++; + } } int main(int ac, char **av) @@ -26,24 +20,18 @@ int main(int ac, char **av) int i; int n; - if (ac == 1) - return (0); - philo = init(av, &id); - i = 0; + philo = init(ac, av, &id); + if (philo == NULL) + return (0); n = philo->conditions->n_phi; pthread_mutex_init(&mutex, NULL); - while (i < n) - { - pthread_create(&id[i], NULL, &philo_exec, philo); - philo = philo->next; - i++; - } + create_threads(philo, id, n); i = 0; while (i < n) { pthread_join(id[i], NULL); i++; } - write(1, "main function\n", 14); - return 0; +write(1, "main function\n", 14); + return (0); }