comparison src/process.c @ 69873:2d844bbbccd4

* process.h (struct Lisp_Process): Replace Lisp_Objects `pid', `raw_status_high', and `raw_status_low' with plain integers, and move them to the end of the structure. * alloc.c (allocate_process): Use PSEUDOVECSIZE to initialize the pseudovector's size field so only the Lisp_Object fields get GC'd. * process.c (update_status, make_process, Fdelete_process) (Fprocess_status, list_processes_1, start_process_unwind) (create_process, Fmake_network_process, server_accept_connection) (wait_reading_process_output, send_process, Fprocess_running_child_p) (process_send_signal, proc_encode_coding_system, Fprocess_send_eof) (sigchld_handler, status_notify): Adjust to new non-Lisp fields for `pid' and `raw_status'. (Fprocess_id, Fsignal_process): Same, and additionally use floats when representing PIDs that are larger than most-positive-fixnum.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Sat, 08 Apr 2006 15:07:35 +0000
parents 5633a1931272
children dc4e5cc51e66 81f2d90dee68 65ca8fb66a0d
comparison
equal deleted inserted replaced
69872:f60a24914ee2 69873:2d844bbbccd4
412 static void 412 static void
413 update_status (p) 413 update_status (p)
414 struct Lisp_Process *p; 414 struct Lisp_Process *p;
415 { 415 {
416 union { int i; WAITTYPE wt; } u; 416 union { int i; WAITTYPE wt; } u;
417 u.i = XFASTINT (p->raw_status_low) + (XFASTINT (p->raw_status_high) << 16); 417 eassert (p->raw_status_new);
418 u.i = p->raw_status;
418 p->status = status_convert (u.wt); 419 p->status = status_convert (u.wt);
419 p->raw_status_low = Qnil; 420 p->raw_status_new = 0;
420 p->raw_status_high = Qnil;
421 } 421 }
422 422
423 /* Convert a process status word in Unix format to 423 /* Convert a process status word in Unix format to
424 the list that we use internally. */ 424 the list that we use internally. */
425 425
617 617
618 p = allocate_process (); 618 p = allocate_process ();
619 619
620 XSETINT (p->infd, -1); 620 XSETINT (p->infd, -1);
621 XSETINT (p->outfd, -1); 621 XSETINT (p->outfd, -1);
622 XSETFASTINT (p->pid, 0);
623 XSETFASTINT (p->tick, 0); 622 XSETFASTINT (p->tick, 0);
624 XSETFASTINT (p->update_tick, 0); 623 XSETFASTINT (p->update_tick, 0);
625 p->raw_status_low = Qnil; 624 p->pid = 0;
626 p->raw_status_high = Qnil; 625 p->raw_status_new = 0;
627 p->status = Qrun; 626 p->status = Qrun;
628 p->mark = Fmake_marker (); 627 p->mark = Fmake_marker ();
629 628
630 #ifdef ADAPTIVE_READ_BUFFERING 629 #ifdef ADAPTIVE_READ_BUFFERING
631 p->adaptive_read_buffering = Qnil; 630 p->adaptive_read_buffering = Qnil;
787 register struct Lisp_Process *p; 786 register struct Lisp_Process *p;
788 787
789 process = get_process (process); 788 process = get_process (process);
790 p = XPROCESS (process); 789 p = XPROCESS (process);
791 790
792 p->raw_status_low = Qnil; 791 p->raw_status_new = 0;
793 p->raw_status_high = Qnil;
794 if (NETCONN1_P (p)) 792 if (NETCONN1_P (p))
795 { 793 {
796 p->status = Fcons (Qexit, Fcons (make_number (0), Qnil)); 794 p->status = Fcons (Qexit, Fcons (make_number (0), Qnil));
797 XSETINT (p->tick, ++process_tick); 795 XSETINT (p->tick, ++process_tick);
798 status_notify (p); 796 status_notify (p);
838 836
839 if (NILP (process)) 837 if (NILP (process))
840 return process; 838 return process;
841 839
842 p = XPROCESS (process); 840 p = XPROCESS (process);
843 if (!NILP (p->raw_status_low)) 841 if (p->raw_status_new)
844 update_status (p); 842 update_status (p);
845 status = p->status; 843 status = p->status;
846 if (CONSP (status)) 844 if (CONSP (status))
847 status = XCAR (status); 845 status = XCAR (status);
848 if (NETCONN1_P (p)) 846 if (NETCONN1_P (p))
863 If PROCESS has not yet exited or died, return 0. */) 861 If PROCESS has not yet exited or died, return 0. */)
864 (process) 862 (process)
865 register Lisp_Object process; 863 register Lisp_Object process;
866 { 864 {
867 CHECK_PROCESS (process); 865 CHECK_PROCESS (process);
868 if (!NILP (XPROCESS (process)->raw_status_low)) 866 if (XPROCESS (process)->raw_status_new)
869 update_status (XPROCESS (process)); 867 update_status (XPROCESS (process));
870 if (CONSP (XPROCESS (process)->status)) 868 if (CONSP (XPROCESS (process)->status))
871 return XCAR (XCDR (XPROCESS (process)->status)); 869 return XCAR (XCDR (XPROCESS (process)->status));
872 return make_number (0); 870 return make_number (0);
873 } 871 }
878 For a network connection, this value is nil. */) 876 For a network connection, this value is nil. */)
879 (process) 877 (process)
880 register Lisp_Object process; 878 register Lisp_Object process;
881 { 879 {
882 CHECK_PROCESS (process); 880 CHECK_PROCESS (process);
883 return XPROCESS (process)->pid; 881 return (XPROCESS (process)->pid
882 ? make_fixnum_or_float (XPROCESS (process)->pid)
883 : Qnil);
884 } 884 }
885 885
886 DEFUN ("process-name", Fprocess_name, Sprocess_name, 1, 1, 0, 886 DEFUN ("process-name", Fprocess_name, Sprocess_name, 1, 1, 0,
887 doc: /* Return the name of PROCESS, as a string. 887 doc: /* Return the name of PROCESS, as a string.
888 This is the name of the program invoked in PROCESS, 888 This is the name of the program invoked in PROCESS,
1360 continue; 1360 continue;
1361 1361
1362 Finsert (1, &p->name); 1362 Finsert (1, &p->name);
1363 Findent_to (i_status, minspace); 1363 Findent_to (i_status, minspace);
1364 1364
1365 if (!NILP (p->raw_status_low)) 1365 if (p->raw_status_new)
1366 update_status (p); 1366 update_status (p);
1367 symbol = p->status; 1367 symbol = p->status;
1368 if (CONSP (p->status)) 1368 if (CONSP (p->status))
1369 symbol = XCAR (p->status); 1369 symbol = XCAR (p->status);
1370 1370
1732 { 1732 {
1733 if (!PROCESSP (proc)) 1733 if (!PROCESSP (proc))
1734 abort (); 1734 abort ();
1735 1735
1736 /* Was PROC started successfully? */ 1736 /* Was PROC started successfully? */
1737 if (XINT (XPROCESS (proc)->pid) <= 0) 1737 if (XPROCESS (proc)->pid <= 0)
1738 remove_process (proc); 1738 remove_process (proc);
1739 1739
1740 return Qnil; 1740 return Qnil;
1741 } 1741 }
1742 1742
1943 to recognize an unknown pid as standing for this process. 1943 to recognize an unknown pid as standing for this process.
1944 It is very important not to let this `marker' value stay 1944 It is very important not to let this `marker' value stay
1945 in the table after this function has returned; if it does 1945 in the table after this function has returned; if it does
1946 it might cause call-process to hang and subsequent asynchronous 1946 it might cause call-process to hang and subsequent asynchronous
1947 processes to get their return values scrambled. */ 1947 processes to get their return values scrambled. */
1948 XSETINT (XPROCESS (process)->pid, -1); 1948 XPROCESS (process)->pid = -1;
1949 1949
1950 BLOCK_INPUT; 1950 BLOCK_INPUT;
1951 1951
1952 { 1952 {
1953 /* child_setup must clobber environ on systems with true vfork. 1953 /* child_setup must clobber environ on systems with true vfork.
2134 emacs_close (forkout); 2134 emacs_close (forkout);
2135 } 2135 }
2136 else 2136 else
2137 { 2137 {
2138 /* vfork succeeded. */ 2138 /* vfork succeeded. */
2139 XSETFASTINT (XPROCESS (process)->pid, pid); 2139 XPROCESS (process)->pid = pid;
2140 2140
2141 #ifdef WINDOWSNT 2141 #ifdef WINDOWSNT
2142 register_child (pid, inchannel); 2142 register_child (pid, inchannel);
2143 #endif /* WINDOWSNT */ 2143 #endif /* WINDOWSNT */
2144 2144
3347 p->log = Fplist_get (contact, QClog); 3347 p->log = Fplist_get (contact, QClog);
3348 if (tem = Fplist_get (contact, QCnoquery), !NILP (tem)) 3348 if (tem = Fplist_get (contact, QCnoquery), !NILP (tem))
3349 p->kill_without_query = Qt; 3349 p->kill_without_query = Qt;
3350 if ((tem = Fplist_get (contact, QCstop), !NILP (tem))) 3350 if ((tem = Fplist_get (contact, QCstop), !NILP (tem)))
3351 p->command = Qt; 3351 p->command = Qt;
3352 p->pid = Qnil; 3352 p->pid = 0;
3353 XSETINT (p->infd, inch); 3353 XSETINT (p->infd, inch);
3354 XSETINT (p->outfd, outch); 3354 XSETINT (p->outfd, outch);
3355 if (is_server && socktype == SOCK_STREAM) 3355 if (is_server && socktype == SOCK_STREAM)
3356 p->status = Qlisten; 3356 p->status = Qlisten;
3357 3357
4063 4063
4064 p->buffer = buffer; 4064 p->buffer = buffer;
4065 p->sentinel = ps->sentinel; 4065 p->sentinel = ps->sentinel;
4066 p->filter = ps->filter; 4066 p->filter = ps->filter;
4067 p->command = Qnil; 4067 p->command = Qnil;
4068 p->pid = Qnil; 4068 p->pid = 0;
4069 XSETINT (p->infd, s); 4069 XSETINT (p->infd, s);
4070 XSETINT (p->outfd, s); 4070 XSETINT (p->outfd, s);
4071 p->status = Qrun; 4071 p->status = Qrun;
4072 4072
4073 /* Client processes for accepted connections are not stopped initially. */ 4073 /* Client processes for accepted connections are not stopped initially. */
4363 } 4363 }
4364 } 4364 }
4365 4365
4366 /* Don't wait for output from a non-running process. Just 4366 /* Don't wait for output from a non-running process. Just
4367 read whatever data has already been received. */ 4367 read whatever data has already been received. */
4368 if (wait_proc != 0 && !NILP (wait_proc->raw_status_low)) 4368 if (wait_proc && wait_proc->raw_status_new)
4369 update_status (wait_proc); 4369 update_status (wait_proc);
4370 if (wait_proc != 0 4370 if (wait_proc
4371 && ! EQ (wait_proc->status, Qrun) 4371 && ! EQ (wait_proc->status, Qrun)
4372 && ! EQ (wait_proc->status, Qconnect)) 4372 && ! EQ (wait_proc->status, Qconnect))
4373 { 4373 {
4374 int nread, total_nread = 0; 4374 int nread, total_nread = 0;
4375 4375
4749 else 4749 else
4750 { 4750 {
4751 /* Preserve status of processes already terminated. */ 4751 /* Preserve status of processes already terminated. */
4752 XSETINT (XPROCESS (proc)->tick, ++process_tick); 4752 XSETINT (XPROCESS (proc)->tick, ++process_tick);
4753 deactivate_process (proc); 4753 deactivate_process (proc);
4754 if (!NILP (XPROCESS (proc)->raw_status_low)) 4754 if (XPROCESS (proc)->raw_status_new)
4755 update_status (XPROCESS (proc)); 4755 update_status (XPROCESS (proc));
4756 if (EQ (XPROCESS (proc)->status, Qrun)) 4756 if (EQ (XPROCESS (proc)->status, Qrun))
4757 XPROCESS (proc)->status 4757 XPROCESS (proc)->status
4758 = Fcons (Qexit, Fcons (make_number (256), Qnil)); 4758 = Fcons (Qexit, Fcons (make_number (256), Qnil));
4759 } 4759 }
5286 5286
5287 #ifdef VMS 5287 #ifdef VMS
5288 VMS_PROC_STUFF *vs, *get_vms_process_pointer(); 5288 VMS_PROC_STUFF *vs, *get_vms_process_pointer();
5289 #endif /* VMS */ 5289 #endif /* VMS */
5290 5290
5291 if (! NILP (p->raw_status_low)) 5291 if (p->raw_status_new)
5292 update_status (p); 5292 update_status (p);
5293 if (! EQ (p->status, Qrun)) 5293 if (! EQ (p->status, Qrun))
5294 error ("Process %s not running", SDATA (p->name)); 5294 error ("Process %s not running", SDATA (p->name));
5295 if (XINT (p->outfd) < 0) 5295 if (XINT (p->outfd) < 0)
5296 error ("Output file descriptor of %s is closed", SDATA (p->name)); 5296 error ("Output file descriptor of %s is closed", SDATA (p->name));
5550 signal (SIGPIPE, old_sigpipe); 5550 signal (SIGPIPE, old_sigpipe);
5551 #ifndef VMS 5551 #ifndef VMS
5552 proc = process_sent_to; 5552 proc = process_sent_to;
5553 p = XPROCESS (proc); 5553 p = XPROCESS (proc);
5554 #endif 5554 #endif
5555 p->raw_status_low = Qnil; 5555 p->raw_status_new = 0;
5556 p->raw_status_high = Qnil;
5557 p->status = Fcons (Qexit, Fcons (make_number (256), Qnil)); 5556 p->status = Fcons (Qexit, Fcons (make_number (256), Qnil));
5558 XSETINT (p->tick, ++process_tick); 5557 XSETINT (p->tick, ++process_tick);
5559 deactivate_process (proc); 5558 deactivate_process (proc);
5560 #ifdef VMS 5559 #ifdef VMS
5561 error ("Error writing to process %s; closed it", SDATA (p->name)); 5560 error ("Error writing to process %s; closed it", SDATA (p->name));
5666 error ("Process %s is not active", 5665 error ("Process %s is not active",
5667 SDATA (p->name)); 5666 SDATA (p->name));
5668 5667
5669 gid = emacs_get_tty_pgrp (p); 5668 gid = emacs_get_tty_pgrp (p);
5670 5669
5671 if (gid == XFASTINT (p->pid)) 5670 if (gid == p->pid)
5672 return Qnil; 5671 return Qnil;
5673 return Qt; 5672 return Qt;
5674 } 5673 }
5675 5674
5676 /* send a signal number SIGNO to PROCESS. 5675 /* send a signal number SIGNO to PROCESS.
5713 current_group = Qnil; 5712 current_group = Qnil;
5714 5713
5715 /* If we are using pgrps, get a pgrp number and make it negative. */ 5714 /* If we are using pgrps, get a pgrp number and make it negative. */
5716 if (NILP (current_group)) 5715 if (NILP (current_group))
5717 /* Send the signal to the shell's process group. */ 5716 /* Send the signal to the shell's process group. */
5718 gid = XFASTINT (p->pid); 5717 gid = p->pid;
5719 else 5718 else
5720 { 5719 {
5721 #ifdef SIGNALS_VIA_CHARACTERS 5720 #ifdef SIGNALS_VIA_CHARACTERS
5722 /* If possible, send signals to the entire pgrp 5721 /* If possible, send signals to the entire pgrp
5723 by sending an input character to it. */ 5722 by sending an input character to it. */
5832 gid = emacs_get_tty_pgrp (p); 5831 gid = emacs_get_tty_pgrp (p);
5833 5832
5834 if (gid == -1) 5833 if (gid == -1)
5835 /* If we can't get the information, assume 5834 /* If we can't get the information, assume
5836 the shell owns the tty. */ 5835 the shell owns the tty. */
5837 gid = XFASTINT (p->pid); 5836 gid = p->pid;
5838 5837
5839 /* It is not clear whether anything really can set GID to -1. 5838 /* It is not clear whether anything really can set GID to -1.
5840 Perhaps on some system one of those ioctls can or could do so. 5839 Perhaps on some system one of those ioctls can or could do so.
5841 Or perhaps this is vestigial. */ 5840 Or perhaps this is vestigial. */
5842 if (gid == -1) 5841 if (gid == -1)
5843 no_pgrp = 1; 5842 no_pgrp = 1;
5844 #else /* ! defined (TIOCGPGRP ) */ 5843 #else /* ! defined (TIOCGPGRP ) */
5845 /* Can't select pgrps on this system, so we know that 5844 /* Can't select pgrps on this system, so we know that
5846 the child itself heads the pgrp. */ 5845 the child itself heads the pgrp. */
5847 gid = XFASTINT (p->pid); 5846 gid = p->pid;
5848 #endif /* ! defined (TIOCGPGRP ) */ 5847 #endif /* ! defined (TIOCGPGRP ) */
5849 5848
5850 /* If current_group is lambda, and the shell owns the terminal, 5849 /* If current_group is lambda, and the shell owns the terminal,
5851 don't send any signal. */ 5850 don't send any signal. */
5852 if (EQ (current_group, Qlambda) && gid == XFASTINT (p->pid)) 5851 if (EQ (current_group, Qlambda) && gid == p->pid)
5853 return; 5852 return;
5854 } 5853 }
5855 5854
5856 switch (signo) 5855 switch (signo)
5857 { 5856 {
5858 #ifdef SIGCONT 5857 #ifdef SIGCONT
5859 case SIGCONT: 5858 case SIGCONT:
5860 p->raw_status_low = Qnil; 5859 p->raw_status_new = 0;
5861 p->raw_status_high = Qnil;
5862 p->status = Qrun; 5860 p->status = Qrun;
5863 XSETINT (p->tick, ++process_tick); 5861 XSETINT (p->tick, ++process_tick);
5864 if (!nomsg) 5862 if (!nomsg)
5865 status_notify (NULL); 5863 status_notify (NULL);
5866 break; 5864 break;
5875 send_process (proc, "\031", 1, Qnil); /* ^Y */ 5873 send_process (proc, "\031", 1, Qnil); /* ^Y */
5876 goto whoosh; 5874 goto whoosh;
5877 #endif 5875 #endif
5878 case SIGKILL: 5876 case SIGKILL:
5879 #ifdef VMS 5877 #ifdef VMS
5880 sys$forcex (&(XFASTINT (p->pid)), 0, 1); 5878 sys$forcex (&(p->pid), 0, 1);
5881 whoosh: 5879 whoosh:
5882 #endif 5880 #endif
5883 flush_pending_output (XINT (p->infd)); 5881 flush_pending_output (XINT (p->infd));
5884 break; 5882 break;
5885 } 5883 }
5887 /* If we don't have process groups, send the signal to the immediate 5885 /* If we don't have process groups, send the signal to the immediate
5888 subprocess. That isn't really right, but it's better than any 5886 subprocess. That isn't really right, but it's better than any
5889 obvious alternative. */ 5887 obvious alternative. */
5890 if (no_pgrp) 5888 if (no_pgrp)
5891 { 5889 {
5892 kill (XFASTINT (p->pid), signo); 5890 kill (p->pid, signo);
5893 return; 5891 return;
5894 } 5892 }
5895 5893
5896 /* gid may be a pid, or minus a pgrp's number */ 5894 /* gid may be a pid, or minus a pgrp's number */
5897 #ifdef TIOCSIGSEND 5895 #ifdef TIOCSIGSEND
5900 if (ioctl (XINT (p->infd), TIOCSIGSEND, signo) == -1) 5898 if (ioctl (XINT (p->infd), TIOCSIGSEND, signo) == -1)
5901 EMACS_KILLPG (gid, signo); 5899 EMACS_KILLPG (gid, signo);
5902 } 5900 }
5903 else 5901 else
5904 { 5902 {
5905 gid = - XFASTINT (p->pid); 5903 gid = - p->pid;
5906 kill (gid, signo); 5904 kill (gid, signo);
5907 } 5905 }
5908 #else /* ! defined (TIOCSIGSEND) */ 5906 #else /* ! defined (TIOCSIGSEND) */
5909 EMACS_KILLPG (gid, signo); 5907 EMACS_KILLPG (gid, signo);
5910 #endif /* ! defined (TIOCSIGSEND) */ 5908 #endif /* ! defined (TIOCSIGSEND) */
6020 this Emacs. 6018 this Emacs.
6021 SIGCODE may be an integer, or a symbol whose name is a signal name. */) 6019 SIGCODE may be an integer, or a symbol whose name is a signal name. */)
6022 (process, sigcode) 6020 (process, sigcode)
6023 Lisp_Object process, sigcode; 6021 Lisp_Object process, sigcode;
6024 { 6022 {
6025 Lisp_Object pid; 6023 pid_t pid;
6026 6024
6027 if (INTEGERP (process)) 6025 if (INTEGERP (process))
6028 { 6026 {
6029 pid = process; 6027 pid = XINT (process);
6028 goto got_it;
6029 }
6030
6031 if (FLOATP (process))
6032 {
6033 pid = (pid_t) XFLOAT (process);
6030 goto got_it; 6034 goto got_it;
6031 } 6035 }
6032 6036
6033 if (STRINGP (process)) 6037 if (STRINGP (process))
6034 { 6038 {
6035 Lisp_Object tem; 6039 Lisp_Object tem;
6036 if (tem = Fget_process (process), NILP (tem)) 6040 if (tem = Fget_process (process), NILP (tem))
6037 { 6041 {
6038 pid = Fstring_to_number (process, make_number (10)); 6042 pid = XINT (Fstring_to_number (process, make_number (10)));
6039 if (XINT (pid) != 0) 6043 if (pid > 0)
6040 goto got_it; 6044 goto got_it;
6041 } 6045 }
6042 process = tem; 6046 process = tem;
6043 } 6047 }
6044 else 6048 else
6047 if (NILP (process)) 6051 if (NILP (process))
6048 return process; 6052 return process;
6049 6053
6050 CHECK_PROCESS (process); 6054 CHECK_PROCESS (process);
6051 pid = XPROCESS (process)->pid; 6055 pid = XPROCESS (process)->pid;
6052 if (!INTEGERP (pid) || XINT (pid) <= 0) 6056 if (pid <= 0)
6053 error ("Cannot signal process %s", SDATA (XPROCESS (process)->name)); 6057 error ("Cannot signal process %s", SDATA (XPROCESS (process)->name));
6054 6058
6055 got_it: 6059 got_it:
6056 6060
6057 #define handle_signal(NAME, VALUE) \ 6061 #define handle_signal(NAME, VALUE) \
6166 error ("Undefined signal name %s", name); 6170 error ("Undefined signal name %s", name);
6167 } 6171 }
6168 6172
6169 #undef handle_signal 6173 #undef handle_signal
6170 6174
6171 return make_number (kill (XINT (pid), XINT (sigcode))); 6175 return make_number (kill (pid, XINT (sigcode)));
6172 } 6176 }
6173 6177
6174 DEFUN ("process-send-eof", Fprocess_send_eof, Sprocess_send_eof, 0, 1, 0, 6178 DEFUN ("process-send-eof", Fprocess_send_eof, Sprocess_send_eof, 0, 1, 0,
6175 doc: /* Make PROCESS see end-of-file in its input. 6179 doc: /* Make PROCESS see end-of-file in its input.
6176 EOF comes after any text already sent to it. 6180 EOF comes after any text already sent to it.
6190 6194
6191 proc = get_process (process); 6195 proc = get_process (process);
6192 coding = proc_encode_coding_system[XINT (XPROCESS (proc)->outfd)]; 6196 coding = proc_encode_coding_system[XINT (XPROCESS (proc)->outfd)];
6193 6197
6194 /* Make sure the process is really alive. */ 6198 /* Make sure the process is really alive. */
6195 if (! NILP (XPROCESS (proc)->raw_status_low)) 6199 if (XPROCESS (proc)->raw_status_new)
6196 update_status (XPROCESS (proc)); 6200 update_status (XPROCESS (proc));
6197 if (! EQ (XPROCESS (proc)->status, Qrun)) 6201 if (! EQ (XPROCESS (proc)->status, Qrun))
6198 error ("Process %s not running", SDATA (XPROCESS (proc)->name)); 6202 error ("Process %s not running", SDATA (XPROCESS (proc)->name));
6199 6203
6200 if (CODING_REQUIRE_FLUSHING (coding)) 6204 if (CODING_REQUIRE_FLUSHING (coding))
6215 #ifdef HAVE_SHUTDOWN 6219 #ifdef HAVE_SHUTDOWN
6216 /* If this is a network connection, or socketpair is used 6220 /* If this is a network connection, or socketpair is used
6217 for communication with the subprocess, call shutdown to cause EOF. 6221 for communication with the subprocess, call shutdown to cause EOF.
6218 (In some old system, shutdown to socketpair doesn't work. 6222 (In some old system, shutdown to socketpair doesn't work.
6219 Then we just can't win.) */ 6223 Then we just can't win.) */
6220 if (NILP (XPROCESS (proc)->pid) 6224 if (XPROCESS (proc)->pid == 0
6221 || XINT (XPROCESS (proc)->outfd) == XINT (XPROCESS (proc)->infd)) 6225 || XINT (XPROCESS (proc)->outfd) == XINT (XPROCESS (proc)->infd))
6222 shutdown (XINT (XPROCESS (proc)->outfd), 1); 6226 shutdown (XINT (XPROCESS (proc)->outfd), 1);
6223 /* In case of socketpair, outfd == infd, so don't close it. */ 6227 /* In case of socketpair, outfd == infd, so don't close it. */
6224 if (XINT (XPROCESS (proc)->outfd) != XINT (XPROCESS (proc)->infd)) 6228 if (XINT (XPROCESS (proc)->outfd) != XINT (XPROCESS (proc)->infd))
6225 emacs_close (XINT (XPROCESS (proc)->outfd)); 6229 emacs_close (XINT (XPROCESS (proc)->outfd));
6352 p = 0; 6356 p = 0;
6353 for (tail = Vprocess_alist; GC_CONSP (tail); tail = XCDR (tail)) 6357 for (tail = Vprocess_alist; GC_CONSP (tail); tail = XCDR (tail))
6354 { 6358 {
6355 proc = XCDR (XCAR (tail)); 6359 proc = XCDR (XCAR (tail));
6356 p = XPROCESS (proc); 6360 p = XPROCESS (proc);
6357 if (GC_EQ (p->childp, Qt) && XINT (p->pid) == pid) 6361 if (GC_EQ (p->childp, Qt) && p->pid == pid)
6358 break; 6362 break;
6359 p = 0; 6363 p = 0;
6360 } 6364 }
6361 6365
6362 /* Look for an asynchronous process whose pid hasn't been filled 6366 /* Look for an asynchronous process whose pid hasn't been filled
6364 if (p == 0) 6368 if (p == 0)
6365 for (tail = Vprocess_alist; GC_CONSP (tail); tail = XCDR (tail)) 6369 for (tail = Vprocess_alist; GC_CONSP (tail); tail = XCDR (tail))
6366 { 6370 {
6367 proc = XCDR (XCAR (tail)); 6371 proc = XCDR (XCAR (tail));
6368 p = XPROCESS (proc); 6372 p = XPROCESS (proc);
6369 if (GC_INTEGERP (p->pid) && XINT (p->pid) == -1) 6373 if (p->pid == -1)
6370 break; 6374 break;
6371 p = 0; 6375 p = 0;
6372 } 6376 }
6373 6377
6374 /* Change the status of the process that was found. */ 6378 /* Change the status of the process that was found. */
6377 union { int i; WAITTYPE wt; } u; 6381 union { int i; WAITTYPE wt; } u;
6378 int clear_desc_flag = 0; 6382 int clear_desc_flag = 0;
6379 6383
6380 XSETINT (p->tick, ++process_tick); 6384 XSETINT (p->tick, ++process_tick);
6381 u.wt = w; 6385 u.wt = w;
6382 XSETINT (p->raw_status_low, u.i & 0xffff); 6386 p->raw_status = u.i;
6383 XSETINT (p->raw_status_high, u.i >> 16); 6387 p->raw_status_new = 1;
6384 6388
6385 /* If process has terminated, stop waiting for its output. */ 6389 /* If process has terminated, stop waiting for its output. */
6386 if ((WIFSIGNALED (w) || WIFEXITED (w)) 6390 if ((WIFSIGNALED (w) || WIFEXITED (w))
6387 && XINT (p->infd) >= 0) 6391 && XINT (p->infd) >= 0)
6388 clear_desc_flag = 1; 6392 clear_desc_flag = 1;
6575 && read_process_output (proc, XINT (p->infd)) > 0); 6579 && read_process_output (proc, XINT (p->infd)) > 0);
6576 6580
6577 buffer = p->buffer; 6581 buffer = p->buffer;
6578 6582
6579 /* Get the text to use for the message. */ 6583 /* Get the text to use for the message. */
6580 if (!NILP (p->raw_status_low)) 6584 if (p->raw_status_new)
6581 update_status (p); 6585 update_status (p);
6582 msg = status_message (p); 6586 msg = status_message (p);
6583 6587
6584 /* If process is terminated, deactivate it or delete it. */ 6588 /* If process is terminated, deactivate it or delete it. */
6585 symbol = p->status; 6589 symbol = p->status;