things in an inconsistent state. This is normally unproblematical
because most timer functions don't do a lot of work. Indeed, for a
timer to call a function that takes substantial time to run is likely
-to be annoying.
+to be annoying. If a timer function needs to allow quitting, it
+should use @code{with-local-quit} (@pxref{Quitting}). For example, if
+a timer function calls @code{accept-process-output} to receive output
+from an external process, that call should be wrapped inside
+@code{with-local-quit}, to ensure that @kbd{C-g} works if the external
+process hangs.
It is usually a bad idea for timer functions to alter buffer
contents. When they do, they usually should call @code{undo-boundary}
changes from user commands' changes and prevent a single undo entry
from growing to be quite large.
+ Timer functions should also avoid calling functions that cause Emacs
+to wait, such as @code{sit-for} (@pxref{Waiting}). This can lead to
+unpredictable effects, since other timers (or even the same timer) can
+run while waiting. If a timer function needs to perform an action
+after a certain time has elapsed, it can do this by scheduling a new
+timer.
+
If a timer function calls functions that can change the match data,
it should save and restore the match data. @xref{Saving Match Data}.
@deffn Command run-at-time time repeat function &rest args
This sets up a timer that calls the function @var{function} with
arguments @var{args} at time @var{time}. If @var{repeat} is a number
-(integer or floating point), the timer also runs every @var{repeat}
-seconds after that. If @var{repeat} is @code{nil}, the timer runs
-only once.
+(integer or floating point), the timer is scheduled to run again every
+@var{repeat} seconds after @var{time}. If @var{repeat} is @code{nil},
+the timer runs only once.
@var{time} may specify an absolute or a relative time.
@code{cancel-timer} (see below).
@end deffn
+ A repeating timer nominally ought to run every @var{repeat} seconds,
+but remember that any invocation of a timer can be late. Lateness of
+one repetition has no effect on the scheduled time of the next
+repetition. For instance, if Emacs is busy computing for long enough
+to cover three scheduled repetitions of the timer, and then starts to
+wait, it will immediately call the timer function three times in
+immediate succession (presuming no other timers trigger before or
+between them). If you want a timer to run again no less than @var{n}
+seconds after the last invocation, don't use the @var{repeat} argument.
+Instead, the timer function should explicitly reschedule the timer.
+
+@defvar timer-max-repeats
+This variable's value specifies the maximum number of times to repeat
+calling a timer function in a row, when many previously scheduled
+calls were unavoidably delayed.
+@end defvar
+
@defmac with-timeout (seconds timeout-forms@dots{}) body@dots{}
Execute @var{body}, but give up after @var{seconds} seconds. If
@var{body} finishes before the time is up, @code{with-timeout} returns
@deffn Command run-with-idle-timer secs repeat function &rest args
Set up a timer which runs when Emacs has been idle for @var{secs}
seconds. The value of @var{secs} may be an integer or a floating point
-number.
+number; a value of the type returned by @code{current-idle-time}
+is also allowed.
If @var{repeat} is @code{nil}, the timer runs just once, the first time
Emacs remains idle for a long enough time. More often @var{repeat} is
remains idle for @var{secs} seconds.
The function @code{run-with-idle-timer} returns a timer value which you
-can use in calling @code{cancel-timer} (see below).
+can use in calling @code{cancel-timer} (@pxref{Timers}).
@end deffn
@cindex idleness
@end smallexample
@end defun
+ Some idle timer functions in user Lisp packages have a loop that
+does a certain amount of processing each time around, and exits when
+@code{(input-pending-p)} is non-@code{nil}. That approach seems very
+natural but has two problems:
+
+@itemize
+@item
+It blocks out all process output (since Emacs accepts process output
+only while waiting).
+
+@item
+It blocks out any idle timers that ought to run during that time.
+@end itemize
+
+@noindent
+To avoid these problems, don't use that technique. Instead, write
+such idle timers to reschedule themselves after a brief pause, using
+the method in the @code{timer-function} example above.
+
@node Terminal Input
@section Terminal Input
@cindex terminal input