emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: jit-lock timer etc.


From: Kim F. Storm
Subject: Re: jit-lock timer etc.
Date: Mon, 21 Aug 2006 13:39:55 +0200
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux)

Richard Stallman <address@hidden> writes:

> Here's my patch to make the jit-lock timer reschedule itself
> instead of waiting.  It uses current-idle-time, which I have tested
> and checked in, but I can't easily tell whether steath fontification
> is working.  So I would like someone to test this before I check it in.
>
> I have not yet tried to read the other proposed change to this code.
> I was too tired when I saw it.

I strongly prefer the other change proposed by Martin Rudalics which
avoids calling sit-for at all in the timer handler.  I have installed
Martin's patch, and I haven't seen the "cursor disappearing" bug since!

However, the approach taken by Martin can be improved by using your
new current-idle-time to install a proper idle timer to resume jit-lock.

Martin, would you like to try to update your patch ?



>
> *** jit-lock.el       17 Aug 2006 11:21:10 -0400      1.54
> --- jit-lock.el       18 Aug 2006 07:57:36 -0400      
> ***************
> *** 171,176 ****
> --- 171,180 ----
>   
>   (defvar jit-lock-stealth-timer nil
>     "Timer for stealth fontification in Just-in-time Lock mode.")
> + (defvar jit-lock-stealth-resume-timer nil
> +   "Timer for resuming stealth fontification in Just-in-time Lock mode.
> + When time stealth fontification finishes one batch, it reschedules
> + itself using this timer.")
>   (defvar jit-lock-context-timer nil
>     "Timer for context fontification in Just-in-time Lock mode.")
>   (defvar jit-lock-defer-timer nil
> ***************
> *** 225,230 ****
> --- 229,241 ----
>                (run-with-idle-timer jit-lock-stealth-time t
>                                     'jit-lock-stealth-fontify)))
>   
> +      ;; Set up an idle timer for stealth fontification to resume,
> +      ;; but don't activate it now.
> +      (when (and jit-lock-stealth-time (null jit-lock-stealth-timer))
> +        (setq jit-lock-stealth-resume-timer (timer-create))
> +        (timer-set-function jit-lock-stealth-resume-timer
> +                            'jit-lock-stealth-fontify))
> + 
>        ;; Init deferred fontification timer.
>        (when (and jit-lock-defer-time (null jit-lock-defer-timer))
>          (setq jit-lock-defer-timer
> ***************
> *** 449,454 ****
> --- 460,466 ----
>   This functions is called after Emacs has been idle for
>   `jit-lock-stealth-time' seconds."
>     ;; I used to check `inhibit-read-only' here, but I can't remember why.  
> -stef
> +   (cancel-timer jit-lock-stealth-resume-timer)
>     (unless (or executing-kbd-macro
>             memory-full
>             (window-minibuffer-p (selected-window)))
> ***************
> *** 457,512 ****
>         minibuffer-auto-raise
>         message-log-max)
>         (with-local-quit
> !     (while (and buffers (not (input-pending-p)))
>         (with-current-buffer (pop buffers)
> !         (when jit-lock-mode
> !           ;; This is funny.  Calling sit-for with 3rd arg non-nil
> !           ;; so that it doesn't redisplay, internally calls
> !           ;; wait_reading_process_input also with a parameter
> !           ;; saying "don't redisplay."  Since this function here
> !           ;; is called periodically, this effectively leads to
> !           ;; process output not being redisplayed at all because
> !           ;; redisplay_internal is never called.  (That didn't
> !           ;; work in the old redisplay either.)  So, we learn that
> !           ;; we mustn't call sit-for that way here.  But then, we
> !           ;; have to be cautious not to call sit-for in a widened
> !           ;; buffer, since this could display hidden parts of that
> !           ;; buffer.  This explains the seemingly weird use of
> !           ;; save-restriction/widen here.
> ! 
> !           (with-temp-message (if jit-lock-stealth-verbose
> !                                  (concat "JIT stealth lock "
> !                                          (buffer-name)))
> ! 
> !             ;; In the following code, the `sit-for' calls cause a
> !             ;; redisplay, so it's required that the
> !             ;; buffer-modified flag of a buffer that is displayed
> !             ;; has the right value---otherwise the mode line of
> !             ;; an unmodified buffer would show a `*'.
> !             (let (start
> !                   (nice (or jit-lock-stealth-nice 0))
> !                   (point (point-min)))
> !               (while (and (setq start
> !                                 (jit-lock-stealth-chunk-start point))
> !                           ;; In case sit-for runs any timers,
> !                           ;; give them the expected current buffer.
> !                           (with-current-buffer outer-buffer
> !                             (sit-for nice)))
> ! 
> !                 ;; fontify a block.
> !                 (jit-lock-fontify-now start (+ start jit-lock-chunk-size))
> !                 ;; If stealth jit-locking is done backwards, this leads to
> !                 ;; excessive O(n^2) refontification.   -stef
> !                 ;; (when (>= jit-lock-context-unfontify-pos start)
> !                 ;;   (setq jit-lock-context-unfontify-pos end))
> ! 
> !                 ;; Wait a little if load is too high.
> !                 (when (and jit-lock-stealth-load
> !                            (> (car (load-average)) jit-lock-stealth-load))
> !                   ;; In case sit-for runs any timers,
> !                   ;; give them the expected current buffer.
> !                   (with-current-buffer outer-buffer
> !                     (sit-for (or jit-lock-stealth-time 30))))))))))))))
>   
>   
>   
> --- 469,527 ----
>         minibuffer-auto-raise
>         message-log-max)
>         (with-local-quit
> !     (when (and jit-lock-mode buffers (not (input-pending-p)))
>         (with-current-buffer (pop buffers)
> !         ;; This is funny.  Calling sit-for with 3rd arg non-nil
> !         ;; so that it doesn't redisplay, internally calls
> !         ;; wait_reading_process_input also with a parameter
> !         ;; saying "don't redisplay."  Since this function here
> !         ;; is called periodically, this effectively leads to
> !         ;; process output not being redisplayed at all because
> !         ;; redisplay_internal is never called.  (That didn't
> !         ;; work in the old redisplay either.)  So, we learn that
> !         ;; we mustn't call sit-for that way here.  But then, we
> !         ;; have to be cautious not to call sit-for in a widened
> !         ;; buffer, since this could display hidden parts of that
> !         ;; buffer.  This explains the seemingly weird use of
> !         ;; save-restriction/widen here.
> ! 
> !         (with-temp-message (if jit-lock-stealth-verbose
> !                                (concat "JIT stealth lock "
> !                                        (buffer-name)))
> ! 
> !           ;; In the following code, the `sit-for' calls cause a
> !           ;; redisplay, so it's required that the
> !           ;; buffer-modified flag of a buffer that is displayed
> !           ;; has the right value---otherwise the mode line of
> !           ;; an unmodified buffer would show a `*'.
> !           (let (start
> !                 (nice (or jit-lock-stealth-nice 0))
> !                 (point (point-min)))
> !             (while (and (setq start
> !                               (jit-lock-stealth-chunk-start point))
> !                         ;; In case sit-for runs any timers,
> !                         ;; give them the expected current buffer.
> !                         (with-current-buffer outer-buffer
> !                           (sit-for nice)))
> ! 
> !               ;; fontify a block.
> !               (jit-lock-fontify-now start (+ start jit-lock-chunk-size))
> !               ;; If stealth jit-locking is done backwards, this leads to
> !               ;; excessive O(n^2) refontification.   -stef
> !               ;; (when (>= jit-lock-context-unfontify-pos start)
> !               ;;   (setq jit-lock-context-unfontify-pos end))
> ! 
> !               ;; Wait a little if load is too high.
> !               (when (and jit-lock-stealth-load
> !                          (> (car (load-average)) jit-lock-stealth-load))
> !                 ;; Make this timer resume jit-lock in a few
> !                 ;; seconds.  Compute an idleness time suitably
> !                 ;; larger than the current one.
> !                 (timer-set-idle-time jit-lock-stealth-resume-timer
> !                                      (current-idle-time))
> !                 (timer-inc-time (or jit-lock-stealth-time 30))
> !                 (timer-activate-when-idle
> !                  jit-lock-stealth-resume-timer t)))))))))))
>   
>   
>   

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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]