libbluray | branch: master | hpi1 <[email protected]> | Tue Nov 4 14:28:12 2014 +0200| [1122e1f42c9dc824b8b44d90429199502efa11ea] | committer: hpi1
CacheDir: remove old files from cache > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=1122e1f42c9dc824b8b44d90429199502efa11ea --- .../bdj/java-j2me/org/videolan/LockFile.java | 32 +++++++++ .../bdj/java-j2se/org/videolan/LockFile.java | 71 ++++++++++++++++++++ src/libbluray/bdj/java/org/videolan/CacheDir.java | 37 ++++++++-- 3 files changed, 136 insertions(+), 4 deletions(-) diff --git a/src/libbluray/bdj/java-j2me/org/videolan/LockFile.java b/src/libbluray/bdj/java-j2me/org/videolan/LockFile.java new file mode 100644 index 0000000..eebc7c9 --- /dev/null +++ b/src/libbluray/bdj/java-j2me/org/videolan/LockFile.java @@ -0,0 +1,32 @@ +/* + * This file is part of libbluray + * Copyright (C) 2014 Petri Hintukainen <[email protected]> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * <http://www.gnu.org/licenses/>. + */ + +package org.videolan; + +class LockFile { + + /* no support for file channels */ + + public static LockFile create(String path) { + return null; + } + + public void release() { + } +} diff --git a/src/libbluray/bdj/java-j2se/org/videolan/LockFile.java b/src/libbluray/bdj/java-j2se/org/videolan/LockFile.java new file mode 100644 index 0000000..7fc2758 --- /dev/null +++ b/src/libbluray/bdj/java-j2se/org/videolan/LockFile.java @@ -0,0 +1,71 @@ +/* + * This file is part of libbluray + * Copyright (C) 2014 Petri Hintukainen <[email protected]> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * <http://www.gnu.org/licenses/>. + */ + +package org.videolan; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; + +class LockFile { + + private LockFile(RandomAccessFile lockFile) { + this.lockFile = lockFile; + } + + public static LockFile create(String path) { + + try { + RandomAccessFile os = new RandomAccessFile(path, "rw"); + if (os.getChannel().tryLock() != null) { + try { + /* Test if locking works: second tryLock() should fail */ + if (os.getChannel().tryLock() != null) { + try { + os.close(); + } catch (Exception e) { + } + logger.error("File locking is unreliable !"); + return null; + } + } catch (Exception e) { + } + return new LockFile(os); + } else { + logger.info("Failed locking " + path); + } + } catch (Exception e) { + logger.error("Failed creating lock file: " + e); + } + return null; + } + + public void release() { + try { + if (lockFile != null) { + lockFile.close(); + } + } catch (Exception e) { + } + } + + private RandomAccessFile lockFile; + + private static final Logger logger = Logger.getLogger(LockFile.class.getName()); +} diff --git a/src/libbluray/bdj/java/org/videolan/CacheDir.java b/src/libbluray/bdj/java/org/videolan/CacheDir.java index 8586bb0..11b8f9e 100644 --- a/src/libbluray/bdj/java/org/videolan/CacheDir.java +++ b/src/libbluray/bdj/java/org/videolan/CacheDir.java @@ -24,20 +24,40 @@ import java.io.IOException; class CacheDir { + private static LockFile lockCache(String path) { + return LockFile.create(path + File.separator + "lock"); + } + + private static void cleanupCache() { + File[] files = new File(baseDir).listFiles(); + if (files != null) { + for (int i = 0; i < files.length; i++) { + File dir = files[i]; + if (dir.isDirectory()) { + LockFile lock = lockCache(dir.getPath()); + if (lock != null) { + lock.release(); + removeImpl(dir); + } + } + } + } + } + private static synchronized File getCacheRoot() throws IOException { if (cacheRoot != null) { return cacheRoot; } - String base = System.getProperty("java.io.tmpdir") + File.separator + - "libbluray-bdj-cache" + File.separator; + cleanupCache(); for (int i = 0; i < 100; i++) { - File tmpDir = new File(base + System.nanoTime()); + File tmpDir = new File(baseDir + System.nanoTime()); tmpDir = new File(tmpDir.getCanonicalPath()); if (tmpDir.mkdirs()) { cacheRoot = tmpDir; + lockFile = lockCache(cacheRoot.getPath()); logger.info("Created cache in " + tmpDir.getPath()); return cacheRoot; } @@ -98,6 +118,12 @@ class CacheDir { } public static synchronized void remove() { + + if (lockFile != null) { + lockFile.release(); + lockFile = null; + } + if (cacheRoot != null) { remove(cacheRoot); cacheRoot = null; @@ -105,5 +131,8 @@ class CacheDir { } private static File cacheRoot = null; - private static final Logger logger = Logger.getLogger(MountManager.class.getName()); + private static LockFile lockFile = null; + + private static final String baseDir = System.getProperty("java.io.tmpdir") + File.separator + "libbluray-bdj-cache" + File.separator; + private static final Logger logger = Logger.getLogger(CacheDir.class.getName()); } _______________________________________________ libbluray-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libbluray-devel
