[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Single process output reading
From: |
Kim F. Storm |
Subject: |
Re: Single process output reading |
Date: |
16 Aug 2004 16:37:07 +0200 |
User-agent: |
Gnus/5.09 (Gnus v5.9.0) Emacs/21.3.50 |
Milan Zamazal <address@hidden> 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 ****
}
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 ----
}
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 <address@hidden> http://www.cua.dk