maybe working

This commit is contained in:
Matthos Denys 2021-05-18 13:09:13 +03:00
parent e1583f9a17
commit 060d1d8fef
26 changed files with 15 additions and 662 deletions

View File

@ -70,7 +70,7 @@ int run_observer(t_all *all)
while(1)
{
i = 0;
while(i <= all->number_of_philosophers)
while(i < all->number_of_philosophers)
{
if (all->smert != 42)
{

View File

@ -5,7 +5,7 @@ int check_all_run(t_all *all)
int i;
i = 0;
while (i <= all->number_of_philosophers)
while (i < all->number_of_philosophers)
{
if (all->data_philo->philors[i].worked)
{
@ -22,7 +22,7 @@ void run_simulation(t_all *all)
int i;
i = 0;
while (i <= all->number_of_philosophers)
while (i < all->number_of_philosophers)
{
if (!all->data_philo->philors[i].can_run_simulation)
{
@ -38,17 +38,17 @@ void get_fork_for_philo(t_all *all)
i = 0;
while(i <= all->number_of_philosophers)
while(i < all->number_of_philosophers)
{
if (i == 0)
{
all->data_philo->philors[i].more_fork = all->number_of_philosophers;
all->data_philo->philors[i].less_fork = 0;
all->data_philo->philors[i].more_fork = all->number_of_philosophers - 1;
}
else
{
all->data_philo->philors[i].more_fork = i + 1;
all->data_philo->philors[i].less_fork = i;
all->data_philo->philors[i].less_fork = i - 1;
all->data_philo->philors[i].more_fork = i;
}
all->data_philo->philors[i].died = 0;
all->data_philo->philors[i].nbr_philo = i;
@ -67,7 +67,7 @@ int prepare_resources(t_all *all)
i = 0;
all->data_philo = ft_calloc(sizeof(t_philo_data), 1);
all->data_philo->mutex = (pthread_mutex_t *)ft_calloc(all->number_of_philosophers + 1, sizeof(pthread_mutex_t));
while (i <= all->number_of_philosophers)
while (i < all->number_of_philosophers)
{
pthread_mutex_init(&all->data_philo->mutex[i], NULL);
i++;
@ -82,7 +82,7 @@ void run_all_phils(t_all *all)
int i;
i = 0;
void *philo;
while(i <= all->number_of_philosophers)
while(i < all->number_of_philosophers)
{
philo = (void*)(&all->data_philo->philors[i]);
if (pthread_create(&all->data_philo->philors[i].thread, NULL, (void*)run_trhead, philo) == -1)

View File

@ -38,7 +38,7 @@ void ft_exit(t_all *all)
i = 0;
all->smert = 42;
ft_msleep(200);
while (i <= all->number_of_philosophers)
while (i < all->number_of_philosophers)
{
pthread_mutex_destroy(&all->data_philo->philors[i].eat_mutex);
pthread_mutex_destroy(&all->data_philo->mutex[i]);

View File

@ -1,47 +0,0 @@
.PHONY: all clean fclean re
SRCS = main.c utilc.c parser.c logic.c messages.c\
prepare_simulation.c old_utilc.c time.c ft_itoa.c\
ft_strjoin.c
SRC_DIR = ./srcs/
OBJ_DIR = ./obj/
OBJS = $(SRCS:%.c=%.o)
OBJS_FILES = $(addprefix $(OBJ_DIR), $(OBJS))
HEADER = philo_header.h
vpath %.h includes
vpath %.o $(OBJ_DIR)
vpath %.c $(SRC_DIR)
CC = gcc
RM = rm -f
CFLAGS = -g -Wall -Wextra -Werror -I ./includes/
NAME = philo_two
all: $(OBJ_DIR) $(NAME)
norme :
norminette $(addprefix $(SRC_DIR), $(SRCS))
$(OBJ_DIR):
mkdir -p obj
$(NAME): $(OBJS_FILES)
$(CC) $(CFLAGS) -o $(NAME) $(OBJS_FILES) -lpthread
clean:
$(RM) $(OBJS_FILES)
$(OBJ_DIR)%.o: %.c $(HEADER)
$(CC) $(CFLAGS) -c $< -o $@
fclean: clean
$(RM) $(NAME)
re: fclean $(NAME)

View File

@ -1,83 +0,0 @@
#ifndef PHILO_HEADER_H
# define PHILO_HEADER_H
# define _SLEEP_STEP 50
# include <stdlib.h>
# include <unistd.h>
# include <pthread.h>
# include <sys/time.h>
# include <semaphore.h>
# include <stdio.h>
# include <string.h>
# define _SEM_NAME_FORKS "pSemForks"
# define _SEM_WRITE_LOCK "write"
typedef struct s_philo_data t_philo_data;
typedef struct s_all
{
int number_of_philosophers;
time_t time_to_die;
time_t time_to_eat;
time_t time_to_sleep;
int number_of_times_each_philosopher_must_eat;
time_t start_time;
t_philo_data *data_philo;
sem_t *write;
int smert;
int opt;
} t_all;
typedef struct s_philo
{
unsigned worked:1;
unsigned can_run_simulation:1;
pthread_t thread;
int count_eat;
time_t time_to_die;
int died;
int nbr_philo;
time_t last_eat;
time_t limit;
t_all *all_struct;
int is_eat;
sem_t *eat_sem;
char *name;
} t_philo;
typedef struct s_philo_data
{
sem_t *sems;
t_philo *philors;
} t_philo_data;
void *ft_calloc(size_t num, size_t size);
t_all *structalloc_and_bzero(void);
int parse_and_check_values(char **argv, int quantity);
int ft_atoi(const char *str);
int check_f(char ch);
int runner(t_all *all);
int return_big(int a, int b);
int return_less(int a, int b);
time_t ft_get_time(void);
void *run_trhead(t_philo *philo);
int prepare_resources(t_all *all);
int check_all_run(t_all *all);
void run_simulation(t_all *all);
void run_all_phils(t_all *all);
void messages(t_all *all, t_philo *philo, char *str);
void cycle(t_philo *philo);
void ft_msleep(time_t interval_ms);
void my_usleep(long time);
void ft_exit(t_all *all);
char *ft_itoa(int n);
char *ft_strjoin(char const *s1, char const *s2);
sem_t *reopen_sem(const char *name, int value);
char *sem_set_name(char *str, int i);
size_t ft_strlcpy(char *dst, const char *src, size_t size);
size_t ft_strlcat(char *dst, const char *src, size_t size);
int ft_strlen(char *str);
void get_data_for_philo(t_all *all);
#endif

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,43 +0,0 @@
#include "../includes/philo_header.h"
static int nbleng(unsigned int n)
{
unsigned int i;
i = 0;
while (n >= 10)
{
n /= 10;
i++;
}
return (i + 1);
}
char *ft_itoa(int n)
{
char *dst;
unsigned int leng;
unsigned int nbr;
unsigned int i;
nbr = (n < 0 ? -n : n);
leng = nbleng(nbr);
i = 0;
if (!(dst = (char *)malloc(sizeof(char) * leng + 1 + (n < 0 ? 1 : 0))))
return (NULL);
if (n < 0)
{
dst[i] = '-';
leng++;
}
i = leng - 1;
while (nbr >= 10)
{
dst[i] = nbr % 10 + '0';
nbr /= 10;
i--;
}
dst[i] = nbr % 10 + '0';
dst[leng] = '\0';
return (dst);
}

View File

@ -1,22 +0,0 @@
#include "../includes/philo_header.h"
char *ft_strjoin(char const *s1, char const *s2)
{
int len1;
int len2;
char *new;
if (s1 && s2)
{
len1 = ft_strlen((char*)s1);
len2 = ft_strlen((char*)s2);
new = malloc(sizeof(char *) * len1 + len2 + 1);
if (new)
{
ft_strlcpy(new, s1, len1 + 1);
ft_strlcat(new, s2, len1 + len2 + 1);
return (void *)(new);
}
}
return (0);
}

View File

@ -1,114 +0,0 @@
#include "../includes/philo_header.h"
void *run_trhead(t_philo *philo)
{
philo->worked = 1;
while(1)
{
if (philo->can_run_simulation)
break;
}
if (philo->can_run_simulation)
{
while( philo->all_struct->smert != 42)
{
if (philo->all_struct->opt)
{
if (philo->count_eat == philo->all_struct->number_of_times_each_philosopher_must_eat)
philo->all_struct->smert = 42;
}
cycle(philo);
}
}
return(NULL);
}
void take_forks(t_philo *philo)
{
t_all *all;
all = philo->all_struct;
messages(philo->all_struct, philo, "thinking");
sem_wait(all->data_philo->sems);
messages(philo->all_struct, philo, "has taken a fork");
sem_wait(all->data_philo->sems);
messages(philo->all_struct, philo, "has taken a fork");
}
void eating(t_philo *philo)
{
t_all *all;
all = philo->all_struct;
sem_wait(philo->eat_sem);
messages(philo->all_struct, philo, "eating");
philo->last_eat = ft_get_time() - philo->all_struct->start_time;
ft_msleep(philo->all_struct->time_to_eat);
philo->count_eat++;
sem_post(philo->eat_sem);
}
void sleeping(t_philo *philo)
{
t_all *all;
all = philo->all_struct;
messages(philo->all_struct, philo, "sleeping");
sem_post(all->data_philo->sems);
sem_post(all->data_philo->sems);
ft_msleep(philo->all_struct->time_to_sleep);
}
void cycle(t_philo *philo)
{
take_forks(philo);
eating(philo);
sleeping(philo);
}
int run_observer(t_all *all)
{
int i;
i = 0;
time_t time_eat;
while(1)
{
i = 0;
while(i <= all->number_of_philosophers)
{
sem_wait(all->data_philo->philors[i].eat_sem);
if (all->smert != 42)
{
time_eat = (ft_get_time() - all->start_time) - all->data_philo->philors[i].last_eat;
if (time_eat > all->time_to_die)
{
printf("%ld %d died\n", ft_get_time() - all->start_time, i + 1);
return(2);
}
}
else
return(2);
sem_post(all->data_philo->philors[i].eat_sem);
i++;
}
}
return (0);
}
int runner(t_all *all)
{
prepare_resources(all);
run_all_phils(all);
if (check_all_run(all))
{
all->start_time = ft_get_time();
run_simulation(all);
}
if (!run_observer(all))
return(0);
return(1);
}

View File

@ -1,12 +0,0 @@
#include "../includes/philo_header.h"
int main(int argc, char **argv)
{
if (parse_and_check_values(argv, argc) == 2)
return(0);
else
{
return (1);
}
return(0);
}

View File

@ -1,13 +0,0 @@
#include "../includes/philo_header.h"
void messages(t_all *all, t_philo *philo, char *str)
{
time_t timestemp = ft_get_time() - all->start_time;
if (philo->all_struct->smert != 42)
{
sem_wait(all->write);
printf("%ld %*s%d %s\n", timestemp, philo->nbr_philo * 30, "", philo->nbr_philo, str);
sem_post(all->write);
}
}

View File

@ -1,57 +0,0 @@
#include "../includes/philo_header.h"
int check_f(char ch)
{
if (ch == '\t' || ch == '\n' || ch == ' ' || \
ch == '\v' || ch == '\f' || ch == '\r')
return (1);
else
return (0);
}
int ft_atoi(const char *str)
{
int i;
unsigned long int result;
int operator;
i = 0;
operator = 1;
result = 0;
while (check_f(str[i]))
i++;
if (str[i] == '-' || str[i] == '+')
{
if (str[i] == '-')
operator *= -1;
i++;
}
while (str[i] >= '0' && str[i] <= '9')
{
if (result > 922337203685477580 && operator == -1)
return (0);
else if (result > 922337203685477580 && operator == 1)
return (-1);
result = result * 10 + str[i] - '0';
i++;
}
return (result * operator);
}
void *ft_calloc(size_t num, size_t size)
{
void *addr;
unsigned int nbytes;
nbytes = num * size;
addr = malloc(nbytes);
if (!size || !num || (size == 0 && num == 0))
return ((void *)addr);
if (!addr)
return (NULL);
else
{
memset(addr, '\0', nbytes);
}
return ((void *)addr);
}

View File

@ -1,87 +0,0 @@
#include "../includes/philo_header.h"
int check_param(t_all *all, int optional)
{
if (optional)
{
if (all->number_of_philosophers <= 0)
return(1);
if (all->time_to_die <= 0)
return(1);
if (all->time_to_eat <= 0)
return(1);
if (all->time_to_sleep <= 0)
return(1);
if (all->number_of_times_each_philosopher_must_eat <= 0)
return(1);
}
else
{
if (all->number_of_philosophers <= 0)
return(1);
if (all->time_to_die <= 0)
return(1);
if (all->time_to_eat <= 0)
return(1);
if (all->time_to_sleep <= 0)
return(1);
}
return (0);
}
int parse_param(t_all *all, int optional, char **argv)
{
all->smert = 0;
if (optional)
{
all->number_of_philosophers = ft_atoi(argv[1]);
all->time_to_die = ft_atoi(argv[2]);
all->time_to_eat = ft_atoi(argv[3]);
all->time_to_sleep = ft_atoi(argv[4]);
all->number_of_times_each_philosopher_must_eat = ft_atoi(argv[5]);
all->opt = 1;
return (check_param(all, 1));
}
else
{
all->number_of_philosophers = ft_atoi(argv[1]);
all->time_to_die = ft_atoi(argv[2]);
all->time_to_eat = ft_atoi(argv[3]);
all->time_to_sleep = ft_atoi(argv[4]);
all->number_of_times_each_philosopher_must_eat = 0;
all->opt = 0;
return (check_param(all, 0));
}
}
int parse_and_check_values(char **argv, int quantity)
{
t_all *all;
int bool;
if (quantity == 5)
bool = 0;
if (quantity == 6)
bool = 1;
all = structalloc_and_bzero();
if (quantity == 5 || quantity == 6)
{
if (!parse_param(all, bool, argv))
{
if (runner(all) == 2)
return (2);
return(1);
}
else
{
printf("bad arg\n");
return (0);
}
}
else
{
printf("error please use argument 5 (optional) or 4 (standart)\n");
free(all);
return(0);
}
}

View File

@ -5,14 +5,14 @@ int check_all_run(t_all *all)
int i;
i = 0;
while (i <= all->number_of_philosophers)
while (i < all->number_of_philosophers)
{
if (all->data_philo->philors[i].worked)
{
i++;
}
}
printf("все запустились !\n");
// printf("все запустились !\n");
return (1);
}
@ -22,7 +22,7 @@ void run_simulation(t_all *all)
int i;
i = 0;
while (i <= all->number_of_philosophers)
while (i < all->number_of_philosophers)
{
if (!all->data_philo->philors[i].can_run_simulation)
{
@ -38,7 +38,7 @@ void get_data_for_philo(t_all *all)
i = 0;
while(i <= all->number_of_philosophers)
while(i < all->number_of_philosophers)
{
all->data_philo->philors[i].name = sem_set_name("philo", i);
all->data_philo->philors[i].eat_sem = reopen_sem(all->data_philo->philors[i].name, 1);
@ -74,7 +74,7 @@ void run_all_phils(t_all *all)
int i;
i = 0;
void *philo;
while(i <= all->number_of_philosophers)
while(i < all->number_of_philosophers)
{
philo = (void*)(&all->data_philo->philors[i]);
if (pthread_create(&all->data_philo->philors[i].thread, NULL, (void*)run_trhead, philo) == -1)

View File

@ -1,37 +0,0 @@
#include "../includes/philo_header.h"
time_t ft_get_time(void)
{
time_t return_value;
struct timeval current_time;
gettimeofday(&current_time, NULL);
return_value = (current_time.tv_sec * 1000) + (current_time.tv_usec / 1000);
return (return_value);
}
void ft_msleep(time_t interval_ms)
{
time_t end_ms = ft_get_time() + interval_ms;
time_t now_ms = ft_get_time();
while (now_ms < end_ms)
{
usleep(_SLEEP_STEP);
now_ms = ft_get_time();
}
}
long get_time(void)
{
struct timeval time;
gettimeofday(&time, NULL);
return ((long)(time.tv_sec * 1000 + time.tv_usec / 1000));
}
void my_usleep(long time)
{
long t;
t = get_time();
while (get_time() - t < time)
usleep(1);
}

View File

@ -1,132 +0,0 @@
#include "../includes/philo_header.h"
t_all *structalloc_and_bzero(void)
{
t_all *all;
all = ft_calloc(sizeof(t_all), 1);
all->number_of_philosophers = -1;
all->time_to_die = -1;
all->time_to_eat = -1;
all->time_to_sleep = -1;
all->number_of_times_each_philosopher_must_eat = -1;
return(all);
}
size_t ft_strlcpy(char *dst, const char *src, size_t size)
{
unsigned int i;
unsigned int count;
count = 0;
if (!dst && !src)
return (0);
while (src[count] != '\0')
{
++count;
}
i = 0;
if (size > 0)
{
while (src[i] != '\0' && i < (size - 1) && src[i])
{
dst[i] = src[i];
++i;
}
dst[i] = '\0';
}
return (count);
}
size_t ft_strlcat(char *dst, const char *src, size_t size)
{
unsigned int i;
unsigned int len;
len = 0;
if (!dst && !src)
return (0);
len = ft_strlen(dst);
i = 0;
if (size < len)
return (ft_strlen((char *)src) + size);
if (size)
{
while (src[i] && len + 1 < size)
dst[len++] = src[i++];
dst[len] = '\0';
}
while (src[i])
{
i++;
len++;
}
return (len);
}
int ft_strlen(char *str)
{
int i;
i = 0;
while (str[i])
i++;
return(i);
}
int return_big(int a, int b)
{
if (a > b)
{
return (a);
}
return (b);
}
int return_less(int a, int b)
{
if (a < b)
{
return (a);
}
return (b);
}
void ft_exit(t_all *all)
{
int i;
i = 0;
all->smert = 42;
ft_msleep(200);
while (i <= all->number_of_philosophers)
{
// pthread_mutex_destroy(&all->data_philo->philors[i].eat_mutex);
//pthread_mutex_destroy(&all->data_philo->mutex[i]); // TODO fix this
i++;
}
i = 0;
while (i < all->number_of_philosophers)
{
free(&all->data_philo->philors[i]);
i++;
}
}
char *sem_set_name(char *str, int i)
{
char *temp_nbr;
char *returnstr;
temp_nbr = ft_itoa(i);
returnstr = ft_strjoin(str, temp_nbr);
free(temp_nbr);
return(returnstr);
}
sem_t *reopen_sem(const char *name, int value)
{
sem_unlink(name);
return (sem_open(name, O_RDWR | O_CREAT, S_IRWXU, value));
}