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 bb5f5aa9f04b4545213271ca0cdd654ec3f1a7a1..6cfb9c53dfba423b44ed1b2e79dcff10caf805a8 100644 (file)
@@ -1,3 +1,8 @@
+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
index e9e69db9717d70cc7ea073bb85afae76b85b86d8..4693120ef7903c07b215870061868dff9007946a 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
     {