microcode (OS_test_select_registry): Check for subprocess status
authorMatt Birkholz <matt@birchwood-abbey.net>
Wed, 23 Nov 2016 17:38:21 +0000 (10:38 -0700)
committerMatt Birkholz <matt@birchwood-abbey.net>
Wed, 23 Nov 2016 17:38:21 +0000 (10:38 -0700)
changes when !blockp and the registry is empty.  This is most easily
done in OS_pause, where OS_process_any_status_change (if any) is
available.  Thus OS_pause gets a new param BLOCKP.

src/microcode/ntio.c
src/microcode/osio.h
src/microcode/prosio.c
src/microcode/uxio.c

index 0d9acf5b6a7b376a2a0f0479dbba1a5adfeadfdc..3ff42eec84ed4329ff27036500fb75dea14094d3 100644 (file)
@@ -848,12 +848,12 @@ OS_test_select_registry (select_registry_t registry, int blockp)
 }
 
 int
-OS_pause (bool ignore_status_change)
+OS_pause (bool blockp, bool ignore_status_change)
 {
-  /* Wait-for-io must spin. */
   return
-    ((OS_process_any_status_change ())
+    ((!ignore_status_change && (OS_process_any_status_change ()))
      ? SELECT_PROCESS_STATUS_CHANGE
+     /* Wait-for-io must spin. */
      : SELECT_INTERRUPT);
 }
 
index f03977bb22252eed07c18c147caad69822f3f6f3..0600a8b6ed3eadf3f8c8f409ce396ffc096aaa55 100644 (file)
@@ -110,6 +110,6 @@ extern int OS_test_select_registry
   (select_registry_t registry, int blockp);
 extern int OS_test_select_descriptor
   (int fd, int blockp, unsigned int mode);
-extern int OS_pause (bool ignore_status_change);
+extern int OS_pause (bool blockp, bool ignore_status_change);
 
 #endif /* SCM_OSIO_H */
index 85153f2d6447a0f93bf17a05b06909d0b29793b8..6ffd2e0e8e3d8f39217298831fcf4f48ea393fb7 100644 (file)
@@ -332,7 +332,7 @@ DEFINE_PRIMITIVE ("TEST-SELECT-REGISTRY", Prim_test_selreg, 4, 4, 0)
     if ((VECTOR_LENGTH (vmode)) < rl)
       error_bad_range_arg (4);
     result = ((rl == 0)
-             ? (blockp ? (OS_pause (0)) : SELECT_INTERRUPT)
+             ? (OS_pause (blockp, 0))
              : (OS_test_select_registry (r, blockp)));
     if (result > 0)
       {
index 776523ca9e64df22723ac31b6d1ff27058ebfc05..e811f00d9beaf2d54bf029fccc16a2c99990fa42 100644 (file)
@@ -868,27 +868,37 @@ OS_test_select_descriptor (int fd, int blockp, unsigned int mode)
 #endif /* not HAVE_POLL */
 
 int
-OS_pause (bool ignore_status_change)
+OS_pause (bool blockp, bool ignore_status_change)
 {
-#ifdef HAVE_SIGSUSPEND
-  sigset_t old, new;
   int n;
 
-  UX_sigfillset (&new);
-  UX_sigprocmask (SIG_SETMASK, &new, &old);
-  if (!ignore_status_change && OS_process_any_status_change ())
-    n = SELECT_PROCESS_STATUS_CHANGE;
-  else if ((GET_INT_CODE) != 0)
-    n = SELECT_INTERRUPT;
-  else
+  if (!blockp)
     {
-      UX_sigsuspend (&old);
-      if (OS_process_any_status_change ())
-       n = SELECT_PROCESS_STATUS_CHANGE;
-      else
-       n = SELECT_INTERRUPT;
+      if (!ignore_status_change && OS_process_any_status_change ())
+       return (SELECT_PROCESS_STATUS_CHANGE);
+      return (SELECT_INTERRUPT);
     }
-  UX_sigprocmask (SIG_SETMASK, &old, NULL);
+
+#ifdef HAVE_SIGSUSPEND
+  {
+    sigset_t old, new;
+
+    UX_sigfillset (&new);
+    UX_sigprocmask (SIG_SETMASK, &new, &old);
+    if (!ignore_status_change && OS_process_any_status_change ())
+      n = SELECT_PROCESS_STATUS_CHANGE;
+    else if ((GET_INT_CODE) != 0)
+      n = SELECT_INTERRUPT;
+    else
+      {
+       UX_sigsuspend (&old);
+       if (OS_process_any_status_change ())
+         n = SELECT_PROCESS_STATUS_CHANGE;
+       else
+         n = SELECT_INTERRUPT;
+      }
+    UX_sigprocmask (SIG_SETMASK, &old, NULL);
+  }
 #else /* not HAVE_SIGSUSPEND */
   INTERRUPTABLE_EXTENT
     (n, (((!ignore_status_change && (OS_process_any_status_change ()))