/* By: ljiriste <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/03/22 11:19:48 by ljiriste #+# #+# */
-/* Updated: 2024/03/28 10:00:52 by ljiriste ### ########.fr */
+/* Updated: 2024/03/28 15:13:20 by ljiriste ### ########.fr */
/* */
/* ************************************************************************** */
#include <stddef.h>
#include <pthread.h>
+int seat_philosophers(t_diner *diner, pthread_t *threads)
+{
+ size_t i;
+
+ gettimeofday(&diner->setting.start, NULL);
+ i = 0;
+ while (i < diner->setting.philo_count)
+ {
+ if (pthread_create(threads + i, NULL, be_a_philosopher, diner->philos + i))
+ {
+ mutex_lock(&diner->setting.end_lock);
+ diner->setting.end = 1;
+ mutex_unlock(&diner->setting.end_lock);
+ while (i > 0)
+ {
+ pthread_join(threads[--i], NULL);
+ }
+ return (1);
+ }
+ ++i;
+ }
+ return (0);
+}
+
int main(int argc, char **argv)
{
t_diner diner;
cleanup(&diner, threads);
return (2);
}
- seat_philosophers(&diner, threads);
- wait_till_death_possible(diner.setting.time_to_die, diner.setting.start);
+ if (seat_philosophers(&diner, threads))
+ {
+ cleanup(&diner, threads);
+ return (3);
+ }
report_end(watch_philosophers(&diner));
cleanup(&diner, threads);
return (0);
/* By: ljiriste <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/03/28 10:35:16 by ljiriste #+# #+# */
-/* Updated: 2024/03/28 10:49:35 by ljiriste ### ########.fr */
+/* Updated: 2024/03/28 15:12:37 by ljiriste ### ########.fr */
/* */
/* ************************************************************************** */
mutex->is_init = 0;
}
+int mutex_lock(t_mutex *mutex)
+{
+ if (!mutex->is_init)
+ return (1);
+ return (pthread_mutex_lock(&mutex->mutex));
+}
+
+int mutex_unlock(t_mutex *mutex)
+{
+ if (!mutex->is_init)
+ return (1);
+ return (pthread_mutex_unlock(&mutex->mutex));
+}
+
int all_mutexes_initialized(t_diner *diner)
{
int res;
/* By: ljiriste <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/03/22 11:10:17 by ljiriste #+# #+# */
-/* Updated: 2024/03/28 11:27:15 by ljiriste ### ########.fr */
+/* Updated: 2024/03/28 15:14:17 by ljiriste ### ########.fr */
/* */
/* ************************************************************************** */
int init_mutex(t_mutex *mutex, pthread_mutexattr_t *attr);
void destroy_mutex(t_mutex *mutex);
+int mutex_lock(t_mutex *mutex);
+int mutex_unlock(t_mutex *mutex);
int all_mutexes_initialized(t_diner *diner);
+void *be_a_philosopher(void *philo);
+
int seat_philosophers(t_diner *diner, pthread_t *threads);
-void wait_till_death_possible(useconds_t time_to_die,
- struct timeval start);
void report_end(int end);
int watch_philosophers(t_diner *diner);