Linux waitpid/__WALL emulation wrapper: If WNOHANG is set, don't touch sigprocmask.
authorPedro Alves <palves@redhat.com>
Thu, 27 Feb 2014 14:44:16 +0000 (14:44 +0000)
committerPedro Alves <palves@redhat.com>
Thu, 27 Feb 2014 14:44:16 +0000 (14:44 +0000)
Just a small optimization.  No need to block/unblock signals if we're
not going to call sigsuspend.

gdb/
2014-02-27  Pedro Alves  <palves@redhat.com>

* nat/linux-waitpid.c (my_waitpid): Only block signals if WNOHANG
isn't set.

gdb/ChangeLog
gdb/nat/linux-waitpid.c

index bb5f5aa..6cfb9c5 100644 (file)
@@ -1,5 +1,10 @@
 2014-02-27  Pedro Alves  <palves@redhat.com>
 
+       * nat/linux-waitpid.c (my_waitpid): Only block signals if WNOHANG
+       isn't set.
+
+2014-02-27  Pedro Alves  <palves@redhat.com>
+
        PR 12702
        * linux-nat.c (status_to_str): Moved to nat/linux-waitpid.c.
        * nat/linux-waitpid.c: Include string.h.
index e9e69db..4693120 100644 (file)
@@ -92,15 +92,19 @@ my_waitpid (int pid, int *status, int flags)
 
       wnohang = (flags & WNOHANG) != 0;
       flags &= ~(__WALL | __WCLONE);
-      flags |= WNOHANG;
 
-      /* Block all signals while here.  This avoids knowing about
-        LinuxThread's signals.  */
-      sigfillset (&block_mask);
-      sigprocmask (SIG_BLOCK, &block_mask, &org_mask);
+      if (!wnohang)
+       {
+         flags |= WNOHANG;
+
+         /* Block all signals while here.  This avoids knowing about
+            LinuxThread's signals.  */
+         sigfillset (&block_mask);
+         sigprocmask (SIG_BLOCK, &block_mask, &org_mask);
 
-      /* ... except during the sigsuspend below.  */
-      sigemptyset (&wake_mask);
+         /* ... except during the sigsuspend below.  */
+         sigemptyset (&wake_mask);
+       }
 
       while (1)
        {
@@ -129,7 +133,8 @@ my_waitpid (int pid, int *status, int flags)
          flags ^= __WCLONE;
        }
 
-      sigprocmask (SIG_SETMASK, &org_mask, NULL);
+      if (!wnohang)
+       sigprocmask (SIG_SETMASK, &org_mask, NULL);
     }
   else
     {