[bknr-cvs] ksprotte changed trunk/projects/bos/web/contract-tree.lisp

BKNR Commits bknr at bknr.net
Wed Jul 16 11:59:12 UTC 2008


Revision: 3457
Author: ksprotte
URL: http://bknr.net/trac/changeset/3457

contract-tree new function (contract-tree-update-images-if-needed)
that now is very fast in the case that there are no updates to be done

U   trunk/projects/bos/web/contract-tree.lisp

Modified: trunk/projects/bos/web/contract-tree.lisp
===================================================================
--- trunk/projects/bos/web/contract-tree.lisp	2008-07-16 10:20:49 UTC (rev 3456)
+++ trunk/projects/bos/web/contract-tree.lisp	2008-07-16 11:59:12 UTC (rev 3457)
@@ -268,12 +268,26 @@
             (delete-file (blob-pathname old-store-image))
             (delete-object old-store-image)))))))
 
+(defun contract-node-update-image-needed-p (node)
+  (or (null (image node))
+      (> (timestamp node) (blob-timestamp (image node)))))
+
 (defun contract-node-update-image-if-needed (node)
-  (when (or (null (image node))
-            (not (probe-file (blob-pathname (image node))))
-            (> (timestamp node) (blob-timestamp (image node))))
+  (when (contract-node-update-image-needed-p node)
     (contract-node-update-image node)))
 
+(defun contract-tree-update-images-if-needed ()
+  ;; I did not see an easy way to avoid that
+  ;; CONTRACT-NODE-UPDATE-IMAGE-NEEDED-P is called twice for every
+  ;; node. Once inside CONTRACT-NODE-UPDATE-IMAGE-IF-NEEDED and once
+  ;; for the prune-test.
+  
+  ;; Let's hope we are lucky and there is nothing to do by inspecting
+  ;; *contract-tree* at first only once.
+  (when (contract-node-update-image-needed-p *contract-tree*)
+    (map-nodes #'contract-node-update-image-if-needed *contract-tree*
+               :prune-test (lambda (node) (not (contract-node-update-image-needed-p node))))))
+
 ;;; image handler
 (defclass contract-tree-image-handler (page-handler)
   ())
@@ -300,7 +314,7 @@
     (when (contract-published-p contract)
       (insert-contract *contract-tree* contract)))
   (format t "~&rendering contract-tree images if needed...") (force-output)
-  (map-nodes #'contract-node-update-image-if-needed *contract-tree*)
+  (contract-tree-update-images-if-needed)
   (format t "done.~%") (force-output)  
   (geometry:register-rect-subscriber geometry:*rect-publisher* *contract-tree*
                                      (list 0 0 +width+ +width+)




More information about the Bknr-cvs mailing list