Browse Source

Fix subtle race in tst-cancel2 / tst-cancelx2

When ran on ARC, these tests would ocassionally fail

| [ARCLinux]# for i in 1 2 3 4 5 ; do ./tst-cancel2; echo $?; done
| write succeeded
| result is wrong: expected 0xffffffff, got 0x1
| 1							<-- fail
| 0							<-- pass
| 0							<--- pass
| 0							<-- pass
| write succeeded
| result is wrong: expected 0xffffffff, got 0x1
| 1							<-- fail

Same test (which originated form glibc) doesn't fail in glibc builds.
Turns out there's a subtle race in uclibc version

The test creates a new thread, makes it do a looong write call, and
parent then cancels the thread, expecting it to unwind out of write
call cleanly. However the write (even for 10k bytes) could finish
before parent gets a chance to resume and/or cancel it, causing the
occasional failure.

Fix this subtelty by making it write not just once but forever.

Cc: Cupertino Miranda <cmiranda@synopsys.com>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Vineet Gupta 6 years ago
parent
commit
6449cfcf3e
1 changed files with 1 additions and 5 deletions
  1. 1 5
      test/nptl/tst-cancel2.c

+ 1 - 5
test/nptl/tst-cancel2.c

@@ -32,11 +32,7 @@ tf (void *arg)
      write blocks.  */
   char buf[100000];
 
-  if (write (fd[1], buf, sizeof (buf)) == sizeof (buf))
-    {
-      puts ("write succeeded");
-      return (void *) 1l;
-    }
+  while (write (fd[1], buf, sizeof (buf)) > 0);
 
   return (void *) 42l;
 }