[cmucl-commit] CMUCL commit: src/code (intl.lisp)

Raymond Toy rtoy at common-lisp.net
Mon Dec 13 01:19:38 CET 2010


    Date: Sunday, December 12, 2010 @ 19:19:38
  Author: rtoy
    Path: /project/cmucl/cvsroot/src/code

Modified: intl.lisp

Revert previous change.  Instead of caching probe-file, have
LOAD-DOMAIN return an appropriate entry instead of returning NIL.
This still gets rid of all the stats.

Solution from Paul Foley.


-----------+
 intl.lisp |   77 ++++++++++++++++++++++++------------------------------------
 1 file changed, 31 insertions(+), 46 deletions(-)


Index: src/code/intl.lisp
diff -u src/code/intl.lisp:1.9 src/code/intl.lisp:1.10
--- src/code/intl.lisp:1.9	Sat Dec 11 17:39:46 2010
+++ src/code/intl.lisp	Sun Dec 12 19:19:38 2010
@@ -1,6 +1,6 @@
 ;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Package: INTL -*-
 
-;;; $Revision: 1.9 $
+;;; $Revision: 1.10 $
 ;;; Copyright 1999-2010 Paul Foley (mycroft at actrix.gen.nz)
 ;;;
 ;;; Permission is hereby granted, free of charge, to any person obtaining
@@ -23,7 +23,7 @@
 ;;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 ;;; USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 ;;; DAMAGE.
-(ext:file-comment "$Header: /project/cmucl/cvsroot/src/code/intl.lisp,v 1.9 2010-12-11 22:39:46 rtoy Exp $")
+(ext:file-comment "$Header: /project/cmucl/cvsroot/src/code/intl.lisp,v 1.10 2010-12-13 00:19:38 rtoy Exp $")
 
 (in-package "INTL")
 
@@ -79,49 +79,29 @@
      (ash (the (unsigned-byte 8) (read-byte stream)) 8)
      (the (unsigned-byte 8) (read-byte stream))))
 
-;; If the domain file doesn't exist because the locale isn't
-;; supported, we end up doing a huge number of stats looking for a
-;; non-existent file everytime a translation is needed.  This is
-;; really expensive.  So create a cache to hold the results.
-(let ((domain-file-cache (make-hash-table :test 'equal)))
-  (defun get-domain-file-cache ()
-    ;; Mostly for debugging to let the user get at the cache.
-    domain-file-cache)
-  (defun clear-domain-file-cache ()
-    ;; Mostly for debugging.  But also useful if we now have installed
-    ;; some new translations.
-    (clrhash domain-file-cache))
-  (defun locate-domain-file (domain locale locale-dir)
-    ;; The default locale-dir includes search lists.  If we get called
-    ;; before the search lists are initialized, we lose.  The search
-    ;; lists are initialized in environment-init, which sets
-    ;; *environment-list-initialized*.  This way, we return NIL to
-    ;; indicate there's no domain file to use.
-    (when lisp::*environment-list-initialized*
-      (flet ((path (locale base)
-	       (merge-pathnames (make-pathname :directory (list :relative locale
-								"LC_MESSAGES")
-					       :name domain :type "mo")
-				base))
-	     (memoized-probe-file (p)
-	       ;; Cache the results of probe-file and return the
-	       ;; cached value when possible.
-	       (multiple-value-bind (value foundp)
-		   (gethash p domain-file-cache)
-		 (if foundp
-		     value
-		     (setf (gethash p domain-file-cache) (probe-file p))))))
-	(let ((locale (or (gethash locale *locale-aliases*) locale)))
-	  (dolist (base (if (listp locale-dir) locale-dir (list locale-dir)))
-	    (let ((probe
-		   (or (memoized-probe-file (path locale base))
-		       (let ((dot (position #\. locale)))
-			 (and dot (memoized-probe-file (path (subseq locale 0 dot) base))))
-		       (let ((at (position #\@ locale)))
-			 (and at (memoized-probe-file (path (subseq locale 0 at) base))))
-		       (let ((us (position #\_ locale)))
-			 (and us (memoized-probe-file (path (subseq locale 0 us) base)))))))
-	      (when probe (return probe)))))))))
+(defun locate-domain-file (domain locale locale-dir)
+  ;; The default locale-dir includes search lists.  If we get called
+  ;; before the search lists are initialized, we lose.  The search
+  ;; lists are initialized in environment-init, which sets
+  ;; *environment-list-initialized*.  This way, we return NIL to
+  ;; indicate there's no domain file to use.
+  (when lisp::*environment-list-initialized*
+    (flet ((path (locale base)
+	     (merge-pathnames (make-pathname :directory (list :relative locale
+							      "LC_MESSAGES")
+					     :name domain :type "mo")
+			      base)))
+      (let ((locale (or (gethash locale *locale-aliases*) locale)))
+	(dolist (base (if (listp locale-dir) locale-dir (list locale-dir)))
+	  (let ((probe
+		 (or (probe-file (path locale base))
+		     (let ((dot (position #\. locale)))
+		       (and dot (probe-file (path (subseq locale 0 dot) base))))
+		     (let ((at (position #\@ locale)))
+		       (and at (probe-file (path (subseq locale 0 at) base))))
+		     (let ((us (position #\_ locale)))
+		       (and us (probe-file (path (subseq locale 0 us) base)))))))
+	    (when probe (return probe))))))))
 
 (defun find-encoding (domain)
   (when (null (domain-entry-encoding domain))
@@ -341,7 +321,12 @@
 (defun load-domain (domain locale &optional (locale-dir *locale-directories*))
   (let ((file (locate-domain-file domain locale locale-dir))
 	(read #'read-lelong))
-    (unless file (return-from load-domain nil))
+    (unless file
+      (let ((entry (make-domain-entry :domain domain :locale locale
+				      :hash (make-hash-table :size 0
+							     :test 'equal))))
+	(setf (gethash domain *loaded-domains*) entry)
+	(return-from load-domain entry)))
     (with-open-file (stream file :direction :input :if-does-not-exist nil
 			    :element-type '(unsigned-byte 8))
       (unless stream (return-from load-domain nil))


More information about the cmucl-commit mailing list