Add an ignore_status_change parameter to OS_pause for SMP-IDLE.
authorMatt Birkholz <puck@birchwood-abbey.net>
Tue, 5 Jan 2016 22:40:55 +0000 (15:40 -0700)
committerMatt Birkholz <puck@birchwood-abbey.net>
Tue, 5 Jan 2016 22:40:55 +0000 (15:40 -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 9c35d0b6305631b5d36d3d05210c6ebb8e17f3ea..0d9acf5b6a7b376a2a0f0479dbba1a5adfeadfdc 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 547e7ffa582066c427580cf53b2116caf0b6cf49..64005bdc8d1945278dac08f06e143a989f5a3dd8 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 fc5f050ce7a7c37ab7a339011aa2a855238c6dba..4bef9dc650e70e8a43c4b0cab0b998b901b52f63 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 6a13a998b3506fb8bb0614ff3ce2c22136be5248..872f3833f7104966f0abc2e1cd833a9fc435d430 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 6ee00f59b189d89c5a06401b9991fa2241937329..12e9ef3cf30e83a9fd3749b7fc9425ae64e2c97e 100644 (file)
@@ -853,7 +853,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;
@@ -861,9 +861,9 @@ 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 (pending_interrupts_p ())
+  else if ((GET_INT_CODE) != 0)
     n = SELECT_INTERRUPT;
   else
     {
@@ -876,8 +876,8 @@ OS_pause (void)
   UX_sigprocmask (SIG_SETMASK, &old, NULL);
 #else /* not HAVE_SIGSUSPEND */
   INTERRUPTABLE_EXTENT
-    (n, (((OS_process_any_status_change ())
-         || (pending_interrupts_p ()))
+    (n, (((!ignore_status_change && (OS_process_any_status_change ()))
+         || ((GET_INT_CODE) != 0))
         ? ((errno = EINTR), (-1))
         : ((UX_pause ()), (0))));
   if (OS_process_any_status_change())