comparison src/process.c @ 83560:738ce3540ffb

Merged from emacs@sv.gnu.org Patches applied: * emacs@sv.gnu.org/emacs--devo--0--patch-660 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-661 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-662 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-663 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-664 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-665 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-666 Fix read-only prompt problem in isearch * emacs@sv.gnu.org/emacs--devo--0--patch-667 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-668 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-669 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-670 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-671 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-672 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-673 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-206 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-207 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-208 Update from CVS git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-600
author Karoly Lorentey <karoly@lorentey.hu>
date Sun, 22 Apr 2007 12:12:29 +0000
parents edf631bdbb7a 2fb8fb4a9bab
children dc002877ce12
comparison
equal deleted inserted replaced
83559:edf631bdbb7a 83560:738ce3540ffb
815 { 815 {
816 #ifdef SIGCHLD 816 #ifdef SIGCHLD
817 Lisp_Object symbol; 817 Lisp_Object symbol;
818 /* Assignment to EMACS_INT stops GCC whining about limited range 818 /* Assignment to EMACS_INT stops GCC whining about limited range
819 of data type. */ 819 of data type. */
820 EMACS_INT pid = p->pid;; 820 EMACS_INT pid = p->pid;
821 821
822 /* No problem storing the pid here, as it is still in Vprocess_alist. */ 822 /* No problem storing the pid here, as it is still in Vprocess_alist. */
823 deleted_pid_list = Fcons (make_fixnum_or_float (pid), 823 deleted_pid_list = Fcons (make_fixnum_or_float (pid),
824 /* GC treated elements set to nil. */ 824 /* GC treated elements set to nil. */
825 Fdelq (Qnil, deleted_pid_list)); 825 Fdelq (Qnil, deleted_pid_list));
828 update_status (p); 828 update_status (p);
829 symbol = p->status; 829 symbol = p->status;
830 if (CONSP (p->status)) 830 if (CONSP (p->status))
831 symbol = XCAR (p->status); 831 symbol = XCAR (p->status);
832 if (EQ (symbol, Qsignal) || EQ (symbol, Qexit)) 832 if (EQ (symbol, Qsignal) || EQ (symbol, Qexit))
833 Fdelete (make_fixnum_or_float (pid), deleted_pid_list); 833 deleted_pid_list
834 = Fdelete (make_fixnum_or_float (pid), deleted_pid_list);
834 else 835 else
835 #endif 836 #endif
836 { 837 {
837 Fkill_process (process, Qnil); 838 Fkill_process (process, Qnil);
838 /* Do this now, since remove_process will make sigchld_handler do nothing. */ 839 /* Do this now, since remove_process will make sigchld_handler do nothing. */
1816 create_process (process, new_argv, current_dir) 1817 create_process (process, new_argv, current_dir)
1817 Lisp_Object process; 1818 Lisp_Object process;
1818 char **new_argv; 1819 char **new_argv;
1819 Lisp_Object current_dir; 1820 Lisp_Object current_dir;
1820 { 1821 {
1821 int pid, inchannel, outchannel; 1822 int inchannel, outchannel;
1823 pid_t pid;
1822 int sv[2]; 1824 int sv[2];
1823 #ifdef POSIX_SIGNALS 1825 #ifdef POSIX_SIGNALS
1824 sigset_t procmask; 1826 sigset_t procmask;
1825 sigset_t blocked; 1827 sigset_t blocked;
1826 struct sigaction sigint_action; 1828 struct sigaction sigint_action;
3337 conv_sockaddr_to_lisp (&sa1, len1)); 3339 conv_sockaddr_to_lisp (&sa1, len1));
3338 } 3340 }
3339 #endif 3341 #endif
3340 } 3342 }
3341 3343
3344 immediate_quit = 0;
3345
3342 #ifdef HAVE_GETADDRINFO 3346 #ifdef HAVE_GETADDRINFO
3343 if (res != &ai) 3347 if (res != &ai)
3344 freeaddrinfo (res); 3348 {
3345 #endif 3349 BLOCK_INPUT;
3346 3350 freeaddrinfo (res);
3347 immediate_quit = 0; 3351 UNBLOCK_INPUT;
3352 }
3353 #endif
3348 3354
3349 /* Discard the unwind protect for closing S, if any. */ 3355 /* Discard the unwind protect for closing S, if any. */
3350 specpdl_ptr = specpdl + count1; 3356 specpdl_ptr = specpdl + count1;
3351 3357
3352 /* Unwind bind_polling_period and request_sigio. */ 3358 /* Unwind bind_polling_period and request_sigio. */
6489 sigheld |= sigbit (SIGCHLD); 6495 sigheld |= sigbit (SIGCHLD);
6490 #endif 6496 #endif
6491 6497
6492 while (1) 6498 while (1)
6493 { 6499 {
6494 register EMACS_INT pid; 6500 pid_t pid;
6495 WAITTYPE w; 6501 WAITTYPE w;
6496 Lisp_Object tail; 6502 Lisp_Object tail;
6497 6503
6498 #ifdef WNOHANG 6504 #ifdef WNOHANG
6499 #ifndef WUNTRACED 6505 #ifndef WUNTRACED
6500 #define WUNTRACED 0 6506 #define WUNTRACED 0
6501 #endif /* no WUNTRACED */ 6507 #endif /* no WUNTRACED */
6502 /* Keep trying to get a status until we get a definitive result. */ 6508 /* Keep trying to get a status until we get a definitive result. */
6503 do 6509 while (1)
6504 { 6510 {
6505 errno = 0; 6511 errno = 0;
6506 pid = wait3 (&w, WNOHANG | WUNTRACED, 0); 6512 pid = wait3 (&w, WNOHANG | WUNTRACED, 0);
6507 } 6513 if (! (pid < 0 && errno == EINTR))
6508 while (pid < 0 && errno == EINTR); 6514 break;
6515 /* Avoid a busyloop: wait3 is a system call, so we do not want
6516 to prevent the kernel from actually sending SIGCHLD to emacs
6517 by asking for it all the time. */
6518 sleep (1);
6519 }
6509 6520
6510 if (pid <= 0) 6521 if (pid <= 0)
6511 { 6522 {
6512 /* PID == 0 means no processes found, PID == -1 means a real 6523 /* PID == 0 means no processes found, PID == -1 means a real
6513 failure. We have done all our job, so return. */ 6524 failure. We have done all our job, so return. */
6529 #endif /* no WNOHANG */ 6540 #endif /* no WNOHANG */
6530 6541
6531 /* Find the process that signaled us, and record its status. */ 6542 /* Find the process that signaled us, and record its status. */
6532 6543
6533 /* The process can have been deleted by Fdelete_process. */ 6544 /* The process can have been deleted by Fdelete_process. */
6534 tail = Fmember (make_fixnum_or_float (pid), deleted_pid_list); 6545 for (tail = deleted_pid_list; GC_CONSP (tail); tail = XCDR (tail))
6535 if (!NILP (tail)) 6546 {
6536 { 6547 Lisp_Object xpid = XCAR (tail);
6537 Fsetcar (tail, Qnil); 6548 if ((GC_INTEGERP (xpid) && pid == (pid_t) XINT (xpid))
6538 goto sigchld_end_of_loop; 6549 || (GC_FLOATP (xpid) && pid == (pid_t) XFLOAT_DATA (xpid)))
6550 {
6551 XSETCAR (tail, Qnil);
6552 goto sigchld_end_of_loop;
6553 }
6539 } 6554 }
6540 6555
6541 /* Otherwise, if it is asynchronous, it is in Vprocess_alist. */ 6556 /* Otherwise, if it is asynchronous, it is in Vprocess_alist. */
6542 p = 0; 6557 p = 0;
6543 for (tail = Vprocess_alist; GC_CONSP (tail); tail = XCDR (tail)) 6558 for (tail = Vprocess_alist; GC_CONSP (tail); tail = XCDR (tail))