]> code.delx.au - gnu-emacs/blobdiff - src/process.c
(Fgarbage_collect): Update call to truncate_undo_list.
[gnu-emacs] / src / process.c
index d20290813e146723f46aecd5c5b4df0a4e6ad940..ad4cf8f8546421e471ae5bf12b32fc58db57c63b 100644 (file)
@@ -310,6 +310,7 @@ static SELECT_TYPE non_keyboard_wait_mask;
 
 static SELECT_TYPE non_process_wait_mask;
 
+#ifdef NON_BLOCKING_CONNECT
 /* Mask of bits indicating the descriptors that we wait for connect to
    complete on.  Once they complete, they are removed from this mask
    and added to the input_wait_mask and non_keyboard_wait_mask.  */
@@ -319,6 +320,11 @@ static SELECT_TYPE connect_wait_mask;
 /* Number of bits set in connect_wait_mask.  */
 static int num_pending_connects;
 
+#define IF_NON_BLOCKING_CONNECT(s) s
+#else
+#define IF_NON_BLOCKING_CONNECT(s)
+#endif
+
 /* The largest descriptor currently in use for a process object.  */
 static int max_process_desc;
 
@@ -2716,7 +2722,6 @@ usage: (make-network-process &rest ARGS)  */)
   int xerrno = 0;
   int s = -1, outch, inch;
   struct gcpro gcpro1;
-  int retry = 0;
   int count = SPECPDL_INDEX ();
   int count1;
   Lisp_Object QCaddress;  /* one of QClocal or QCremote */
@@ -3017,6 +3022,8 @@ usage: (make-network-process &rest ARGS)  */)
     {
       int optn, optbits;
 
+    retry_connect:
+
       s = socket (lres->ai_family, lres->ai_socktype, lres->ai_protocol);
       if (s < 0)
        {
@@ -3095,8 +3102,6 @@ usage: (make-network-process &rest ARGS)  */)
          break;
        }
 
-    retry_connect:
-
       immediate_quit = 1;
       QUIT;
 
@@ -3138,22 +3143,13 @@ usage: (make-network-process &rest ARGS)  */)
 
       immediate_quit = 0;
 
-      if (xerrno == EINTR)
-       goto retry_connect;
-      if (xerrno == EADDRINUSE && retry < 20)
-       {
-         /* A delay here is needed on some FreeBSD systems,
-            and it is harmless, since this retrying takes time anyway
-            and should be infrequent.  */
-         Fsleep_for (make_number (1), Qnil);
-         retry++;
-         goto retry_connect;
-       }
-
       /* Discard the unwind protect closing S.  */
       specpdl_ptr = specpdl + count1;
       emacs_close (s);
       s = -1;
+
+      if (xerrno == EINTR)
+       goto retry_connect;
     }
 
   if (s >= 0)
@@ -3672,12 +3668,14 @@ deactivate_process (proc)
       chan_process[inchannel] = Qnil;
       FD_CLR (inchannel, &input_wait_mask);
       FD_CLR (inchannel, &non_keyboard_wait_mask);
+#ifdef NON_BLOCKING_CONNECT
       if (FD_ISSET (inchannel, &connect_wait_mask))
        {
          FD_CLR (inchannel, &connect_wait_mask);
          if (--num_pending_connects < 0)
            abort ();
        }
+#endif
       if (inchannel == max_process_desc)
        {
          int i;
@@ -4038,8 +4036,11 @@ wait_reading_process_output (time_limit, microsecs, read_kbd, do_display,
 {
   register int channel, nfds;
   SELECT_TYPE Available;
+#ifdef NON_BLOCKING_CONNECT
   SELECT_TYPE Connecting;
-  int check_connect, check_delay, no_avail;
+  int check_connect;
+#endif
+  int check_delay, no_avail;
   int xerrno;
   Lisp_Object proc;
   EMACS_TIME timeout, end_time;
@@ -4050,7 +4051,9 @@ wait_reading_process_output (time_limit, microsecs, read_kbd, do_display,
   int saved_waiting_for_user_input_p = waiting_for_user_input_p;
 
   FD_ZERO (&Available);
+#ifdef NON_BLOCKING_CONNECT
   FD_ZERO (&Connecting);
+#endif
 
   /* If wait_proc is a process to watch, set wait_channel accordingly.  */
   if (wait_proc != NULL)
@@ -4187,7 +4190,10 @@ wait_reading_process_output (time_limit, microsecs, read_kbd, do_display,
         timeout to get our attention.  */
       if (update_tick != process_tick && do_display)
        {
-         SELECT_TYPE Atemp, Ctemp;
+         SELECT_TYPE Atemp;
+#ifdef NON_BLOCKING_CONNECT
+         SELECT_TYPE Ctemp;
+#endif
 
          Atemp = input_wait_mask;
 #if 0
@@ -4199,11 +4205,16 @@ wait_reading_process_output (time_limit, microsecs, read_kbd, do_display,
          */
           FD_CLR (0, &Atemp);
 #endif
-         Ctemp = connect_wait_mask;
+         IF_NON_BLOCKING_CONNECT (Ctemp = connect_wait_mask);
+
          EMACS_SET_SECS_USECS (timeout, 0, 0);
          if ((select (max (max_process_desc, max_keyboard_desc) + 1,
                       &Atemp,
+#ifdef NON_BLOCKING_CONNECT
                       (num_pending_connects > 0 ? &Ctemp : (SELECT_TYPE *)0),
+#else
+                      (SELECT_TYPE *)0,
+#endif
                       (SELECT_TYPE *)0, &timeout)
               <= 0))
            {
@@ -4263,12 +4274,14 @@ wait_reading_process_output (time_limit, microsecs, read_kbd, do_display,
          if (XINT (wait_proc->infd) < 0)  /* Terminated */
            break;
          FD_SET (XINT (wait_proc->infd), &Available);
-         check_connect = check_delay = 0;
+         check_delay = 0;
+         IF_NON_BLOCKING_CONNECT (check_connect = 0);
        }
       else if (!NILP (wait_for_cell))
        {
          Available = non_process_wait_mask;
-         check_connect = check_delay = 0;
+         check_delay = 0;
+         IF_NON_BLOCKING_CONNECT (check_connect = 0);
        }
       else
        {
@@ -4276,7 +4289,7 @@ wait_reading_process_output (time_limit, microsecs, read_kbd, do_display,
            Available = non_keyboard_wait_mask;
          else
            Available = input_wait_mask;
-         check_connect = (num_pending_connects > 0);
+         IF_NON_BLOCKING_CONNECT (check_connect = (num_pending_connects > 0));
          check_delay = wait_channel >= 0 ? 0 : process_output_delay_count;
        }
 
@@ -4301,8 +4314,10 @@ wait_reading_process_output (time_limit, microsecs, read_kbd, do_display,
        }
       else
        {
+#ifdef NON_BLOCKING_CONNECT
          if (check_connect)
            Connecting = connect_wait_mask;
+#endif
 
 #ifdef ADAPTIVE_READ_BUFFERING
          if (process_output_skip && check_delay > 0)
@@ -4333,7 +4348,11 @@ wait_reading_process_output (time_limit, microsecs, read_kbd, do_display,
 
          nfds = select (max (max_process_desc, max_keyboard_desc) + 1,
                         &Available,
+#ifdef NON_BLOCKING_CONNECT
                         (check_connect ? &Connecting : (SELECT_TYPE *)0),
+#else
+                        (SELECT_TYPE *)0,
+#endif
                         (SELECT_TYPE *)0, &timeout);
        }
 
@@ -4389,7 +4408,7 @@ wait_reading_process_output (time_limit, microsecs, read_kbd, do_display,
       if (no_avail)
        {
          FD_ZERO (&Available);
-         check_connect = 0;
+         IF_NON_BLOCKING_CONNECT (check_connect = 0);
        }
 
 #if defined(sun) && !defined(USG5_4)
@@ -5085,6 +5104,7 @@ Lisp_Object process_sent_to;
 SIGTYPE
 send_process_trap ()
 {
+  SIGNAL_THREAD_CHECK (SIGPIPE);
 #ifdef BSD4_1
   sigrelse (SIGPIPE);
   sigrelse (SIGALRM);
@@ -5203,6 +5223,7 @@ send_process (proc, buf, len, object)
       object = p->encoding_buf;
       encode_coding (coding, (char *) buf, SDATA (object),
                     len, SBYTES (object));
+      coding_free_composition_data (coding);
       len = coding->produced;
       buf = SDATA (object);
     }
@@ -6126,6 +6147,8 @@ sigchld_handler (signo)
   register struct Lisp_Process *p;
   extern EMACS_TIME *input_available_clear_time;
 
+  SIGNAL_THREAD_CHECK (signo);
+
 #ifdef BSD4_1
   extern int sigheld;
   sigheld |= sigbit (SIGCHLD);
@@ -6627,6 +6650,11 @@ init_process ()
   FD_ZERO (&non_process_wait_mask);
   max_process_desc = 0;
 
+#ifdef NON_BLOCKING_CONNECT
+  FD_ZERO (&connect_wait_mask);
+  num_pending_connects = 0;
+#endif
+
 #ifdef ADAPTIVE_READ_BUFFERING
   process_output_delay_count = 0;
   process_output_skip = 0;