From bf351cc2bead795586b5c4a47ee2146712d7eb79 Mon Sep 17 00:00:00 2001 From: Karl Heuer Date: Thu, 18 May 1995 16:54:42 +0000 Subject: [PATCH] (status_notify): If Vprocess_alist changes within the loop, do the whole loop again. --- src/process.c | 145 ++++++++++++++++++++++++++------------------------ 1 file changed, 75 insertions(+), 70 deletions(-) diff --git a/src/process.c b/src/process.c index 119ed47c749..cedcb38fa8a 100644 --- a/src/process.c +++ b/src/process.c @@ -3386,6 +3386,7 @@ status_notify () 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 @@ status_notify () 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)); + Lisp_Object symbol; + register struct Lisp_Process *p; - /* 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); + proc = Fcdr (Fcar (tail)); + p = XPROCESS (proc); - buffer = p->buffer; + if (XINT (p->tick) != XINT (p->update_tick)) + { + XSETINT (p->update_tick, XINT (p->tick)); - /* 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 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); - /* If process is terminated, deactivate it or delete it. */ - symbol = p->status; - if (CONSP (p->status)) - symbol = XCONS (p->status)->car; + buffer = p->buffer; - if (EQ (symbol, Qsignal) || EQ (symbol, Qexit) - || EQ (symbol, Qclosed)) - { - if (delete_exited_processes) - remove_process (proc); - else - deactivate_process (proc); - } + /* Get the text to use for the message. */ + if (!NILP (p->raw_status_low)) + update_status (p); + msg = status_message (p->status); - /* 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; + /* If process is terminated, deactivate it or delete it. */ + symbol = p->status; + if (CONSP (p->status)) + symbol = XCONS (p->status)->car; - /* 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); + if (EQ (symbol, Qsignal) || EQ (symbol, Qexit) + || EQ (symbol, Qclosed)) + { + if (delete_exited_processes) + remove_process (proc); + else + deactivate_process (proc); + } - 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 (); -- 2.39.2