gtk: Vanquish spinning gtk-thread evil (again).
authorMatt Birkholz <matt@birkholz.chandler.az.us>
Fri, 19 Oct 2012 18:48:59 +0000 (11:48 -0700)
committerMatt Birkholz <matt@birkholz.chandler.az.us>
Fri, 19 Oct 2012 18:48:59 +0000 (11:48 -0700)
tests/runtime/test-gtk spins like crazy again.  With a gtk-thread
always ready to run and no thread waiting for io, wait-for-io is never
called and maybe-signal-io-thread-events never blocks.  Unfortunately
test-select-registry always returned INTERRUPT for non-blocking
selects with an empty registry.  It needs to return PROCESS-STATUS-
CHANGE when there is a pending process status change so that handle-
subprocess-status-change runs.  Thus OS_pause got a new argument:
blockp.  In uxio.c it can call OS_process_any_status_change and
return PROCESS-STATUS-CHANGE when necessary.

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

index 3a4781ff2b9b9aa93a80d870cf3b74a77f9e2137..727a9255590d2600340143d2eee123c91512bb79 100644 (file)
@@ -848,7 +848,7 @@ OS_test_select_registry (select_registry_t registry, int blockp)
 }
 
 int
-OS_pause (void)
+OS_pause (int blockp)
 {
   /* Wait-for-io must spin. */
   return
index 5511c057e836f445afe4ac1e83e715744095a1fe..59f2de1a27ef5ce73daea7c25e0d258daff8a284 100644 (file)
@@ -566,7 +566,7 @@ OS_test_select_registry (select_registry_t registry, int blockp)
 }
 
 int
-OS_pause (void)
+OS_pause (int blockp)
 {
   /* Wait-for-io must spin. */
   return
index 3265f763616942dedb6f8e2b60f353a0fcf524fa..f75a4b17d91976211f45ecce45a2b6254f4b0ba4 100644 (file)
@@ -112,7 +112,7 @@ 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 (int blockp);
 extern select_registry_t arg_select_registry (int arg_number);
 
 #endif /* SCM_OSIO_H */
index d9528682371c07eaa07efa655a08d63722f7bdc4..c35ade664b743d62d665f63812918911d555fe62 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)
+             ? (OS_pause (blockp))
              : (OS_test_select_registry (r, blockp)));
     if (result > 0)
       {
index d8af4a2ad57f146d43ce5cf2fa53d5342db3d034..35c8db642be7e2f7c82ebaed095788379b23eb7a 100644 (file)
@@ -863,8 +863,8 @@ OS_test_select_descriptor (int fd, int blockp, unsigned int mode)
 
 #endif /* not HAVE_POLL */
 
-int
-OS_pause (void)
+static int
+safe_pause (void)
 {
 #ifdef HAVE_SIGSUSPEND
   sigset_t old, new;
@@ -894,3 +894,16 @@ OS_pause (void)
      : SELECT_INTERRUPT);
 #endif
 }
+
+int
+OS_pause (int blockp)
+{
+  if (!blockp)
+    {
+      return ((OS_process_any_status_change ())
+             ? SELECT_PROCESS_STATUS_CHANGE
+             : SELECT_INTERRUPT);
+    }
+  else
+    return (safe_pause ());
+}