Mercurial > emacs
changeset 11845:c2179a288898
(status_notify): If Vprocess_alist changes within
the loop, do the whole loop again.
author | Karl Heuer <kwzh@gnu.org> |
---|---|
date | Thu, 18 May 1995 16:54:42 +0000 |
parents | cacb7820d1c7 |
children | 778a35aba3f7 |
files | src/process.c |
diffstat | 1 files changed, 82 insertions(+), 77 deletions(-) [+] |
line wrap: on
line diff
--- a/src/process.c Thu May 18 16:51:35 1995 +0000 +++ b/src/process.c Thu May 18 16:54:42 1995 +0000 @@ -3386,6 +3386,7 @@ register Lisp_Object proc, buffer; Lisp_Object tail, msg; struct gcpro gcpro1, gcpro2; + Lisp_Object old_process_alist; tail = Qnil; msg = Qnil; @@ -3395,87 +3396,91 @@ reference. */ GCPRO2 (tail, msg); - for (tail = Vprocess_alist; !NILP (tail); tail = Fcdr (tail)) + do { - Lisp_Object symbol; - register struct Lisp_Process *p; - - proc = Fcdr (Fcar (tail)); - p = XPROCESS (proc); - - if (XINT (p->tick) != XINT (p->update_tick)) + old_process_alist = Vprocess_alist; + for (tail = Vprocess_alist; !NILP (tail); tail = Fcdr (tail)) { - XSETINT (p->update_tick, XINT (p->tick)); - - /* If process is still active, read any output that remains. */ - if (XINT (p->infd) >= 0) - while (! EQ (p->filter, Qt) - && read_process_output (proc, XINT (p->infd)) > 0); - - buffer = p->buffer; - - /* Get the text to use for the message. */ - if (!NILP (p->raw_status_low)) - update_status (p); - msg = status_message (p->status); - - /* If process is terminated, deactivate it or delete it. */ - symbol = p->status; - if (CONSP (p->status)) - symbol = XCONS (p->status)->car; - - if (EQ (symbol, Qsignal) || EQ (symbol, Qexit) - || EQ (symbol, Qclosed)) + Lisp_Object symbol; + register struct Lisp_Process *p; + + proc = Fcdr (Fcar (tail)); + p = XPROCESS (proc); + + if (XINT (p->tick) != XINT (p->update_tick)) { - if (delete_exited_processes) - remove_process (proc); - else - deactivate_process (proc); + XSETINT (p->update_tick, XINT (p->tick)); + + /* If process is still active, read any output that remains. */ + if (XINT (p->infd) >= 0) + while (! EQ (p->filter, Qt) + && read_process_output (proc, XINT (p->infd)) > 0); + + buffer = p->buffer; + + /* Get the text to use for the message. */ + if (!NILP (p->raw_status_low)) + update_status (p); + msg = status_message (p->status); + + /* If process is terminated, deactivate it or delete it. */ + symbol = p->status; + if (CONSP (p->status)) + symbol = XCONS (p->status)->car; + + if (EQ (symbol, Qsignal) || EQ (symbol, Qexit) + || EQ (symbol, Qclosed)) + { + if (delete_exited_processes) + remove_process (proc); + else + deactivate_process (proc); + } + + /* Now output the message suitably. */ + if (!NILP (p->sentinel)) + exec_sentinel (proc, msg); + /* Don't bother with a message in the buffer + when a process becomes runnable. */ + else if (!EQ (symbol, Qrun) && !NILP (buffer)) + { + Lisp_Object ro, tem; + struct buffer *old = current_buffer; + int opoint; + + ro = XBUFFER (buffer)->read_only; + + /* Avoid error if buffer is deleted + (probably that's why the process is dead, too) */ + if (NILP (XBUFFER (buffer)->name)) + continue; + Fset_buffer (buffer); + opoint = point; + /* Insert new output into buffer + at the current end-of-output marker, + thus preserving logical ordering of input and output. */ + if (XMARKER (p->mark)->buffer) + SET_PT (marker_position (p->mark)); + else + SET_PT (ZV); + if (point <= opoint) + opoint += XSTRING (msg)->size + XSTRING (p->name)->size + 10; + + tem = current_buffer->read_only; + current_buffer->read_only = Qnil; + insert_string ("\nProcess "); + Finsert (1, &p->name); + insert_string (" "); + Finsert (1, &msg); + current_buffer->read_only = tem; + Fset_marker (p->mark, make_number (point), p->buffer); + + SET_PT (opoint); + set_buffer_internal (old); + } } - - /* Now output the message suitably. */ - if (!NILP (p->sentinel)) - exec_sentinel (proc, msg); - /* Don't bother with a message in the buffer - when a process becomes runnable. */ - else if (!EQ (symbol, Qrun) && !NILP (buffer)) - { - Lisp_Object ro, tem; - struct buffer *old = current_buffer; - int opoint; - - ro = XBUFFER (buffer)->read_only; - - /* Avoid error if buffer is deleted - (probably that's why the process is dead, too) */ - if (NILP (XBUFFER (buffer)->name)) - continue; - Fset_buffer (buffer); - opoint = point; - /* Insert new output into buffer - at the current end-of-output marker, - thus preserving logical ordering of input and output. */ - if (XMARKER (p->mark)->buffer) - SET_PT (marker_position (p->mark)); - else - SET_PT (ZV); - if (point <= opoint) - opoint += XSTRING (msg)->size + XSTRING (p->name)->size + 10; - - tem = current_buffer->read_only; - current_buffer->read_only = Qnil; - insert_string ("\nProcess "); - Finsert (1, &p->name); - insert_string (" "); - Finsert (1, &msg); - current_buffer->read_only = tem; - Fset_marker (p->mark, make_number (point), p->buffer); - - SET_PT (opoint); - set_buffer_internal (old); - } - } - } /* end for */ + } /* end for */ + } while (! EQ (old_process_alist, Vprocess_alist)); update_mode_lines++; /* in case buffers use %s in mode-line-format */ redisplay_preserve_echo_area ();