From 9efab2c318914604dcf4be4dae464a8a3af687e2 Mon Sep 17 00:00:00 2001 From: whaffman Date: Thu, 2 Jan 2025 16:24:44 +0100 Subject: [PATCH] intitialisestructs and util functions for mutexes --- philo/Makefile | 4 ++-- philo/inc/philo.h | 30 +++++++++++++++++++++++++----- philo/philo | Bin 0 -> 16184 bytes philo/src/create_mutexes.c | 18 ++++++++++++++++++ philo/src/create_philos.c | 21 +++++++++++++++++++++ philo/src/destroy_mutexes.c | 15 +++++++++++++++ philo/src/free_philos.c | 5 +++++ philo/src/get_time.c | 7 +++++++ philo/src/main.c | 10 +++++++++- philo/src/parse_arguments.c | 16 ++++++++++++++++ philo/src/print_status.c | 6 ++++++ philo/src/utils/ph_atoi.c | 25 +++++++++++++++++++++++++ 12 files changed, 149 insertions(+), 8 deletions(-) create mode 100755 philo/philo create mode 100644 philo/src/create_mutexes.c create mode 100644 philo/src/create_philos.c create mode 100644 philo/src/destroy_mutexes.c create mode 100644 philo/src/free_philos.c create mode 100644 philo/src/get_time.c create mode 100644 philo/src/parse_arguments.c create mode 100644 philo/src/print_status.c create mode 100644 philo/src/utils/ph_atoi.c diff --git a/philo/Makefile b/philo/Makefile index ed7e1db..e772ede 100644 --- a/philo/Makefile +++ b/philo/Makefile @@ -10,14 +10,14 @@ # # # **************************************************************************** # -NAME = fdf +NAME = philo SRC_PATH = src INC_PATH = inc OBJ_PATH = obj -VPATH = src +VPATH = src:src/utils SOURCES = $(shell basename -a $(shell find $(SRC_PATH) -type f -name "*.c")) OBJECTS = $(addprefix $(OBJ_PATH)/, $(SOURCES:.c=.o)) diff --git a/philo/inc/philo.h b/philo/inc/philo.h index 3d722c7..8668f6c 100644 --- a/philo/inc/philo.h +++ b/philo/inc/philo.h @@ -4,31 +4,51 @@ # include # include # include +# include +# include +# include + + +# define SUCCESS 1 +# define FAILURE 0 + +# 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" +# define ERROR_MALLOC "Malloc Failure" typedef struct s_rules { - int time_to_die; - int time_to_eat; - int time_to_sleep; - int nb_must_eat; + int n_philos; + int time_to_die; + int time_to_eat; + int time_to_sleep; + int n_must_eat; pthread_mutex_t *print; pthread_mutex_t *death; + pthread_mutex_t *forks; + t_philo *philos; } t_rules; typedef struct s_philo { + int id; pthread_t *pid; pthread_mutex_t *l_fork; pthread_mutex_t *r_fork; + int death; int last_meal; - t_rules rules; + t_rules *rules; } t_philo; + // memset, printf, malloc, free, write, // usleep, gettimeofday, pthread_create, // pthread_detach, pthread_join, pthread_mutex_init, // pthread_mutex_destroy, pthread_mutex_lock, // pthread_mutex_unlock +int ph_atoi(const char *nptr, int *res); + #endif \ No newline at end of file diff --git a/philo/philo b/philo/philo new file mode 100755 index 0000000000000000000000000000000000000000..7c22300902c6d3eccd718301b3473c49f9f710d0 GIT binary patch literal 16184 zcmeHO4Qw1o6`phA#A%)Qk|wR2K(dqu8iLPG;)b*+^z!3mjgrOjNMks<|yA0cfai?#l1gQ-w`!9Iux6@t^+l?67jS6G0&sKuc-bY}^UCSD8 z4bsi~xV^dhp@;J?$mvz>S+{?4XL~l?mUVNbLv4q)Y;N1!nJDHH8+F4Jmw|)E)b5-6 z6x>vZ$7xgzBR(zuNVc5ir2qWU?>+v&Q#~tAef`aIClW6|^!((z9wQx!n`}sj3i*>E zLNwJE;vgMAAD>3e=MkQBo*N>Zt6T-avO2;Pct#yQwNp=@+OEgH2YdrZxSRmP2s1&i z!*NX=z8WrhMP*q<&raQGr80L~1Gbw51O1XBZo#vLY&Qo^>X2;>xH&uP-t8z7Q!i~+ zyZ3Z&-(hV`bk=Gc6W7=3n>v-%-MiOHI|XOZEqYF&ckhmDKIin>{aFWI2Z!=GZpZRf z>nc)@#L!FgaVDf=3$91T-*VSoOn2sX=9N~ui>O!kF#X-nd=9B>P`7dpPzF<1Qr|~G|Y3378 z?gf&a4e)84MY)O5M|)MlYu|Ctp0~N`f8Io*7&P-rOf*(UPJY) zIr`J4GdiH^^$&qvUHdT3Eo+jB^fM&6_+qtM9XP3JnqXdhzD8Hqeg)bCEo*ivtzTVx zM~MFDEPBHqy36P8Fv~BRqrac(>FwH3+3<{ceCyBQwz^^yRR1!NXjyZwjtBhPz%h?E z?jyKi+FOCpucSIcUsRoFSu;Y4XBeTsPU~NP4Z*rgW_ijy{l}Zk)6?_J*pueDOWtxg zxRCH2G*u`3xW%5XZ)7WpRcU>nIlA>HR5i;Nyk>K3>yscR7vaJu(>OiZ_(RaK1F)^N zPxcq@f{-eGutTzq@{u>pa%sve_f3u-d85&b=Xrl@z>;ktZ&jB>zXo0E9elRb?X8S;LHZmnymF~pg`+Fc>%DlJqFg-kX0@svzS5|}M#iSo=KAH@jn_E& zFyu3BA>jzt@K)p8?6u;2nYRq*#a=Vci@XImUyeX2LUwqd7N~FBesnREZn$R-C3I`t zEFYPseto6U9POHpAtBQ(-&ZX^svzD1h5#<%CCbuMXa()GQ++I6K6`qiA$B%aDW4__ zWIl$0!IqQa}c*dXQ`+J<3_g1`6n$ZGfTHo8XyID6JouUjx8Hh3vWgyBx zlz}J%Q3j$6L>c%$%|ML5F7_4eLFYyz(LS7Uvw0&|8tQinR(`yL+FC9g4?R zH7{(U_h;hMnu25S{T@=-xln(qyB5_>9C7eFh`%JhYf0;eTQ0w=X++($@`m?qx>kRt zB>UTOv_elCk}eAIJsf0j0Hsh{58{X+_C*w1*OK`C4LcSuz^6ilq+|Ie*e^q#1=i#Z zDH3b>vtVz=HS14+V()3OmcI)5e#qAb?QfrvH>2HKA^&1f-f+@aAYN3W3`7}-G7x1T z%0QHXC<9Rjq6|bC_@B&xtOu0!fBd?m*Bny7%@Q@goZxerE-zf+S{=<5feK zm5j39P}X0I{I8d)c~TkY#eK3?@C&@CPu2*YXZdC9?=i;98Cw}wFbc?;!Es(MC~Fk; zI~kPdJ&TI0Ii&ThRC>5!;h*HdB<_mV^4~M5D($akzUck4>R%u7s#*B*sIRw&{o%8l zrX}xqZPRp;<$q^du7lnG$3WJBhaGlse|Y?j1XBG_LFGFXgxubVsuyNe+!|OwAOD`az6@x2@+Uu{r7tC4N(f<1DcPgPcpznb@v>8ZUsNCuCDc$SXrds zuvE$OO!&?menvDuu9BQj{T~R7j-w}i_flqOU z^7)Yel%xZee z8?sWgo}L!*r}NfeHs5b&t+baf6fL`SNTu>a!&%33(ut1x8nmY0wd_K{K5RKTuW(om z6m0zcm@W+s9fnDOvY_eBQl+f{h-Wxs*opxq5MUD}smIceLomA+`WoxSa$rr9Z11QpWvHzKjDt-Tc44qIgv?S8^%slmi#JtZH-uz`wn^08`!IX!MJ-5uIn*Oc zC5nfKJi8z06@1J{&COxY#jr}`@}83z%#{+uh5WEn@D2x9{UsM0aNIPrwr%fjqXDPY zGj=hf66wP^G~uIH@FkzbKhzx347fI&^;ANKnLsr$mA@n;Md8u!anN4o1A>Mq zGKTFx2L9hL*OK^UJ}M~f%X~B(zYTkui;BI>R|PAOQK1+q&tfn0Mi)Gq!ic@he+3_d zELg}#uzUgp%_YTN=8uB%*p>K2Pw*)0X>KaC%ufZA+*mk%W~<|Z(!SWRxYo?0 zA^RRy5ET8n?8ig)2iZW-5JN`sC-{Sq{Rj&LZ{zu~xDh*{e;l%x`H-Nz_lbV^{&|A! zrT>+|nv5e%3P}G6{WDZ3|6)I4_!7ZhpRAq3?f(Xnp#6EnR~39e2?HhEKFwE`;E*)Q zd|dWAVjKv0kkq`V*mgE literal 0 HcmV?d00001 diff --git a/philo/src/create_mutexes.c b/philo/src/create_mutexes.c new file mode 100644 index 0000000..903aee9 --- /dev/null +++ b/philo/src/create_mutexes.c @@ -0,0 +1,18 @@ +int create_mutexes(t_rules *rules) +{ + int i; + + i = 0; + if (!pthread_mutex_init(&rules->death, NULL)) + return(FAILURE); + if (!pthread_mutex_init(&rules->print, NULL)) + return(FAILURE); + rules->forks = malloc(rules->n_philos * sizeof(pthread_mutex_t)); + if (!rules->forks) + return(FAILURE); + while (i < rules->n_philos) + { + if (!pthread_mutex_init(&rules->forks[i], NULL)) + return(FAILURE); + } +} \ No newline at end of file diff --git a/philo/src/create_philos.c b/philo/src/create_philos.c new file mode 100644 index 0000000..5cace20 --- /dev/null +++ b/philo/src/create_philos.c @@ -0,0 +1,21 @@ +int create_philos(t_rules *rules) +{ + int i; + t_philo *philo; + + i = 0; + rules->philos = malloc(rules->n_philos * sizeof(t_philo)); + if (!rules->philos) + return(FAILURE); + while (i < rules->n_philos) + { + philo = &rules->philos[i]; + philo->id = i + 1; + philo->l_fork = &rules->forks[i]; + philo->r_fork = &rules->forks[i + 1 % rules->n_philos]; + philo->death = 0; + philo->pid = 0; + philo->rules = rules; + i++; + } +} \ No newline at end of file diff --git a/philo/src/destroy_mutexes.c b/philo/src/destroy_mutexes.c new file mode 100644 index 0000000..0189274 --- /dev/null +++ b/philo/src/destroy_mutexes.c @@ -0,0 +1,15 @@ +int destroy_mutexes(t_rules *rules) +{ + int i; + + i = 0; + if (!pthread_mutex_destroy(&rules->death)) + return(FAILURE); + if (!pthread_mutex_destroy(&rules->print)) + return(FAILURE); + while (i < rules->n_philos) + { + if (!pthread_mutex_destroy(&rules->forks[i])) + return(FAILURE); + } +} \ No newline at end of file diff --git a/philo/src/free_philos.c b/philo/src/free_philos.c new file mode 100644 index 0000000..e348d9e --- /dev/null +++ b/philo/src/free_philos.c @@ -0,0 +1,5 @@ +int free_philos(t_rules *rules) +{ + free(rules->philos); + free(rules->forks); +} \ No newline at end of file diff --git a/philo/src/get_time.c b/philo/src/get_time.c new file mode 100644 index 0000000..1360063 --- /dev/null +++ b/philo/src/get_time.c @@ -0,0 +1,7 @@ +int get_time(void) +{ + struct timeval time; + + gettimeofday(&time, NULL); + return (time.tv_sec * 1000 + time.tv_usec / 1000); +} \ No newline at end of file diff --git a/philo/src/main.c b/philo/src/main.c index f03b93a..5082711 100644 --- a/philo/src/main.c +++ b/philo/src/main.c @@ -2,6 +2,14 @@ int main(int argc, char *argv[]) { - + t_rules rules; + + if (FAILURE == parse_arguments(argc, argv, &rules)) + return (printf(ERROR_USAGE), EXIT_FAILURE); + if (FAILURE == create_philos(&rules)) + return (printf(ERROR_MALLOC)); + if (FAILURE == create_mutexes(&rules)) + return (printf(ERROR_MUTEX)); + return(EXIT_SUCCESS); } diff --git a/philo/src/parse_arguments.c b/philo/src/parse_arguments.c new file mode 100644 index 0000000..d2f74d9 --- /dev/null +++ b/philo/src/parse_arguments.c @@ -0,0 +1,16 @@ +int parse_arguments(int argc,char *argv[], t_rules *rules) +{ + if (argc != 5 && argc != 6) + return (FAILURE); + if (!ph_atoi(argv[1], &rules->n_philos)) + return (FAILURE); + if (!ph_atoi(argv[2], &rules->time_to_die)) + return (FAILURE); + if (!ph_atoi(argv[3], &rules->time_to_eat)) + return (FAILURE); + if (!ph_atoi(argv[4], &rules->time_to_sleep)) + return (FAILURE); + if (argc == 6 && !ph_atoi(argv[5], &rules->n_must_eat)) + return (FAILURE); + return (SUCCESS); +} \ No newline at end of file diff --git a/philo/src/print_status.c b/philo/src/print_status.c new file mode 100644 index 0000000..49feafa --- /dev/null +++ b/philo/src/print_status.c @@ -0,0 +1,6 @@ +int print_status(t_philo *philo, char *status) +{ + pthread_mutex_lock(philo->rules->print); + printf("%d %d %s\n", get_time(), philo->id, status); + pthread_mutex_unlock(philo->rules->print); +} \ No newline at end of file diff --git a/philo/src/utils/ph_atoi.c b/philo/src/utils/ph_atoi.c new file mode 100644 index 0000000..e47396c --- /dev/null +++ b/philo/src/utils/ph_atoi.c @@ -0,0 +1,25 @@ +#include "philo.h" + +static int ph_isspace(int c) +{ + return (' ' == c || '\f' == c || \ + '\n' == c || '\r' == c || \ + '\t' == c || '\v' == c); +} + +static int ph_isdigit(int c) +{ + return ('0' <= c && '9' >= c); +} + +int ph_atoi(const char *nptr, int *res) +{ + while (ph_isspace(*nptr)) + nptr++; + *res = 0; + while (ph_isdigit(*nptr)) + *res = 10 * *res + (*nptr++ - '0'); + if (*nptr != '\0') + return (FAILURE); + return (SUCCESS); +}