OSDN Git Service

DO NOT MERGE: Removing the use of FileCanonPathCache.
authorJesse Wilson <jessewilson@google.com>
Tue, 24 Nov 2009 01:58:43 +0000 (17:58 -0800)
committerJesse Wilson <jessewilson@google.com>
Tue, 24 Nov 2009 02:02:44 +0000 (18:02 -0800)
Aside from being an unjustified optimization, users have reported
problems with this in the wild. This cache has already been removed
in master.

libcore/luni/src/main/java/java/io/File.java
libcore/luni/src/main/java/org/apache/harmony/luni/internal/io/FileCanonPathCache.java [deleted file]
libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/io/AllTests.java
libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/io/FileCanonPathCacheTest.java [deleted file]

index c802995..d4c347f 100644 (file)
@@ -25,7 +25,7 @@ import java.security.SecureRandom;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.harmony.luni.internal.io.FileCanonPathCache;
+// import org.apache.harmony.luni.internal.io.FileCanonPathCache;
 import org.apache.harmony.luni.util.DeleteOnExit;
 import org.apache.harmony.luni.util.Msg;
 import org.apache.harmony.luni.util.PriviAction;
@@ -497,11 +497,15 @@ public class File implements Serializable, Comparable<File> {
     public String getCanonicalPath() throws IOException {
         byte[] result = properPath(false);
         String absPath = Util.toUTF8String(result);
-        String canonPath = FileCanonPathCache.get(absPath);
 
-        if (canonPath != null) {
-            return canonPath;
-        }
+        // BEGIN android-removed
+        //     caching the canonical path is completely bogus
+        // String canonPath = FileCanonPathCache.get(absPath);
+        // if (canonPath != null) {
+        //     return canonPath;
+        // }
+        // END android-removed
+
         if(separatorChar == '/') {
             // resolve the full path first
             result = resolveLink(result, result.length, false);
@@ -573,9 +577,13 @@ public class File implements Serializable, Comparable<File> {
         newResult[newLength] = 0;
         newResult = getCanonImpl(newResult);
         newLength = newResult.length;
-        canonPath = Util.toUTF8String(newResult, 0, newLength);
-        FileCanonPathCache.put(absPath, canonPath);
-        return canonPath;
+
+        // BEGIN android-changed
+        //     caching the canonical path is completely bogus
+        return Util.toUTF8String(newResult, 0, newLength);
+        // FileCanonPathCache.put(absPath, canonPath);
+        // return canonPath;
+        // END android-changed
     }
 
     /*
diff --git a/libcore/luni/src/main/java/org/apache/harmony/luni/internal/io/FileCanonPathCache.java b/libcore/luni/src/main/java/org/apache/harmony/luni/internal/io/FileCanonPathCache.java
deleted file mode 100644 (file)
index e3ea7b5..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package org.apache.harmony.luni.internal.io;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-
-/**
- * A simple cache implementation for file's canonical path. The cache has fixed
- * size <code> CACHE_SIZE </code> and cached elements would be expired. If
- * <code>put<code> method is invoked when cache is full, the oldest element will be removed.
- *
- */
-public class FileCanonPathCache {
-
-    static private class CacheElement {
-        String canonicalPath;
-
-        long timestamp;
-
-        public CacheElement(String path) {
-            this.canonicalPath = path;
-            this.timestamp = System.currentTimeMillis();
-        }
-    }
-
-    /**
-     * Max elemnts could be hold in the cache.
-     */
-    public static final int CACHE_SIZE = 256;
-
-    private static HashMap<String, CacheElement> cache = new HashMap<String, CacheElement>(
-            CACHE_SIZE);
-
-    /**
-     * FIFO queue for tracking age of elements.
-     */
-    private static LinkedList<String> list = new LinkedList<String>();
-
-    private static Object lock = new Object();
-
-    /**
-     * Expired time.
-     */
-    private static long timeout = 600000;
-
-    /**
-     * Retrieve element from cache.
-     * 
-     * @param path
-     *            absolute path.
-     * @return canonical path of <code>path</code> if it's in cache.
-     * 
-     */
-    public static String get(String path) {
-        CacheElement element = null;
-        synchronized (lock) {
-            element = cache.get(path);
-        }
-
-        if (element == null) {
-            return null;
-        }
-
-        long time = System.currentTimeMillis();
-        if (time - element.timestamp > timeout) {
-            // remove all elements older than this one
-            synchronized (lock) {
-                if (cache.get(path) != null) {
-                    String oldest = null;
-                    do {
-                        oldest = list.removeFirst();
-                        cache.remove(path);
-                    } while (!path.equals(oldest));
-                }
-            }
-            return null;
-        }
-
-        return element.canonicalPath;
-    }
-
-    /**
-     * Put element to cache.
-     * 
-     * @param path
-     *            absolute path.
-     * @param canonicalPath
-     *            the canonical path of <code>path</code>.
-     */
-    public static void put(String path, String canonicalPath) {
-        CacheElement element = new CacheElement(canonicalPath);
-        synchronized (lock) {
-            if (cache.size() >= CACHE_SIZE) {
-                // cache is full
-                String oldest = list.removeFirst();
-                cache.remove(oldest);
-            }
-            cache.put(path, element);
-            list.addLast(path);
-        }
-    }
-
-    /**
-     * Remove all elements from cache.
-     */
-    public static void clear() {
-        synchronized (lock) {
-            cache.clear();
-            list.clear();
-        }
-    }
-
-    public static long getTimeout() {
-        return timeout;
-    }
-
-    public static void setTimeout(long timeout) {
-        FileCanonPathCache.timeout = timeout;
-    }
-}
index 056b521..778e527 100644 (file)
@@ -34,7 +34,6 @@ public class AllTests
         TestSuite suite = tests.TestSuiteFactory.createTestSuite("Tests for java.io");
 
         suite.addTestSuite(BufferedReaderTest.class);
-        suite.addTestSuite(FileCanonPathCacheTest.class);
         suite.addTestSuite(FilePermissionTest.class);
         suite.addTestSuite(FileTest.class);
         suite.addTestSuite(InputStreamReaderTest.class);
diff --git a/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/io/FileCanonPathCacheTest.java b/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/io/FileCanonPathCacheTest.java
deleted file mode 100644 (file)
index f2ac7f3..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package org.apache.harmony.luni.tests.java.io;
-
-import java.io.File;
-
-import org.apache.harmony.luni.internal.io.FileCanonPathCache;
-
-import junit.framework.TestCase;
-
-public class FileCanonPathCacheTest extends TestCase {
-
-    private static int DEFAULT_TIMEOUT = 600000;
-
-    @Override
-    public void setUp() throws Exception {
-        FileCanonPathCache.clear();
-        FileCanonPathCache.setTimeout(DEFAULT_TIMEOUT);
-    }
-
-    public void testGetSet() throws Exception {
-        File file1 = new File("test/hello~1");
-        assertNull(FileCanonPathCache.get(file1.getAbsolutePath()));
-        FileCanonPathCache.put(file1.getAbsolutePath(), file1
-                .getCanonicalPath());
-        assertEquals(file1.getCanonicalPath(), FileCanonPathCache.get(file1
-                .getAbsolutePath()));
-
-        File file2 = new File("test/world~1");
-        assertNull(FileCanonPathCache.get(file2.getAbsolutePath()));
-        FileCanonPathCache.put(file2.getAbsolutePath(), file2
-                .getCanonicalPath());
-        assertEquals(file2.getCanonicalPath(), FileCanonPathCache.get(file2
-                .getAbsolutePath()));
-
-        assertNull(FileCanonPathCache.get("notexist"));
-    }
-
-    public void testGetTimeout01() throws Exception {
-        FileCanonPathCache.setTimeout(10);
-
-        File file1 = new File("test/hello~1");
-        assertNull(FileCanonPathCache.get(file1.getAbsolutePath()));
-        FileCanonPathCache.put(file1.getAbsolutePath(), file1
-                .getCanonicalPath());
-        Thread.sleep(50);
-        assertNull(FileCanonPathCache.get(file1.getAbsolutePath()));
-    }
-
-    public void testGetTimeout02() throws Exception {
-        FileCanonPathCache.setTimeout(10);
-
-        File file1 = new File("test/hello~1");
-        assertNull(FileCanonPathCache.get(file1.getAbsolutePath()));
-        FileCanonPathCache.put(file1.getAbsolutePath(), file1
-                .getCanonicalPath());
-        File file2 = new File("test/hello~2");
-        assertNull(FileCanonPathCache.get(file2.getAbsolutePath()));
-        FileCanonPathCache.put(file2.getAbsolutePath(), file2
-                .getCanonicalPath());
-        File file3 = new File("test/hello~3");
-        assertNull(FileCanonPathCache.get(file3.getAbsolutePath()));
-        FileCanonPathCache.put(file3.getAbsolutePath(), file3
-                .getCanonicalPath());
-        File file4 = new File("test/hello~4");
-        assertNull(FileCanonPathCache.get(file4.getAbsolutePath()));
-        FileCanonPathCache.put(file4.getAbsolutePath(), file4
-                .getCanonicalPath());
-        File file5 = new File("test/hello~5");
-        assertNull(FileCanonPathCache.get(file5.getAbsolutePath()));
-        FileCanonPathCache.put(file5.getAbsolutePath(), file5
-                .getCanonicalPath());
-
-        Thread.sleep(50);
-
-        assertNull(FileCanonPathCache.get(file1.getAbsolutePath()));
-        assertNull(FileCanonPathCache.get(file2.getAbsolutePath()));
-        assertNull(FileCanonPathCache.get(file3.getAbsolutePath()));
-        assertNull(FileCanonPathCache.get(file4.getAbsolutePath()));
-        assertNull(FileCanonPathCache.get(file5.getAbsolutePath()));
-    }
-
-    public void testCacheFull() throws Exception {
-        int cacheSize = FileCanonPathCache.CACHE_SIZE;
-        File[] files = new File[cacheSize];
-        for (int i = 0; i < cacheSize; ++i) {
-            files[i] = new File("test/world" + i);
-            FileCanonPathCache.put(files[i].getAbsolutePath(), files[i]
-                    .getCanonicalPath());
-        }
-
-        for (int i = cacheSize; i < files.length; ++i) {
-            assertEquals(files[i - cacheSize].getCanonicalPath(),
-                    FileCanonPathCache.get(files[i - cacheSize]
-                            .getAbsolutePath()));
-            files[i] = new File("test/world" + i);
-            FileCanonPathCache.put(files[i].getAbsolutePath(), files[i]
-                    .getCanonicalPath());
-            assertEquals(files[i].getCanonicalPath(), FileCanonPathCache
-                    .get(files[i].getAbsolutePath()));
-            assertNull(FileCanonPathCache.get(files[i - cacheSize]
-                    .getAbsolutePath()));
-        }
-    }
-}