From: Subrata <sub...@us...> - 2008-03-14 19:16:28
|
Update of /cvsroot/ltp/ltp/testcases/kernel/syscalls/lib In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13025/ltp/testcases/kernel/syscalls/lib Modified Files: libtestsuite.c Log Message: Fixes a concurrency issue in semctl01. This test was using usleep to synchronize tasks. On a heavily loaded system, this synchronization is not enough to ensure execution correctness. This patch is a bit more intrusive than my previous ones. Patch content : * Define 2 new functions in kernel/syscalls/lib/libtestsuite.c, used to synchronize a father and a son using pipes. - create_sync_pipes: create a pair of pipes used for the synchronization, - wait_son_startup: function used in the father to wait for its son to start ts execution, - notify_startup: function used in the son to notify it has started its execution, * Add a kernel/syscalls/lib/libtestsuite.h file to cleanly export newly defines functions, * Fix the semctl01test. The idea used to synchronize : - For each task created, the father waits for the son to start its execution using the newly define functions, - After the last son has been created, the father do a sleep(1) to give time to the sons to execute the semop function, The final sleep does not guaranty the sons will have time to do the semop. On a REALLY heavily loaded system, this will still fail... The only solution I see to be sure the son is really blocked on the semop before the father continue its execution it to use the wchan info from /proc/<pid>/wchan file..., by, Renaud Lottiaux <Ren...@ke...> Index: libtestsuite.c =================================================================== RCS file: /cvsroot/ltp/ltp/testcases/kernel/syscalls/lib/libtestsuite.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** libtestsuite.c 3 Apr 2002 15:42:00 -0000 1.2 --- libtestsuite.c 14 Mar 2008 19:16:24 -0000 1.3 *************** *** 29,32 **** --- 29,36 ---- * my_getpwnam(), do_file_setup() * + * HISTORY + * 11/03/2008 Renaud Lottiaux (Ren...@ke...) + * - Add the following functions to synchronise father and sons processes + * create_sync_pipes(), wait_son_startup(), notify_startup() */ #include <unistd.h> *************** *** 72,73 **** --- 76,110 ---- } } + + int create_sync_pipes(int fd[]) + { + return pipe (fd); + } + + int wait_son_startup (int fd[]) + { + char buf; + int r; + + r = read (fd[0], &buf, 1); + close (fd[0]); + close (fd[1]); + + if ((r != 1) || (buf != 'A')) + return -1; + return 0; + } + + int notify_startup (int fd[]) + { + char buf = 'A'; + int r; + + r = write (fd[1], &buf, 1); + close (fd[0]); + close (fd[1]); + + if (r != 1) + return -1; + return 0; + } |