From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Chong Yidong Newsgroups: gmane.emacs.devel Subject: Re: jit-lock timer etc. Date: Thu, 24 Aug 2006 11:27:58 -0400 Message-ID: <87k64y8875.fsf@furball.mit.edu> References: <44E9E5F5.8000400@gmx.at> <87fyfpq5wf.fsf@stupidchicken.com> <44EA3222.9050405@gmx.at> <44EC49AD.2080001@gmx.at> NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: sea.gmane.org 1156433335 19782 80.91.229.2 (24 Aug 2006 15:28:55 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Thu, 24 Aug 2006 15:28:55 +0000 (UTC) Cc: storm@cua.dk, rms@gnu.org, emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Aug 24 17:28:48 2006 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1GGH80-0004tJ-68 for ged-emacs-devel@m.gmane.org; Thu, 24 Aug 2006 17:28:21 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1GGH7z-0000eM-K7 for ged-emacs-devel@m.gmane.org; Thu, 24 Aug 2006 11:28:19 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1GGH7l-0000d9-G6 for emacs-devel@gnu.org; Thu, 24 Aug 2006 11:28:05 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1GGH7k-0000cj-Uk for emacs-devel@gnu.org; Thu, 24 Aug 2006 11:28:04 -0400 Original-Received: from [18.72.1.2] (helo=south-station-annex.mit.edu) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA:32) (Exim 4.52) id 1GGHFp-0005Yi-Uz; Thu, 24 Aug 2006 11:36:26 -0400 Original-Received: from grand-central-station.mit.edu (GRAND-CENTRAL-STATION.MIT.EDU [18.7.21.82]) by south-station-annex.mit.edu (8.13.6/8.9.2) with ESMTP id k7OFS0GT013534; Thu, 24 Aug 2006 11:28:01 -0400 (EDT) Original-Received: from outgoing-legacy.mit.edu (OUTGOING-LEGACY.MIT.EDU [18.7.22.104]) by grand-central-station.mit.edu (8.13.6/8.9.2) with ESMTP id k7OFS0BS012063; Thu, 24 Aug 2006 11:28:00 -0400 (EDT) Original-Received: from furball.mit.edu (SYDNEYPACIFIC-THREE-NINETY-NINE.MIT.EDU [18.95.6.144]) ) by outgoing-legacy.mit.edu (8.13.6/8.12.4) with ESMTP id k7OFRsGm027911; Thu, 24 Aug 2006 11:27:55 -0400 (EDT) Original-Received: from cyd by furball.mit.edu with local (Exim 3.36 #1 (Debian)) id 1GGH7e-0000r1-00; Thu, 24 Aug 2006 11:27:58 -0400 Original-To: martin rudalics In-Reply-To: <44EC49AD.2080001@gmx.at> (martin rudalics's message of "Wed, 23 Aug 2006 14:27:25 +0200") User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux) X-Spam-Score: 1.217 X-Scanned-By: MIMEDefang 2.42 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:58813 Archived-At: martin rudalics writes: >> I think this ought to use run-with-idle-timer >> and current-idle-time, as in my patch. > > I was not able to accomplish that since the idle timer does not trigger. > In analogy to your patch I replaced the above by > > (when (and jit-lock-stealth-buffers jit-lock-stealth-time) > ;; Call us again. > (timer-set-idle-time jit-lock-stealth-repeat-timer (current-idle-time)) > (timer-inc-time jit-lock-stealth-repeat-timer delay) > (timer-activate-when-idle jit-lock-stealth-repeat-timer t) I don't know what was wrong with this code since you didn't post it. It looks like you simply forgot to initialize jit-lock-stealth-repeat-timer, but I can't be sure. However, the following patch, based on the last patch you posted to this list with minimal modifications, works fine for me. It applies to the current CVS tree, and uses `current-idle-time'. It includes and uses the change to `timer-set-idle-time' which I previously posted, allowing it to accept the value returned by `current-idle-time'. I have verified that the idle timer triggers correctly, stops correctly when user input comes in, and resumes when Emacs becomes idle again. *** emacs/lisp/jit-lock.el.~1.54.~ 2006-08-17 11:49:36.000000000 -0400 --- emacs/lisp/jit-lock.el 2006-08-24 11:21:23.000000000 -0400 *************** *** 443,513 **** (t next)))) result)))) ! (defun jit-lock-stealth-fontify () "Fontify buffers stealthily. ! 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 (unless (or executing-kbd-macro memory-full ! (window-minibuffer-p (selected-window))) ! (let ((buffers (buffer-list)) ! (outer-buffer (current-buffer)) 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)))))))))))))) ! ;;; Deferred fontification. --- 443,511 ---- (t next)))) result)))) + (defvar jit-lock-stealth-buffers nil + "List of buffers that should be fontified stealthily.") ! (defvar jit-lock-stealth-repeat-timer nil ! "Timer for repeated stealth fontification.") ! ! (defun jit-lock-stealth-fontify (&optional repeat) "Fontify buffers stealthily. ! This function is called repeatedly after Emacs has become idle for ! `jit-lock-stealth-time' seconds. Optional argument REPEAT is expected ! non-nil in a repeated invocation of this function." (unless (or executing-kbd-macro memory-full ! (window-minibuffer-p (selected-window)) ! ;; For first invocation set up `jit-lock-stealth-buffers'. ! ;; In repeated invocations it's already been set up. ! (null (if repeat ! jit-lock-stealth-buffers ! (setq jit-lock-stealth-buffers (buffer-list))))) ! ;; Cancel timer for repeated invocations. ! (when (timerp jit-lock-stealth-repeat-timer) ! (cancel-timer jit-lock-stealth-repeat-timer)) ! (let ((buffer (car jit-lock-stealth-buffers)) ! (delay 0) minibuffer-auto-raise ! message-log-max ! start) ! (if (and jit-lock-stealth-load ! (> (car (load-average)) jit-lock-stealth-load)) ! ;; Wait a little if load is too high. ! (setq delay jit-lock-stealth-time) ! (if (buffer-live-p buffer) ! (with-current-buffer buffer ! (if (and jit-lock-mode ! (setq start (jit-lock-stealth-chunk-start (point)))) ! ;; Fontify one block of at most `jit-lock-chunk-size' ! ;; characters. ! (with-temp-message (if jit-lock-stealth-verbose ! (concat "JIT stealth lock " ! (buffer-name))) ! (jit-lock-fontify-now start ! (+ start jit-lock-chunk-size)) ! ;; Run again after `jit-lock-stealth-nice' seconds. ! (setq delay (or jit-lock-stealth-nice 0))) ! ;; Nothing to fontify here. Remove this buffer from ! ;; `jit-lock-stealth-buffers' and run again immediately. ! (setq jit-lock-stealth-buffers ! (cdr jit-lock-stealth-buffers)))) ! ;; Buffer is no longer live. Remove it from ! ;; `jit-lock-stealth-buffers' and run again immediately. ! (setq jit-lock-stealth-buffers ! (cdr jit-lock-stealth-buffers)))) ! ;; Call us again. ! (when jit-lock-stealth-buffers ! (if repeat ! (progn (timer-set-idle-time ! jit-lock-stealth-repeat-timer (current-idle-time)) ! (timer-inc-time jit-lock-stealth-repeat-timer delay) ! (timer-activate-when-idle ! jit-lock-stealth-repeat-timer t)) ! (setq jit-lock-stealth-repeat-timer ! (run-at-time delay ! nil 'jit-lock-stealth-fontify t))))))) ;;; Deferred fontification. *** emacs/lisp/emacs-lisp/timer.el.~1.12.~ 2006-08-20 09:55:37.000000000 -0400 --- emacs/lisp/emacs-lisp/timer.el 2006-08-24 10:45:48.000000000 -0400 *************** *** 60,73 **** (defun timer-set-idle-time (timer secs &optional repeat) "Set the trigger idle time of TIMER to SECS. If optional third argument REPEAT is non-nil, make the timer fire each time Emacs is idle for that many seconds." (or (timerp timer) (error "Invalid timer")) ! (aset timer 1 0) ! (aset timer 2 0) ! (aset timer 3 0) ! (timer-inc-time timer secs) (aset timer 4 repeat) timer) --- 60,81 ---- (defun timer-set-idle-time (timer secs &optional repeat) "Set the trigger idle time of TIMER to SECS. + SECS may be an integer, floating point number, or the internal + time format (HIGH LOW USECS) returned by, e.g., `current-time'. If optional third argument REPEAT is non-nil, make the timer fire each time Emacs is idle for that many seconds." (or (timerp timer) (error "Invalid timer")) ! (if (consp secs) ! (progn (aset timer 1 (car secs)) ! (aset timer 2 (if (consp (cdr time)) (car (cdr time)) (cdr time))) ! (aset timer 3 (or (and (consp (cdr time)) (consp (cdr (cdr time))) ! (nth 2 time)) ! 0))) ! (aset timer 1 0) ! (aset timer 2 0) ! (aset timer 3 0) ! (timer-inc-time timer secs)) (aset timer 4 repeat) timer) *************** *** 104,110 **** (defun timer-relative-time (time secs &optional usecs) "Advance TIME by SECS seconds and optionally USECS microseconds. ! SECS may be a fraction." (let ((high (car time)) (low (if (consp (cdr time)) (nth 1 time) (cdr time))) (micro (if (numberp (car-safe (cdr-safe (cdr time)))) --- 112,118 ---- (defun timer-relative-time (time secs &optional usecs) "Advance TIME by SECS seconds and optionally USECS microseconds. ! SECS may be either an integer or a floating point number." (let ((high (car time)) (low (if (consp (cdr time)) (nth 1 time) (cdr time))) (micro (if (numberp (car-safe (cdr-safe (cdr time))))