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  }