From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Richard Stallman Newsgroups: gmane.emacs.devel Subject: jit-lock timer etc. Date: Mon, 21 Aug 2006 07:12:01 -0400 Message-ID: Reply-To: rms@gnu.org NNTP-Posting-Host: main.gmane.org Content-Type: text/plain; charset=ISO-8859-15 X-Trace: sea.gmane.org 1156158752 6433 80.91.229.2 (21 Aug 2006 11:12:32 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Mon, 21 Aug 2006 11:12:32 +0000 (UTC) Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Mon Aug 21 13:12:29 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 1GF7ha-0006Ca-AV for ged-emacs-devel@m.gmane.org; Mon, 21 Aug 2006 13:12:18 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1GF7hY-00053U-KQ for ged-emacs-devel@m.gmane.org; Mon, 21 Aug 2006 07:12:16 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1GF7hK-00052Z-Fh for emacs-devel@gnu.org; Mon, 21 Aug 2006 07:12:02 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1GF7hJ-00052N-W6 for emacs-devel@gnu.org; Mon, 21 Aug 2006 07:12:02 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1GF7hJ-00052K-P7 for emacs-devel@gnu.org; Mon, 21 Aug 2006 07:12:01 -0400 Original-Received: from [199.232.76.164] (helo=fencepost.gnu.org) by monty-python.gnu.org with esmtp (Exim 4.52) id 1GF7og-0005Fa-Ps for emacs-devel@gnu.org; Mon, 21 Aug 2006 07:19:38 -0400 Original-Received: from rms by fencepost.gnu.org with local (Exim 4.34) id 1GF7hJ-0001W9-40; Mon, 21 Aug 2006 07:12:01 -0400 Original-To: emacs-devel@gnu.org 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:58614 Archived-At: 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. *** 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)))))))))))