init.c
1 /* ************************************************************************** */ 2 /* */ 3 /* ::: :::::::: */ 4 /* init.c :+: :+: :+: */ 5 /* +:+ +:+ +:+ */ 6 /* By: gychoi <gychoi@student.42seoul.kr> +#+ +:+ +#+ */ 7 /* +#+#+#+#+#+ +#+ */ 8 /* Created: 2023/04/18 19:11:22 by gychoi #+# #+# */ 9 /* Updated: 2023/04/25 18:45:19 by gychoi ### ########.fr */ 10 /* */ 11 /* ************************************************************************** */ 12 13 #include "philo.h" 14 15 void init_struct_args(t_args *args, char **argv) 16 { 17 args->philo_num = atoi_only_unsigned(argv[1]); 18 args->philo_time_die = atoi_only_unsigned(argv[2]); 19 args->philo_time_eat = atoi_only_unsigned(argv[3]); 20 args->philo_time_sleep = atoi_only_unsigned(argv[4]); 21 if (argv[5] != 0) 22 args->philo_must_eat = atoi_only_unsigned(argv[5]); 23 else 24 args->philo_must_eat = -1; 25 } 26 27 void init_struct_share(t_share *share, t_args args) 28 { 29 share->args = args; 30 share->fork_locks = share->fork_locks; 31 share->share_lock = share->share_lock; 32 share->stop = FALSE; 33 share->philo_start_time = 0; 34 } 35 36 void init_struct_philo(t_philo **philos, t_share *share, t_args args) 37 { 38 int i; 39 40 i = -1; 41 while (++i < args.philo_num) 42 { 43 (*philos)[i].share = share; 44 (*philos)[i].forks[0] = &(share->forks[i]); 45 (*philos)[i].fork_lock[0] = &(share->fork_locks[i]); 46 if (args.philo_num == 1) 47 { 48 (*philos)[i].forks[1] = &(share->forks[i]); 49 (*philos)[i].fork_lock[1] = &(share->fork_locks[i]); 50 } 51 else 52 { 53 (*philos)[i].forks[1] = &(share->forks[(i + 1) % args.philo_num]); 54 (*philos)[i].fork_lock[1] = \ 55 &(share->fork_locks[(i + 1) % args.philo_num]); 56 } 57 (*philos)[i].philo_thread = 0; 58 (*philos)[i].philo_id = i + 1; 59 (*philos)[i].philo_count_eat = args.philo_must_eat; 60 (*philos)[i].philo_time_last_eat = 0; 61 (*philos)[i].error = FALSE; 62 } 63 } 64 65 int init_all_mutex(t_share *share, int philo_num) 66 { 67 int i; 68 69 i = 0; 70 while (i < philo_num) 71 { 72 if (pthread_mutex_init(&(share->fork_locks)[i], 0) != 0) 73 return (clear_mutex_array(share->fork_locks, i)); 74 i++; 75 } 76 if (pthread_mutex_init(&(share->share_lock), 0) != 0) 77 return (clear_all_mutex(share)); 78 return (TRUE); 79 } 80 81 int init_all_malloc(t_share *share, t_philo **philos, int philo_num) 82 { 83 *philos = 0; 84 share->forks = 0; 85 share->fork_locks = 0; 86 *philos = malloc(sizeof(t_philo) * philo_num); 87 share->forks = malloc(sizeof(int) * philo_num); 88 share->fork_locks = malloc(sizeof(pthread_mutex_t) * philo_num); 89 if (*philos == 0 || share->forks == 0 || share->fork_locks == 0) 90 return (FALSE); 91 if (!memset(*philos, 0, sizeof(t_philo) * philo_num) \ 92 || !memset(share->forks, 0, sizeof(int) * philo_num) \ 93 || !memset(share->fork_locks, 0, sizeof(pthread_mutex_t) * philo_num)) 94 return (FALSE); 95 return (TRUE); 96 }