Add an ignore_status_change parameter to OS_pause for SMP-IDLE.
authorMatt Birkholz <puck@birchwood-abbey.net>
Wed, 15 Jul 2015 10:16:58 +0000 (03:16 -0700)
committerMatt Birkholz <puck@birchwood-abbey.net>
Thu, 26 Nov 2015 08:09:45 +0000 (01:09 -0700)
OS_pause previously returned immediately if there were pending
interrupts OR subprocess status changes, as required by a blocking
test-select-registry primitive.  That made it useless to the SMP-IDLE
primitive, which spins in the idle loop until the io-waiter (or a
timer interrupt handler) gets around to syncing subprocess statuses.
It will spin too after getting a SIGCHLD until statuses are synced.

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

index 459fbd0fba0135268121522fa8d307263a5574cd..dc503b4f467c537d3064e1f0b006cd16e69d362f 100644 (file)
@@ -848,7 +848,7 @@ OS_test_select_registry (select_registry_t registry, int blockp)
 }
 
 int
-OS_pause (void)
+OS_pause (bool ignore_status_change)
 {
   /* Wait-for-io must spin. */
   return
index 07bcac4af492465b9d2d0246e4b18aa698952208..dfb3aaf999a02df0405948e2abdec62825469158 100644 (file)
@@ -566,7 +566,7 @@ OS_test_select_registry (select_registry_t registry, int blockp)
 }
 
 int
-OS_pause (void)
+OS_pause (bool ignore_status_change)
 {
   /* Wait-for-io must spin. */
   return
index d2f28eed83cd001bb327c32dbf9ee2b3c0a514a2..da0d862a2219758e287e69f8149639cc018f9706 100644 (file)
@@ -109,6 +109,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 (void);
+extern int OS_pause (bool ignore_status_change);
 
 #endif /* SCM_OSIO_H */
index 44cc85b1d7bb2a4d3277a01e8462b35b45f4cee2..9fcfea72f49318ec3feaa43f69dd77a6f0c65d35 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 ()) : SELECT_INTERRUPT)
+             ? (blockp ? (OS_pause (0)) : SELECT_INTERRUPT)
              : (OS_test_select_registry (r, blockp)));
     if (result > 0)
       {
index 5dcd3d4d57749885fd261974a898d2c8659ed2fb..83304b30031569c106401e390e171fec1898b4a3 100644 (file)
@@ -861,7 +861,7 @@ OS_test_select_descriptor (int fd, int blockp, unsigned int mode)
 #endif /* not HAVE_POLL */
 
 int
-OS_pause (void)
+OS_pause (bool ignore_status_change)
 {
 #ifdef HAVE_SIGSUSPEND
   sigset_t old, new;
@@ -869,7 +869,7 @@ OS_pause (void)
 
   UX_sigfillset (&new);
   UX_sigprocmask (SIG_SETMASK, &new, &old);
-  if (OS_process_any_status_change ())
+  if (!ignore_status_change && OS_process_any_status_change ())
     n = SELECT_PROCESS_STATUS_CHANGE;
   else if ((GET_INT_CODE) != 0)
     n = SELECT_INTERRUPT;
@@ -884,7 +884,7 @@ OS_pause (void)
   UX_sigprocmask (SIG_SETMASK, &old, NULL);
 #else /* not HAVE_SIGSUSPEND */
   INTERRUPTABLE_EXTENT
-    (n, (((OS_process_any_status_change ())
+    (n, (((!ignore_status_change && (OS_process_any_status_change ()))
          || ((GET_INT_CODE) != 0))
         ? ((errno = EINTR), (-1))
         : ((UX_pause ()), (0))));