From 774bdb0a4aa35bd4aeb68f07d2300f3551fed56e Mon Sep 17 00:00:00 2001 From: hugogogo Date: Mon, 31 Jan 2022 09:44:55 +0100 Subject: [PATCH] en fait droitier gaucher ne marchait pas, revenu a quinconce, toujours pbm lock order --- philo/race.log | 420 +++++++++++++++++++++++----------------------- philo/srcs/exec.c | 142 ++++------------ 2 files changed, 244 insertions(+), 318 deletions(-) diff --git a/philo/race.log b/philo/race.log index 1ea9a9d..86c59b8 100644 --- a/philo/race.log +++ b/philo/race.log @@ -1,213 +1,213 @@ -==29406== Helgrind, a thread error detector -==29406== Copyright (C) 2007-2017, and GNU GPL'd, by OpenWorks LLP et al. -==29406== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info -==29406== Command: ./philo 5 500 200 200 5 -==29406== -==29406== ---Thread-Announcement------------------------------------------ -==29406== -==29406== Thread #3 was created -==29406== at 0x518470E: clone (clone.S:71) -==29406== by 0x4E4BEC4: create_thread (createthread.c:100) -==29406== by 0x4E4BEC4: pthread_create@@GLIBC_2.2.5 (pthread_create.c:797) -==29406== by 0x4C38A27: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x400E19: launch (launch.c:85) -==29406== by 0x4007DD: main (main.c:24) -==29406== -==29406== ---------------------------------------------------------------- -==29406== -==29406== Thread #3: lock order "0x54542E8 before 0x54541F8" violated -==29406== -==29406== Observed (incorrect) order is: acquisition of lock at 0x54541F8 -==29406== at 0x4C3603C: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x4011BC: eat (exec.c:38) -==29406== by 0x401115: philo_exec (exec.c:121) -==29406== by 0x4C38C26: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x4E4B6DA: start_thread (pthread_create.c:463) -==29406== by 0x518471E: clone (clone.S:95) -==29406== -==29406== followed by a later acquisition of lock at 0x54542E8 -==29406== at 0x4C3603C: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x401226: eat (exec.c:43) -==29406== by 0x401115: philo_exec (exec.c:121) -==29406== by 0x4C38C26: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x4E4B6DA: start_thread (pthread_create.c:463) -==29406== by 0x518471E: clone (clone.S:95) -==29406== -==29406== Lock at 0x54542E8 was first observed -==29406== at 0x4C39F2A: pthread_mutex_init (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x400C75: lst_add_philo (init.c:25) -==29406== by 0x400B8D: init_chain_philo (init.c:49) -==29406== by 0x4008CD: init (init.c:126) -==29406== by 0x4007B5: main (main.c:21) -==29406== Address 0x54542e8 is 24 bytes inside a block of size 176 alloc'd -==29406== at 0x4C32F2F: malloc (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x400C21: lst_add_philo (init.c:19) -==29406== by 0x400B8D: init_chain_philo (init.c:49) -==29406== by 0x4008CD: init (init.c:126) -==29406== by 0x4007B5: main (main.c:21) -==29406== Block was alloc'd by thread #1 -==29406== -==29406== Lock at 0x54541F8 was first observed -==29406== at 0x4C39F2A: pthread_mutex_init (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x400C75: lst_add_philo (init.c:25) -==29406== by 0x400B8D: init_chain_philo (init.c:49) -==29406== by 0x4008CD: init (init.c:126) -==29406== by 0x4007B5: main (main.c:21) -==29406== Address 0x54541f8 is 24 bytes inside a block of size 176 alloc'd -==29406== at 0x4C32F2F: malloc (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x400C21: lst_add_philo (init.c:19) -==29406== by 0x400B8D: init_chain_philo (init.c:49) -==29406== by 0x4008CD: init (init.c:126) -==29406== by 0x4007B5: main (main.c:21) -==29406== Block was alloc'd by thread #1 -==29406== -==29406== -==29406== ---Thread-Announcement------------------------------------------ -==29406== -==29406== Thread #5 was created -==29406== at 0x518470E: clone (clone.S:71) -==29406== by 0x4E4BEC4: create_thread (createthread.c:100) -==29406== by 0x4E4BEC4: pthread_create@@GLIBC_2.2.5 (pthread_create.c:797) -==29406== by 0x4C38A27: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x400E19: launch (launch.c:85) -==29406== by 0x4007DD: main (main.c:24) -==29406== -==29406== ---------------------------------------------------------------- -==29406== -==29406== Thread #5: lock order "0x54544C8 before 0x54543D8" violated -==29406== -==29406== Observed (incorrect) order is: acquisition of lock at 0x54543D8 -==29406== at 0x4C3603C: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x4011BC: eat (exec.c:38) -==29406== by 0x401115: philo_exec (exec.c:121) -==29406== by 0x4C38C26: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x4E4B6DA: start_thread (pthread_create.c:463) -==29406== by 0x518471E: clone (clone.S:95) -==29406== -==29406== followed by a later acquisition of lock at 0x54544C8 -==29406== at 0x4C3603C: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x401226: eat (exec.c:43) -==29406== by 0x401115: philo_exec (exec.c:121) -==29406== by 0x4C38C26: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x4E4B6DA: start_thread (pthread_create.c:463) -==29406== by 0x518471E: clone (clone.S:95) -==29406== -==29406== Lock at 0x54544C8 was first observed -==29406== at 0x4C39F2A: pthread_mutex_init (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x400C75: lst_add_philo (init.c:25) -==29406== by 0x400B8D: init_chain_philo (init.c:49) -==29406== by 0x4008CD: init (init.c:126) -==29406== by 0x4007B5: main (main.c:21) -==29406== Address 0x54544c8 is 24 bytes inside a block of size 176 alloc'd -==29406== at 0x4C32F2F: malloc (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x400C21: lst_add_philo (init.c:19) -==29406== by 0x400B8D: init_chain_philo (init.c:49) -==29406== by 0x4008CD: init (init.c:126) -==29406== by 0x4007B5: main (main.c:21) -==29406== Block was alloc'd by thread #1 -==29406== -==29406== Lock at 0x54543D8 was first observed -==29406== at 0x4C39F2A: pthread_mutex_init (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x400C75: lst_add_philo (init.c:25) -==29406== by 0x400B8D: init_chain_philo (init.c:49) -==29406== by 0x4008CD: init (init.c:126) -==29406== by 0x4007B5: main (main.c:21) -==29406== Address 0x54543d8 is 24 bytes inside a block of size 176 alloc'd -==29406== at 0x4C32F2F: malloc (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x400C21: lst_add_philo (init.c:19) -==29406== by 0x400B8D: init_chain_philo (init.c:49) -==29406== by 0x4008CD: init (init.c:126) -==29406== by 0x4007B5: main (main.c:21) -==29406== Block was alloc'd by thread #1 -==29406== -==29406== -==29406== ---Thread-Announcement------------------------------------------ -==29406== -==29406== Thread #2 was created -==29406== at 0x518470E: clone (clone.S:71) -==29406== by 0x4E4BEC4: create_thread (createthread.c:100) -==29406== by 0x4E4BEC4: pthread_create@@GLIBC_2.2.5 (pthread_create.c:797) -==29406== by 0x4C38A27: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x400E19: launch (launch.c:85) -==29406== by 0x4007DD: main (main.c:24) -==29406== -==29406== ---------------------------------------------------------------- -==29406== -==29406== Thread #2: lock order "0x54541F8 before 0x54545B8" violated -==29406== -==29406== Observed (incorrect) order is: acquisition of lock at 0x54545B8 -==29406== at 0x4C3603C: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x4011BC: eat (exec.c:38) -==29406== by 0x401115: philo_exec (exec.c:121) -==29406== by 0x4C38C26: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x4E4B6DA: start_thread (pthread_create.c:463) -==29406== by 0x518471E: clone (clone.S:95) -==29406== -==29406== followed by a later acquisition of lock at 0x54541F8 -==29406== at 0x4C3603C: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x401226: eat (exec.c:43) -==29406== by 0x401115: philo_exec (exec.c:121) -==29406== by 0x4C38C26: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x4E4B6DA: start_thread (pthread_create.c:463) -==29406== by 0x518471E: clone (clone.S:95) -==29406== -==29406== Lock at 0x54541F8 was first observed -==29406== at 0x4C39F2A: pthread_mutex_init (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x400C75: lst_add_philo (init.c:25) -==29406== by 0x400B8D: init_chain_philo (init.c:49) -==29406== by 0x4008CD: init (init.c:126) -==29406== by 0x4007B5: main (main.c:21) -==29406== Address 0x54541f8 is 24 bytes inside a block of size 176 alloc'd -==29406== at 0x4C32F2F: malloc (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x400C21: lst_add_philo (init.c:19) -==29406== by 0x400B8D: init_chain_philo (init.c:49) -==29406== by 0x4008CD: init (init.c:126) -==29406== by 0x4007B5: main (main.c:21) -==29406== Block was alloc'd by thread #1 -==29406== -==29406== Lock at 0x54545B8 was first observed -==29406== at 0x4C39F2A: pthread_mutex_init (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x400C75: lst_add_philo (init.c:25) -==29406== by 0x400B8D: init_chain_philo (init.c:49) -==29406== by 0x4008CD: init (init.c:126) -==29406== by 0x4007B5: main (main.c:21) -==29406== Address 0x54545b8 is 24 bytes inside a block of size 176 alloc'd -==29406== at 0x4C32F2F: malloc (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==29406== by 0x400C21: lst_add_philo (init.c:19) -==29406== by 0x400B8D: init_chain_philo (init.c:49) -==29406== by 0x4008CD: init (init.c:126) -==29406== by 0x4007B5: main (main.c:21) -==29406== Block was alloc'd by thread #1 -==29406== -==29406== -3 5 has taken a fork -17 5 has taken a fork -18 5 is eating +==22761== Helgrind, a thread error detector +==22761== Copyright (C) 2007-2017, and GNU GPL'd, by OpenWorks LLP et al. +==22761== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info +==22761== Command: ./philo 5 500 200 200 5 +==22761== +==22761== ---Thread-Announcement------------------------------------------ +==22761== +==22761== Thread #3 was created +==22761== at 0x518470E: clone (clone.S:71) +==22761== by 0x4E4BEC4: create_thread (createthread.c:100) +==22761== by 0x4E4BEC4: pthread_create@@GLIBC_2.2.5 (pthread_create.c:797) +==22761== by 0x4C38A27: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x400E29: launch (launch.c:85) +==22761== by 0x4007DD: main (main.c:24) +==22761== +==22761== ---------------------------------------------------------------- +==22761== +==22761== Thread #3: lock order "0x54542E8 before 0x54541F8" violated +==22761== +==22761== Observed (incorrect) order is: acquisition of lock at 0x54541F8 +==22761== at 0x4C3603C: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x4011BC: eat (exec.c:27) +==22761== by 0x401119: philo_exec (exec.c:72) +==22761== by 0x4C38C26: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x4E4B6DA: start_thread (pthread_create.c:463) +==22761== by 0x518471E: clone (clone.S:95) +==22761== +==22761== followed by a later acquisition of lock at 0x54542E8 +==22761== at 0x4C3603C: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x401226: eat (exec.c:32) +==22761== by 0x401119: philo_exec (exec.c:72) +==22761== by 0x4C38C26: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x4E4B6DA: start_thread (pthread_create.c:463) +==22761== by 0x518471E: clone (clone.S:95) +==22761== +==22761== Lock at 0x54542E8 was first observed +==22761== at 0x4C39F2A: pthread_mutex_init (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x400C85: lst_add_philo (init.c:25) +==22761== by 0x400B9D: init_chain_philo (init.c:49) +==22761== by 0x4008CD: init (init.c:127) +==22761== by 0x4007B5: main (main.c:21) +==22761== Address 0x54542e8 is 24 bytes inside a block of size 176 alloc'd +==22761== at 0x4C32F2F: malloc (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x400C31: lst_add_philo (init.c:19) +==22761== by 0x400B9D: init_chain_philo (init.c:49) +==22761== by 0x4008CD: init (init.c:127) +==22761== by 0x4007B5: main (main.c:21) +==22761== Block was alloc'd by thread #1 +==22761== +==22761== Lock at 0x54541F8 was first observed +==22761== at 0x4C39F2A: pthread_mutex_init (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x400C85: lst_add_philo (init.c:25) +==22761== by 0x400B9D: init_chain_philo (init.c:49) +==22761== by 0x4008CD: init (init.c:127) +==22761== by 0x4007B5: main (main.c:21) +==22761== Address 0x54541f8 is 24 bytes inside a block of size 176 alloc'd +==22761== at 0x4C32F2F: malloc (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x400C31: lst_add_philo (init.c:19) +==22761== by 0x400B9D: init_chain_philo (init.c:49) +==22761== by 0x4008CD: init (init.c:127) +==22761== by 0x4007B5: main (main.c:21) +==22761== Block was alloc'd by thread #1 +==22761== +==22761== +==22761== ---Thread-Announcement------------------------------------------ +==22761== +==22761== Thread #5 was created +==22761== at 0x518470E: clone (clone.S:71) +==22761== by 0x4E4BEC4: create_thread (createthread.c:100) +==22761== by 0x4E4BEC4: pthread_create@@GLIBC_2.2.5 (pthread_create.c:797) +==22761== by 0x4C38A27: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x400E29: launch (launch.c:85) +==22761== by 0x4007DD: main (main.c:24) +==22761== +==22761== ---------------------------------------------------------------- +==22761== +==22761== Thread #5: lock order "0x54544C8 before 0x54543D8" violated +==22761== +==22761== Observed (incorrect) order is: acquisition of lock at 0x54543D8 +==22761== at 0x4C3603C: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x4011BC: eat (exec.c:27) +==22761== by 0x401119: philo_exec (exec.c:72) +==22761== by 0x4C38C26: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x4E4B6DA: start_thread (pthread_create.c:463) +==22761== by 0x518471E: clone (clone.S:95) +==22761== +==22761== followed by a later acquisition of lock at 0x54544C8 +==22761== at 0x4C3603C: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x401226: eat (exec.c:32) +==22761== by 0x401119: philo_exec (exec.c:72) +==22761== by 0x4C38C26: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x4E4B6DA: start_thread (pthread_create.c:463) +==22761== by 0x518471E: clone (clone.S:95) +==22761== +==22761== Lock at 0x54544C8 was first observed +==22761== at 0x4C39F2A: pthread_mutex_init (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x400C85: lst_add_philo (init.c:25) +==22761== by 0x400B9D: init_chain_philo (init.c:49) +==22761== by 0x4008CD: init (init.c:127) +==22761== by 0x4007B5: main (main.c:21) +==22761== Address 0x54544c8 is 24 bytes inside a block of size 176 alloc'd +==22761== at 0x4C32F2F: malloc (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x400C31: lst_add_philo (init.c:19) +==22761== by 0x400B9D: init_chain_philo (init.c:49) +==22761== by 0x4008CD: init (init.c:127) +==22761== by 0x4007B5: main (main.c:21) +==22761== Block was alloc'd by thread #1 +==22761== +==22761== Lock at 0x54543D8 was first observed +==22761== at 0x4C39F2A: pthread_mutex_init (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x400C85: lst_add_philo (init.c:25) +==22761== by 0x400B9D: init_chain_philo (init.c:49) +==22761== by 0x4008CD: init (init.c:127) +==22761== by 0x4007B5: main (main.c:21) +==22761== Address 0x54543d8 is 24 bytes inside a block of size 176 alloc'd +==22761== at 0x4C32F2F: malloc (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x400C31: lst_add_philo (init.c:19) +==22761== by 0x400B9D: init_chain_philo (init.c:49) +==22761== by 0x4008CD: init (init.c:127) +==22761== by 0x4007B5: main (main.c:21) +==22761== Block was alloc'd by thread #1 +==22761== +==22761== +==22761== ---Thread-Announcement------------------------------------------ +==22761== +==22761== Thread #2 was created +==22761== at 0x518470E: clone (clone.S:71) +==22761== by 0x4E4BEC4: create_thread (createthread.c:100) +==22761== by 0x4E4BEC4: pthread_create@@GLIBC_2.2.5 (pthread_create.c:797) +==22761== by 0x4C38A27: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x400E29: launch (launch.c:85) +==22761== by 0x4007DD: main (main.c:24) +==22761== +==22761== ---------------------------------------------------------------- +==22761== +==22761== Thread #2: lock order "0x54541F8 before 0x54545B8" violated +==22761== +==22761== Observed (incorrect) order is: acquisition of lock at 0x54545B8 +==22761== at 0x4C3603C: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x4011BC: eat (exec.c:27) +==22761== by 0x401119: philo_exec (exec.c:72) +==22761== by 0x4C38C26: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x4E4B6DA: start_thread (pthread_create.c:463) +==22761== by 0x518471E: clone (clone.S:95) +==22761== +==22761== followed by a later acquisition of lock at 0x54541F8 +==22761== at 0x4C3603C: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x401226: eat (exec.c:32) +==22761== by 0x401119: philo_exec (exec.c:72) +==22761== by 0x4C38C26: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x4E4B6DA: start_thread (pthread_create.c:463) +==22761== by 0x518471E: clone (clone.S:95) +==22761== +==22761== Lock at 0x54541F8 was first observed +==22761== at 0x4C39F2A: pthread_mutex_init (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x400C85: lst_add_philo (init.c:25) +==22761== by 0x400B9D: init_chain_philo (init.c:49) +==22761== by 0x4008CD: init (init.c:127) +==22761== by 0x4007B5: main (main.c:21) +==22761== Address 0x54541f8 is 24 bytes inside a block of size 176 alloc'd +==22761== at 0x4C32F2F: malloc (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x400C31: lst_add_philo (init.c:19) +==22761== by 0x400B9D: init_chain_philo (init.c:49) +==22761== by 0x4008CD: init (init.c:127) +==22761== by 0x4007B5: main (main.c:21) +==22761== Block was alloc'd by thread #1 +==22761== +==22761== Lock at 0x54545B8 was first observed +==22761== at 0x4C39F2A: pthread_mutex_init (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x400C85: lst_add_philo (init.c:25) +==22761== by 0x400B9D: init_chain_philo (init.c:49) +==22761== by 0x4008CD: init (init.c:127) +==22761== by 0x4007B5: main (main.c:21) +==22761== Address 0x54545b8 is 24 bytes inside a block of size 176 alloc'd +==22761== at 0x4C32F2F: malloc (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x400C31: lst_add_philo (init.c:19) +==22761== by 0x400B9D: init_chain_philo (init.c:49) +==22761== by 0x4008CD: init (init.c:127) +==22761== by 0x4007B5: main (main.c:21) +==22761== Block was alloc'd by thread #1 +==22761== +==22761== +5 5 has taken a fork +15 5 has taken a fork +16 5 is eating +29 3 has taken a fork 30 3 has taken a fork -31 3 has taken a fork 32 3 is eating -45 2 has taken a fork -225 5 is sleeping -229 1 has taken a fork -235 3 is sleeping -238 2 has taken a fork -240 2 is eating +42 2 has taken a fork +224 5 is sleeping +228 1 has taken a fork +234 3 is sleeping +237 2 has taken a fork +238 2 is eating +240 4 has taken a fork 241 4 has taken a fork -242 4 has taken a fork -243 4 is eating -429 5 is thinking -438 3 is thinking -442 3 has taken a fork -446 1 has taken a fork -448 1 is eating -448 2 is sleeping -451 5 has taken a fork -453 4 is sleeping -457 3 has taken a fork -458 3 is eating -518 5 died -==29406== -==29406== For counts of detected and suppressed errors, rerun with: -v -==29406== Use --history-level=approx or =none to gain increased speed, at -==29406== the cost of reduced accuracy of conflicting-access information -==29406== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 6156 from 116) +242 4 is eating +428 5 is thinking +435 3 is thinking +440 2 is sleeping +443 1 has taken a fork +444 1 is eating +447 3 has taken a fork +449 5 has taken a fork +450 3 has taken a fork +451 3 is eating +452 4 is sleeping +516 5 died +==22761== +==22761== For counts of detected and suppressed errors, rerun with: -v +==22761== Use --history-level=approx or =none to gain increased speed, at +==22761== the cost of reduced accuracy of conflicting-access information +==22761== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 6158 from 111) diff --git a/philo/srcs/exec.c b/philo/srcs/exec.c index 3388b4c..ef338dd 100644 --- a/philo/srcs/exec.c +++ b/philo/srcs/exec.c @@ -1,25 +1,5 @@ #include "philo.h" -int get_time(t_params *params) -{ - struct timeval tp; - long time; - - if (gettimeofday(&tp, NULL) < 0) - { - return (-1); - } - time = tp.tv_sec * 1000 + tp.tv_usec / 1000; - if (!params->start_time) - { - params->start_time = time; - return (0); - } - time -= params->start_time; - return (time); -} - -/* static void action_delay(t_philo *philo, int action_time) { struct timeval stime; @@ -32,17 +12,6 @@ static void action_delay(t_philo *philo, int action_time) else if (death_time > 0) usleep(philo->params->t_die * 1000); } -*/ - -/* -static int ret_err_unlock(t_philo *philo, int nbr_fork) -{ - if (nbr_fork == 2) - pthread_mutex_unlock(&philo->next->m_fork); - pthread_mutex_unlock(&philo->m_fork); - return (1); -} -*/ static int ret_err_unlock(t_mtx *fork1, t_mtx *fork2) { @@ -53,12 +22,8 @@ static int ret_err_unlock(t_mtx *fork1, t_mtx *fork2) return (1); } - - static int eat(t_philo *philo, t_mtx *fork1, t_mtx *fork2) { - int time; - pthread_mutex_lock(fork1); if (print_message(philo, WHITE, "has taken a fork")) return (ret_err_unlock(fork1, NULL)); @@ -67,17 +32,11 @@ static int eat(t_philo *philo, t_mtx *fork1, t_mtx *fork2) pthread_mutex_lock(fork2); if (print_message(philo, WHITE, "has taken a fork")) return (ret_err_unlock(fork1, fork2)); - -// update_time(philo); - time = get_time(philo->params); - + update_time(philo); if (print_message(philo, B_YELLOW, "is eating")) return (ret_err_unlock(fork1, fork2)); -// action_delay(philo, philo->params->t_eat); - while (get_time(philo->params) - time < philo->params->t_eat) - usleep(100); - + action_delay(philo, philo->params->t_eat); pthread_mutex_lock(&(philo->m_eat)); philo->eat_count++; pthread_mutex_unlock(&(philo->m_eat)); @@ -87,88 +46,55 @@ static int eat(t_philo *philo, t_mtx *fork1, t_mtx *fork2) } /* -static int eat(t_philo *philo) -{ - pthread_mutex_lock(&(philo->m_fork)); - if (print_message(philo, WHITE, "has taken a fork")) - return (ret_err_unlock(philo, 1)); - if (philo->next == philo) - return (ret_err_unlock(philo, 1)); - pthread_mutex_lock(&(philo->next->m_fork)); - if (print_message(philo, WHITE, "has taken a fork")) - return (ret_err_unlock(philo, 2)); - update_time(philo); - if (print_message(philo, B_YELLOW, "is eating")) - return (ret_err_unlock(philo, 2)); - action_delay(philo, philo->params->t_eat); - pthread_mutex_lock(&(philo->m_eat)); - philo->eat_count++; - pthread_mutex_unlock(&(philo->m_eat)); - pthread_mutex_unlock(&(philo->next->m_fork)); - pthread_mutex_unlock(&(philo->m_fork)); - return (0); -} +** fork1 = &(philo->m_fork); +** fork2 = &(philo->m_fork); +** if (philo->global->t_start.ts == 0) +** if (philo->p_nbr < philo->params->n_phi / 2) +** if (philo->p_nbr % 2 == 0) +** fork1 = &(philo->next->m_fork); +** else +** fork2 = &(philo->next->m_fork); */ -/* -==10069== Observed (incorrect) order is: acquisition of lock at 0x54541F8 -==10069== at 0x4C3603C: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==10069== by 0x401188: eat (exec.c:38) -==10069== by 0x4010E7: philo_exec (exec.c:68) -==10069== by 0x4C38C26: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==10069== by 0x4E4B6DA: start_thread (pthread_create.c:463) -==10069== by 0x518471E: clone (clone.S:95) -==10069== -==10069== followed by a later acquisition of lock at 0x54542E8 -==10069== at 0x4C3603C: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==10069== by 0x401209: eat (exec.c:43) -==10069== by 0x4010E7: philo_exec (exec.c:68) -==10069== by 0x4C38C26: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) -==10069== by 0x4E4B6DA: start_thread (pthread_create.c:463) -==10069== by 0x518471E: clone (clone.S:95) -*/ - void *philo_exec(void *arg) { - int time; - t_philo *philo; t_mtx *fork1; t_mtx *fork2; philo = (t_philo *)arg; - -// init_time(philo); - get_time(philo->params); - -// if (philo->p_nbr % 2 == 0) -// usleep(10 * 1000); - - fork1 = &(philo->m_fork); - fork2 = &(philo->m_fork); -// if (philo->global->t_start.ts == 0) -// if (philo->p_nbr < philo->params->n_phi / 2) + init_time(philo); if (philo->p_nbr % 2 == 0) - fork1 = &(philo->next->m_fork); - else - fork2 = &(philo->next->m_fork); - + usleep(10 * 1000); + fork1 = &(philo->m_fork); + fork2 = &(philo->next->m_fork); while (1) { if (eat(philo, fork1, fork2) != 0) -// if (eat(philo) != 0) break ; - - time = get_time(philo->params); - if (print_message(philo, B_BLUE, "is sleeping")) break ; - -// action_delay(philo, philo->params->t_slp); - while (get_time(philo->params) - time < philo->params->t_slp) - usleep(100); - + action_delay(philo, philo->params->t_slp); if (print_message(philo, B_GREEN, "is thinking")) break ; } return (NULL); } +/* +==22761== Thread #3: lock order "0x54542E8 before 0x54541F8" violated +==22761== +==22761== Observed (incorrect) order is: acquisition of lock at 0x54541F8 +==22761== at 0x4C3603C: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x4011BC: eat (exec.c:27) +==22761== by 0x401119: philo_exec (exec.c:72) +==22761== by 0x4C38C26: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x4E4B6DA: start_thread (pthread_create.c:463) +==22761== by 0x518471E: clone (clone.S:95) +==22761== +==22761== followed by a later acquisition of lock at 0x54542E8 +==22761== at 0x4C3603C: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x401226: eat (exec.c:32) +==22761== by 0x401119: philo_exec (exec.c:72) +==22761== by 0x4C38C26: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) +==22761== by 0x4E4B6DA: start_thread (pthread_create.c:463) +==22761== by 0x518471E: clone (clone.S:95) +*/