Thread: Re: [CEDET-devel] New kind of data cache
Brought to you by:
zappo
From: David P. <dav...@wa...> - 2004-02-19 08:27:22
|
Hi Eric, > I've introduced a new kind of data cache behind the API fcn in > semantic-fw.el. The starting point is: > `semantic-cache-data-to-buffer'. This will link a data structure to > a specific region of a buffer. You can retrieve the data with > `semantic-get-cache-data' iff the point is in the region. > > It may sound boring, but what's nifty is you can specify a lifespan > for the data cache. > > I've used this with `semantic-analyze-current-context'. It caches > the calculated context over the symbol that was found under point. > A second call to this routine will return a previously calculated > value. > > It gives the data a lifespan of `exit-cache-zone'. The data is > automatically deleted when the cursor leaves the symbol region. > > This is very useful with the idle scheduler. Both summary mode and > the completion mode need that context. This basically cuts the > calculation time spent in the idle scheduler in half. Huzzah! That looks like a very good idea! I have a suggestion: to replace `tag' in that data cache API with cache name, or something like that, to avoid confusion with the general meaning of `tag' in semantic. Also it looks that there is a small bug in the `semantic-cache-data-post-command-hook' loop, which only look at the first overlay in `semantic-cache-data-overlays'. Finally, in `semantic-cache-data-to-buffer' I think it would be better to check if LIFESPAN is valid before to create the overlay and push it in `semantic-cache-data-overlays'. Following is a patch for all that. Thanks! David P.S.: What do you think of the last version of `semantic-idle-core-handler' I posted, that separate re-parsing of buffers having the same mode as the current buffer from others? 2004-02-19 David Ponce <da...@dp...> * cedet/semantic/semantic-fw.el (semantic-cache-data-to-buffer): Use cache-name instead of tag. Check for errors before to create the overlay. (semantic-cache-data-post-command-hook): Use `oldcache' in the loop. (semantic-get-cache-data): Use cache-name instead of tag. Index: semantic-fw.el =================================================================== RCS file: /cvsroot/cedet/cedet/semantic/semantic-fw.el,v retrieving revision 1.29 diff -c -r1.29 semantic-fw.el *** semantic-fw.el 19 Feb 2004 01:17:52 -0000 1.29 --- semantic-fw.el 19 Feb 2004 08:13:40 -0000 *************** *** 104,113 **** (defvar semantic-cache-data-overlays nil "List of all overlays waiting to be flushed.") ! (defun semantic-cache-data-to-buffer (buffer start end value tag &optional lifespan) "In BUFFER over the region START END, remember VALUE. ! TAG specifies a special name that can be searched for later to ! recover the cached data with `sematnic-get-cache-data'. LIFESPAN indicates how long the data cache will be remembered. The default LIFESPAN is 'end-of-command. Possible Lifespans are: --- 104,113 ---- (defvar semantic-cache-data-overlays nil "List of all overlays waiting to be flushed.") ! (defun semantic-cache-data-to-buffer (buffer start end value name &optional lifespan) "In BUFFER over the region START END, remember VALUE. ! NAME specifies a special name that can be searched for later to ! recover the cached data with `semantic-get-cache-data'. LIFESPAN indicates how long the data cache will be remembered. The default LIFESPAN is 'end-of-command. Possible Lifespans are: *************** *** 115,173 **** executing command. 'exit-cache-zone - Remove when point leaves the overlay at the end of the currently executing command." ! (let ((o (semantic-make-overlay start end buffer)) ! (life (or lifespan 'end-of-command)) ! ) (semantic-overlay-put o 'cached-value value) ! (semantic-overlay-put o 'lifespan life) ! (semantic-overlay-put o 'tag tag) (setq semantic-cache-data-overlays ! (cons o semantic-cache-data-overlays)) ;;(message "Adding to cache: %s" o) ! (cond ! ((or (eq life 'end-of-command) ! (eq life 'exit-cache-zone)) ! (add-hook 'post-command-hook 'semantic-cache-data-post-command-hook) ! ) ! (t (error "Semantic-cache-data-to-buffer: Unknown LIFESPAN: %s" life))) )) (defun semantic-cache-data-post-command-hook () "Flush `semantic-cache-data-overlays' based 'lifespan property. Remove self from `post-command-hook' if it is empty." (let ((newcache nil) ! (oldcache semantic-cache-data-overlays)) (while oldcache ! (let* ((o (car semantic-cache-data-overlays)) ! (life (semantic-overlay-get o 'lifespan)) ! ) ! (if (or (eq life 'end-of-command) ! (and (eq life 'exit-cache-zone) ! (not (member o (semantic-overlays-at (point)))))) ! (progn ! ;;(message "Removing from cache: %s" (car semantic-cache-data-overlays)) ! (semantic-overlay-delete o) ! ) ! (setq newcache (cons o newcache)))) (setq oldcache (cdr oldcache))) ! (setq semantic-cache-data-overlays ! (nreverse newcache))) ;; Remove ourselves if we have removed all overlays. (unless semantic-cache-data-overlays ! (remove-hook 'post-command-hook 'semantic-cache-data-post-command-hook))) ! (defun semantic-get-cache-data (tag &optional point) ! "Get cached data with TAG from optional POINT." (save-excursion (if point (goto-char point)) (let ((o (semantic-overlays-at (point))) ! (ans nil)) (while (and (not ans) o) ! (when (equal (semantic-overlay-get (car o) 'tag) tag) ! (setq ans (car o))) ! (setq o (cdr o))) ! (when ans (semantic-overlay-get ans 'cached-value))))) (defun semantic-test-data-cache () "Test the data cache." --- 115,172 ---- executing command. 'exit-cache-zone - Remove when point leaves the overlay at the end of the currently executing command." ! ;; Check if LIFESPAN is valid before to create any overlay ! (or lifespan (setq lifespan 'end-of-command)) ! (or (memq lifespan '(end-of-command exit-cache-zone)) ! (error "semantic-cache-data-to-buffer: Unknown LIFESPAN: %s" ! lifespan)) ! (let ((o (semantic-make-overlay start end buffer))) ! (semantic-overlay-put o 'cache-name name) (semantic-overlay-put o 'cached-value value) ! (semantic-overlay-put o 'lifespan lifespan) (setq semantic-cache-data-overlays ! (cons o semantic-cache-data-overlays)) ;;(message "Adding to cache: %s" o) ! (add-hook 'post-command-hook 'semantic-cache-data-post-command-hook) )) (defun semantic-cache-data-post-command-hook () "Flush `semantic-cache-data-overlays' based 'lifespan property. Remove self from `post-command-hook' if it is empty." (let ((newcache nil) ! (oldcache semantic-cache-data-overlays)) (while oldcache ! (let* ((o (car oldcache)) ! (life (semantic-overlay-get o 'lifespan)) ! ) ! (if (or (eq life 'end-of-command) ! (and (eq life 'exit-cache-zone) ! (not (member o (semantic-overlays-at (point)))))) ! (progn ! ;;(message "Removing from cache: %s" (car semantic-cache-data-overlays)) ! (semantic-overlay-delete o) ! ) ! (setq newcache (cons o newcache)))) (setq oldcache (cdr oldcache))) ! (setq semantic-cache-data-overlays (nreverse newcache))) ;; Remove ourselves if we have removed all overlays. (unless semantic-cache-data-overlays ! (remove-hook 'post-command-hook ! 'semantic-cache-data-post-command-hook))) ! (defun semantic-get-cache-data (name &optional point) ! "Get cached data with NAME from optional POINT." (save-excursion (if point (goto-char point)) (let ((o (semantic-overlays-at (point))) ! (ans nil)) (while (and (not ans) o) ! (if (equal (semantic-overlay-get (car o) 'cache-name) name) ! (setq ans (car o)) ! (setq o (cdr o)))) ! (when ans ! (semantic-overlay-get ans 'cached-value))))) (defun semantic-test-data-cache () "Test the data cache." |
From: Eric M. L. <er...@si...> - 2004-02-19 14:16:41
|
>>> David PONCE <dav...@wa...> seems to think that: >Hi Eric, > >> I've introduced a new kind of data cache behind the API fcn in >> semantic-fw.el. The starting point is: >> `semantic-cache-data-to-buffer'. This will link a data structure to >> a specific region of a buffer. You can retrieve the data with >> `semantic-get-cache-data' iff the point is in the region. [ ... ] >> This is very useful with the idle scheduler. Both summary mode and >> the completion mode need that context. This basically cuts the >> calculation time spent in the idle scheduler in half. Huzzah! > >That looks like a very good idea! > >I have a suggestion: to replace `tag' in that data cache API with >cache name, or something like that, to avoid confusion with the >general meaning of `tag' in semantic. > >Also it looks that there is a small bug in the >`semantic-cache-data-post-command-hook' loop, which only look at the >first overlay in `semantic-cache-data-overlays'. > >Finally, in `semantic-cache-data-to-buffer' I think it would be >better to check if LIFESPAN is valid before to create the overlay and >push it in `semantic-cache-data-overlays'. [ ... ] Hi David, Thanks for checking up on it. You are right makes sense not to use tag. We use 'tag' for this naming purpose in our object system here at The MathWorks. You other identifications are correct as well. I do appreciate your patch. Thanks Eric -- Eric Ludlam: za...@gn..., er...@si... Home: http://www.ludlam.net Siege: www.siege-engine.com Emacs: http://cedet.sourceforge.net GNU: www.gnu.org |
From: David P. <dav...@wa...> - 2004-02-19 17:20:14
|
> Thanks for checking up on it. You are right makes sense not to use > tag. We use 'tag' for this naming purpose in our object system here > at The MathWorks. > > You other identifications are correct as well. I do appreciate your > patch. I checked it in. David |