all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: storm@cua.dk (Kim F. Storm)
Cc: emacs-devel@gnu.org
Subject: Re: Single process output reading
Date: 16 Aug 2004 16:37:07 +0200	[thread overview]
Message-ID: <m3657jqhd8.fsf@kfs-l.imdomain.dk> (raw)
In-Reply-To: <874qn35tgf.fsf@zamazal.org>

Milan Zamazal <pdm@brailcom.org> writes:

> I think a way to read an output of just a single asynchronous process in
> Emacs is needed.  I.e. a way to invoke accept-process-output without
> possible invocation of another process filter function or a timer.

Your reasons sound valid to me, but blocking everything including timers
isn't very good, but may be acceptable for very short periods of time.

> IMO a better way would be to allow restricting accept-process-output to
> just a single process output reading.  Then the speech output system,
> aware of possible consequences of advising 'message' etc., could invoke
> accept-process-output in the restricted form, without the danger of
> unwanted side effects.

Here's an (untested) patch that adds a "just-this-one" arg to
accept-process-output

To avoid running timers, specify an integer as fourth arg, e.g.
  (accept-process-output your-process nil nil 1)


*** process.c	29 Jul 2004 16:46:31 +0200	1.434
--- process.c	16 Aug 2004 16:25:16 +0200	
***************
*** 3718,3734 ****
  }
  \f
  DEFUN ("accept-process-output", Faccept_process_output, Saccept_process_output,
!        0, 3, 0,
         doc: /* Allow any pending output from subprocesses to be read by Emacs.
  It is read into the process' buffers or given to their filter functions.
  Non-nil arg PROCESS means do not return until some output has been received
  from PROCESS.
  Non-nil second arg TIMEOUT and third arg TIMEOUT-MSECS are number of
  seconds and microseconds to wait; return after that much time whether
  or not there is input.
  Return non-nil iff we received any output before the timeout expired.  */)
!      (process, timeout, timeout_msecs)
!      register Lisp_Object process, timeout, timeout_msecs;
  {
    int seconds;
    int useconds;
--- 3718,3737 ----
  }
  \f
  DEFUN ("accept-process-output", Faccept_process_output, Saccept_process_output,
!        0, 4, 0,
         doc: /* Allow any pending output from subprocesses to be read by Emacs.
  It is read into the process' buffers or given to their filter functions.
  Non-nil arg PROCESS means do not return until some output has been received
  from PROCESS.
+ If optional fourth arg JUST-THIS-ONE is non-nil, only accept output
+ from PROCESS, suspending reading output from other processes.
+ If JUST-THIS-ONE is an integer, don't run any timers either.
  Non-nil second arg TIMEOUT and third arg TIMEOUT-MSECS are number of
  seconds and microseconds to wait; return after that much time whether
  or not there is input.
  Return non-nil iff we received any output before the timeout expired.  */)
!      (process, timeout, timeout_msecs, just_this_one)
!      register Lisp_Object process, timeout, timeout_msecs, just_this_one;
  {
    int seconds;
    int useconds;
***************
*** 3776,3782 ****
      XSETFASTINT (process, 0);
  
    return
!     (wait_reading_process_input (seconds, useconds, process, 0)
       ? Qt : Qnil);
  }
  
--- 3779,3787 ----
      XSETFASTINT (process, 0);
  
    return
!     (wait_reading_process_input (seconds, useconds, process,
! 				 NILP (just_this_one) ? 0 :
! 				 !INTEGERP (just_this_one) ? -1 : -2)
       ? Qt : Qnil);
  }
  
***************
*** 4032,4037 ****
--- 4037,4043 ----
    EMACS_TIME timeout, end_time;
    int wait_channel = -1;
    struct Lisp_Process *wait_proc = 0;
+   int just_the_wait_proc = 0;
    int got_some_input = 0;
    /* Either nil or a cons cell, the car of which is of interest and
       may be changed outside of this routine.  */
***************
*** 4048,4053 ****
--- 4054,4064 ----
        wait_proc = XPROCESS (read_kbd);
        wait_channel = XINT (wait_proc->infd);
        XSETFASTINT (read_kbd, 0);
+       if (do_display < 0)
+ 	{
+ 	  just_the_wait_proc = do_display;
+ 	  do_display = 0;
+ 	}
      }
  
    /* If waiting for non-nil in a cell, record where.  */
***************
*** 4122,4128 ****
  	 But not if wait_for_cell; in those cases,
  	 the wait is supposed to be short,
  	 and those callers cannot handle running arbitrary Lisp code here.  */
!       if (NILP (wait_for_cell))
  	{
  	  EMACS_TIME timer_delay;
  
--- 4133,4140 ----
  	 But not if wait_for_cell; in those cases,
  	 the wait is supposed to be short,
  	 and those callers cannot handle running arbitrary Lisp code here.  */
!       if (NILP (wait_for_cell)
! 	  && just_the_wait_proc != -2)
  	{
  	  EMACS_TIME timer_delay;
  
***************
*** 4258,4264 ****
  
        /* Wait till there is something to do */
  
!       if (!NILP (wait_for_cell))
  	{
  	  Available = non_process_wait_mask;
  	  check_connect = check_delay = 0;
--- 4270,4281 ----
  
        /* Wait till there is something to do */
  
!       if (just_the_wait_proc)
! 	{
! 	  FD_SET (wait_channel, &Available);
! 	  check_connect = check_delay = 0;
! 	}
!       else if (!NILP (wait_for_cell))
  	{
  	  Available = non_process_wait_mask;
  	  check_connect = check_delay = 0;


--
Kim F. Storm <storm@cua.dk> http://www.cua.dk

  reply	other threads:[~2004-08-16 14:37 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-08-16  9:21 Single process output reading Milan Zamazal
2004-08-16 14:37 ` Kim F. Storm [this message]
2004-08-17 11:31   ` Milan Zamazal
2004-08-17 11:38     ` Kim F. Storm
2004-08-17 20:42       ` Milan Zamazal
2004-08-18  1:34 ` Richard Stallman
2004-08-18 20:50   ` Milan Zamazal
2004-08-20  4:48     ` Richard Stallman
2004-08-19 11:40   ` Kim F. Storm
2004-08-20  4:49     ` Richard Stallman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m3657jqhd8.fsf@kfs-l.imdomain.dk \
    --to=storm@cua.dk \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.