Mercurial > hg > xemacs-beta
diff lisp/cmdloop.el @ 3698:7d97cf62c899
[xemacs-hg @ 2006-11-24 13:45:37 by aidan]
Within truncate-command-history-for-gc, delay execution of all things that look up variable bindings, via 'enqueue-eval-event'.
author | aidan |
---|---|
date | Fri, 24 Nov 2006 13:45:38 +0000 |
parents | 94903620d912 |
children | 38ef5a6da799 |
line wrap: on
line diff
--- a/lisp/cmdloop.el Thu Nov 23 22:51:07 2006 +0000 +++ b/lisp/cmdloop.el Fri Nov 24 13:45:38 2006 +0000 @@ -183,11 +183,26 @@ (defun truncate-command-history-for-gc () - (let ((tail (nthcdr 30 command-history))) - (if tail (setcdr tail nil))) - (let ((tail (nthcdr 30 values))) - (if tail (setcdr tail nil))) - ) + ;; We should try to avoid accessing any bindings to speak of in this + ;; function; as this hook is called asynchronously, the search for + ;; those bindings might search local bindings from essentially + ;; arbitrary functions. We force the body of the function to run at + ;; command-loop level, where the danger of local bindings is much + ;; reduced; the code can still do its job because the command history + ;; and values list will not grow before then anyway. + ;; + ;; Nothing is done in batch mode, both because it is a waste of time + ;; (there is no command loop!) and because this any GCs during dumping + ;; will invoke this code, and if it were to enqueue an eval event, + ;; the portable dumper would try to dump it and fail. + (if (not (noninteractive)) + (enqueue-eval-event + (lambda (arg) + (let ((tail (nthcdr 30 command-history))) + (if tail (setcdr tail nil))) + (let ((tail (nthcdr 30 values))) + (if tail (setcdr tail nil)))) + nil))) (add-hook 'pre-gc-hook 'truncate-command-history-for-gc)