[PATCH] nptl: Fix nptl/tst-cancel31 fail sometimes

mengqinggang mengqinggang@loongson.cn
Tue Mar 24 07:48:38 GMT 2026


tst-cancel31 fail on la32 qemu-system with a single-core
system sometimes.

IF the test and a infinite loop run on a same x86_64 core,
the test also fail sometimes.
  taskset -c 0 make test t=nptl/tst-cancel31
  taskset -c 0 ./a.out (a.out is a infinite loop)

After writeopener thread opens the file, it may switch to
main thread and find redundant files.

pthread_cancel and pthread_join writeopener thread
before support_descriptors_check.
---
 nptl/tst-cancel31.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/nptl/tst-cancel31.c b/nptl/tst-cancel31.c
index e9ffef3b41..8909879ff4 100644
--- a/nptl/tst-cancel31.c
+++ b/nptl/tst-cancel31.c
@@ -43,7 +43,9 @@ writeopener (void *arg)
   for (;;)
     {
       fd = open (arg, O_WRONLY);
+      pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, 0);
       xclose (fd);
+      pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, 0);
     }
   return NULL;
 }
@@ -74,7 +76,7 @@ do_test (void)
 
   srand (1);
 
-  xpthread_create (NULL, writeopener, name);
+  pthread_t tw = xpthread_create (NULL, writeopener, name);
   for (int i = 0; i < iter_count; i++)
     {
       pthread_t td = xpthread_create (NULL, leaker, name);
@@ -88,6 +90,9 @@ do_test (void)
       xpthread_join (td);
     }
 
+  pthread_cancel (tw);
+  xpthread_join (tw);
+
   support_descriptors_check (descrs);
 
   support_descriptors_free (descrs);
-- 
2.34.1



More information about the Libc-alpha mailing list