]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
nptl: Fix nptl/tst-cancel31 fail sometimes
authormengqinggang <mengqinggang@loongson.cn>
Tue, 24 Mar 2026 07:48:38 +0000 (15:48 +0800)
committerCarlos O'Donell <carlos@redhat.com>
Tue, 24 Mar 2026 16:21:33 +0000 (12:21 -0400)
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.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
nptl/tst-cancel31.c

index e9ffef3b4165dd4869604d08698eabce7dc32569..8909879ff41b42d818ea0df9579e86e962d22deb 100644 (file)
@@ -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);