(Fopen_network_stream): Call bind_polling_period; later unbind the binding.
authorRichard M. Stallman <rms@gnu.org>
Fri, 13 May 1994 08:31:05 +0000 (08:31 +0000)
committerRichard M. Stallman <rms@gnu.org>
Fri, 13 May 1994 08:31:05 +0000 (08:31 +0000)
(POLL_FOR_INPUT): Define, if appropriate.

src/process.c

index b7bca47..44a7d84 100644 (file)
@@ -211,6 +211,12 @@ static int update_tick;
 #define FD_ZERO(p) (*(p) = 0)
 #endif /* no FD_SET */
 
+/* If we support X Windows, turn on the code to poll periodically
+   to detect C-g.  It isn't actually used when doing interrupt input.  */
+#ifdef HAVE_X_WINDOWS
+#define POLL_FOR_INPUT
+#endif
+
 /* Mask of bits indicating the descriptors that we wait for input on */
 
 static SELECT_TYPE input_wait_mask;
@@ -1485,11 +1491,12 @@ Fourth arg SERVICE is name of the service desired, or an integer\n\
   struct hostent host_info_fixed;
   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
   int retry = 0;
+  int count = specpdl_ptr - specpdl;
 
   GCPRO4 (name, buffer, host, service);
   CHECK_STRING (name, 0);
   CHECK_STRING (host, 0);
-  if (XTYPE(service) == Lisp_Int)
+  if (XTYPE (service) == Lisp_Int)
     port = htons ((unsigned short) XINT (service));
   else
     {
@@ -1543,6 +1550,13 @@ Fourth arg SERVICE is name of the service desired, or an integer\n\
   if (interrupt_input)
     unrequest_sigio ();
 
+  /* Slow down polling to every ten seconds.
+     Some kernels have a bug which causes retrying connect to fail
+     after a connect.  */
+#ifdef POLL_FOR_INPUT
+  bind_polling_period (10);
+#endif
+
  loop:
   if (connect (s, (struct sockaddr *) &address, sizeof address) == -1
       && errno != EISCONN)
@@ -1567,6 +1581,10 @@ Fourth arg SERVICE is name of the service desired, or an integer\n\
                         Fcons (host, Fcons (name, Qnil)));
     }
 
+#ifdef POLL_FOR_INPUT
+  unbind_to (count, Qnil);
+#endif
+
   if (interrupt_input)
     request_sigio ();