This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-vfs.git
The following commit(s) were added to refs/heads/master by this push: new 714c42a78 Reuse LockingVisitors new 08e80802f Merge branch 'master' of https://gitbox.apache.org/repos/asf/commons-vfs.git 714c42a78 is described below commit 714c42a782a0c6ef1e08c98d1f648f6a61cfc980 Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Thu Mar 27 12:00:03 2025 -0400 Reuse LockingVisitors --- .../apache/commons/vfs2/cache/LRUFilesCache.java | 75 ++++++---------------- 1 file changed, 20 insertions(+), 55 deletions(-) diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/cache/LRUFilesCache.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/cache/LRUFilesCache.java index 2837ef5cc..240d8afaa 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/cache/LRUFilesCache.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/cache/LRUFilesCache.java @@ -19,13 +19,14 @@ package org.apache.commons.vfs2.cache; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.apache.commons.collections4.map.AbstractLinkedMap; import org.apache.commons.collections4.map.LRUMap; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.concurrent.locks.LockingVisitors; +import org.apache.commons.lang3.concurrent.locks.LockingVisitors.ReadWriteLockVisitor; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.vfs2.FileName; @@ -64,9 +65,7 @@ public class LRUFilesCache extends AbstractFilesCache { synchronized (LRUFilesCache.this) { @SuppressWarnings("resource") // FileObject allocated elsewhere. final FileObject fileObject = linkEntry.getValue(); - // System.err.println(">>> " + size() + " check removeLRU:" + linkEntry.getKey().toString()); - if (fileObject.isAttached() || fileObject.isContentOpen()) { // do not allow open or attached files to be removed // System.err.println(">>> " + size() + " VETO removeLRU:" + @@ -74,7 +73,6 @@ public class LRUFilesCache extends AbstractFilesCache { // file.isContentOpen() + ")"); return false; } - // System.err.println(">>> " + size() + " removeLRU:" + linkEntry.getKey().toString()); if (super.removeLRU(linkEntry)) { // force detach @@ -85,7 +83,6 @@ public class LRUFilesCache extends AbstractFilesCache { } return true; } - return false; } } @@ -122,16 +119,10 @@ public class LRUFilesCache extends AbstractFilesCache { @Override public void clear(final FileSystem filesystem) { - final Map<FileName, FileObject> files = getOrCreateFilesystemCache(filesystem); - - writeLock().lock(); - try { - files.clear(); - + createLockingVisitors(filesystem).acceptReadLocked(m -> { + m.clear(); fileSystemCache.remove(filesystem); - } finally { - writeLock().unlock(); - } + }); } @Override @@ -140,15 +131,17 @@ public class LRUFilesCache extends AbstractFilesCache { fileSystemCache.clear(); } + private ReadWriteLockVisitor<Map<FileName, FileObject>> createLockingVisitors(final FileObject file) { + return createLockingVisitors(file.getFileSystem()); + } + + private ReadWriteLockVisitor<Map<FileName, FileObject>> createLockingVisitors(final FileSystem filesystem) { + return LockingVisitors.create(getOrCreateFilesystemCache(filesystem), rwLock); + } + @Override public FileObject getFile(final FileSystem filesystem, final FileName name) { - final Map<FileName, FileObject> files = getOrCreateFilesystemCache(filesystem); - readLock().lock(); - try { - return files.get(name); - } finally { - readLock().unlock(); - } + return createLockingVisitors(filesystem).applyReadLocked(m -> m.get(name)); } /** @@ -163,46 +156,22 @@ public class LRUFilesCache extends AbstractFilesCache { @Override public void putFile(final FileObject file) { - final Map<FileName, FileObject> files = getOrCreateFilesystemCache(file.getFileSystem()); - - writeLock().lock(); - try { - files.put(file.getName(), file); - } finally { - writeLock().unlock(); - } + createLockingVisitors(file).acceptWriteLocked(m -> m.put(file.getName(), file)); } @Override public boolean putFileIfAbsent(final FileObject file) { - final Map<FileName, FileObject> files = getOrCreateFilesystemCache(file.getFileSystem()); - - writeLock().lock(); - try { - return files.putIfAbsent(file.getName(), file) == null; - } finally { - writeLock().unlock(); - } - } - - private Lock readLock() { - return rwLock.readLock(); + return createLockingVisitors(file).applyWriteLocked(m -> m.putIfAbsent(file.getName(), file) == null); } @Override public void removeFile(final FileSystem filesystem, final FileName name) { - final Map<?, ?> files = getOrCreateFilesystemCache(filesystem); - - writeLock().lock(); - try { - files.remove(name); - - if (files.isEmpty()) { + createLockingVisitors(filesystem).acceptWriteLocked(m -> { + m.remove(name); + if (m.isEmpty()) { fileSystemCache.remove(filesystem); } - } finally { - writeLock().unlock(); - } + }); } @Override @@ -210,8 +179,4 @@ public class LRUFilesCache extends AbstractFilesCache { // this moves the file back on top getFile(file.getFileSystem(), file.getName()); } - - private Lock writeLock() { - return rwLock.writeLock(); - } }