This test was fixed by 826484111a ("hurd: handling pending signals could
result in corruption of FPU state.")
---
 hurd/test-sig-xstate.c | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/hurd/test-sig-xstate.c b/hurd/test-sig-xstate.c
index 8ddfbebcd5..9e7c77b560 100644
--- a/hurd/test-sig-xstate.c
+++ b/hurd/test-sig-xstate.c
@@ -43,6 +43,7 @@
 
 static volatile atomic_bool startflag = ATOMIC_VAR_INIT (false);
 static volatile atomic_bool loopflag = ATOMIC_VAR_INIT (true);
+static volatile bool doublesig = false;
 
 void handler (int signum, siginfo_t *info, void *context)
 {
@@ -53,7 +54,13 @@ void handler (int signum, siginfo_t *info, void *context)
   SET_MMXSTATE (mmxbuf3);
   SET_XSTATE (xbuf3);
   printf ("signal %d setting a different CPU state\n", signum);
-  atomic_store_explicit (&loopflag, false, memory_order_release);
+  if (doublesig)
+    {
+      doublesig = false;
+      TEST_COMPARE (kill (getpid (), SIGUSR1), 0);
+    }
+  else
+    atomic_store_explicit (&loopflag, false, memory_order_release);
 }
 
 /* Helper thread to send a signal to the main thread  */
@@ -101,6 +108,28 @@ static int do_test (void)
   TEST_COMPARE_BLOB (xbuf1, sizeof (xbuf1), xbuf2, sizeof (xbuf2));
 
   xpthread_join (thsender);
+
+  /* Now retry with double signalling.  */
+  doublesig = true;
+  atomic_store_explicit (&startflag, false, memory_order_relaxed);
+  atomic_store_explicit (&loopflag, true, memory_order_relaxed);
+
+  thsender = xpthread_create (NULL, signal_sender, NULL);
+
+  SET_MMXSTATE (mmxbuf1);
+  SET_XSTATE (xbuf1);
+
+  atomic_store_explicit (&startflag, true, memory_order_release);
+  while (atomic_load_explicit (&loopflag, memory_order_acquire))
+    ;
+
+  GET_MMXSTATE (mmxbuf2);
+  GET_XSTATE (xbuf2);
+  TEST_COMPARE_BLOB (mmxbuf1, sizeof (mmxbuf1), mmxbuf2, sizeof (mmxbuf2));
+  TEST_COMPARE_BLOB (xbuf1, sizeof (xbuf1), xbuf2, sizeof (xbuf2));
+
+  xpthread_join (thsender);
+
   return EXIT_SUCCESS;
 }
 
-- 
2.51.0


Reply via email to