changeset 82814:f0c0222ef990

[MAC_OSX] (select_and_poll_event, sys_select): Fix last changes.
author YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
date Fri, 24 Aug 2007 08:51:00 +0000
parents 56aa3ad4741d
children 688f628e46b6
files src/mac.c
diffstat 1 files changed, 26 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/mac.c	Fri Aug 24 07:10:53 2007 +0000
+++ b/src/mac.c	Fri Aug 24 08:51:00 2007 +0000
@@ -4989,8 +4989,8 @@
       SELECT_TIMEOUT_THRESHOLD_RUNLOOP seconds).
       -> Create CFSocket for each socket and add it into the current
          event RunLoop so that the current event loop gets quit when
-         the socket becomes ready.  Then ReceiveNextEvent can wait for
-         both kinds of inputs.
+         the socket becomes ready.  Then CFRunLoopRunInMode can wait
+         for both kinds of inputs.
    4. Otherwise.
       -> Periodically poll the window input channel while repeatedly
          executing `select' with a short timeout
@@ -5029,32 +5029,51 @@
      ? (EMACS_SECS (*timeout) * kEventDurationSecond
 	+ EMACS_USECS (*timeout) * kEventDurationMicrosecond)
      : kEventDurationForever);
+  SELECT_TYPE orfds, owfds, oefds;
+
+  if (timeout == NULL)
+    {
+      if (rfds) orfds = *rfds;
+      if (wfds) owfds = *wfds;
+      if (efds) oefds = *efds;
+    }
 
   /* Try detect_input_pending before CFRunLoopRunInMode in the same
      BLOCK_INPUT block, in case that some input has already been read
      asynchronously.  */
   BLOCK_INPUT;
-  do
+  while (1)
     {
       if (detect_input_pending ())
 	break;
 
       EMACS_SET_SECS_USECS (select_timeout, 0, 0);
       r = select (nfds, rfds, wfds, efds, &select_timeout);
+      if (r != 0)
+	break;
+
       if (timeoutval == 0.0)
 	timedout_p = 1;
-      else if (r == 0)
+      else
 	{
 #if USE_CG_DRAWING
 	  mac_prepare_for_quickdraw (NULL);
 #endif
 	  if (CFRunLoopRunInMode (kCFRunLoopDefaultMode,
-				  timeoutval >= 0 ? timeoutval : 10000.0, true)
+				  timeoutval >= 0 ? timeoutval : 100000, true)
 	      == kCFRunLoopRunTimedOut)
 	    timedout_p = 1;
 	}
+
+      if (timeout == NULL && timedout_p)
+	{
+	  if (rfds) *rfds = orfds;
+	  if (wfds) *wfds = owfds;
+	  if (efds) *efds = oefds;
+	}
+      else
+	break;
     }
-  while (timeoutval < 0 && timedout_p);
   UNBLOCK_INPUT;
 
   if (r != 0)
@@ -5181,7 +5200,7 @@
 	  mac_prepare_for_quickdraw (NULL);
 #endif
 	  if (CFRunLoopRunInMode (kCFRunLoopDefaultMode,
-				  timeoutval >= 0 ? timeoutval : 10000.0, true)
+				  timeoutval >= 0 ? timeoutval : 100000, true)
 	      == kCFRunLoopRunTimedOut)
 	    timedout_p = 1;