Mercurial > emacs
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)) |
