Skip to content

Commit 714c42a

Browse files
committed
Reuse LockingVisitors
1 parent acab449 commit 714c42a

File tree

1 file changed

+20
-55
lines changed

1 file changed

+20
-55
lines changed

commons-vfs2/src/main/java/org/apache/commons/vfs2/cache/LRUFilesCache.java

Lines changed: 20 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,14 @@
1919
import java.util.Map;
2020
import java.util.concurrent.ConcurrentHashMap;
2121
import java.util.concurrent.ConcurrentMap;
22-
import java.util.concurrent.locks.Lock;
2322
import java.util.concurrent.locks.ReadWriteLock;
2423
import java.util.concurrent.locks.ReentrantReadWriteLock;
2524

2625
import org.apache.commons.collections4.map.AbstractLinkedMap;
2726
import org.apache.commons.collections4.map.LRUMap;
2827
import org.apache.commons.io.IOUtils;
28+
import org.apache.commons.lang3.concurrent.locks.LockingVisitors;
29+
import org.apache.commons.lang3.concurrent.locks.LockingVisitors.ReadWriteLockVisitor;
2930
import org.apache.commons.logging.Log;
3031
import org.apache.commons.logging.LogFactory;
3132
import org.apache.commons.vfs2.FileName;
@@ -64,17 +65,14 @@ protected boolean removeLRU(final AbstractLinkedMap.LinkEntry<FileName, FileObje
6465
synchronized (LRUFilesCache.this) {
6566
@SuppressWarnings("resource") // FileObject allocated elsewhere.
6667
final FileObject fileObject = linkEntry.getValue();
67-
6868
// System.err.println(">>> " + size() + " check removeLRU:" + linkEntry.getKey().toString());
69-
7069
if (fileObject.isAttached() || fileObject.isContentOpen()) {
7170
// do not allow open or attached files to be removed
7271
// System.err.println(">>> " + size() + " VETO removeLRU:" +
7372
// linkEntry.getKey().toString() + " (" + file.isAttached() + "/" +
7473
// file.isContentOpen() + ")");
7574
return false;
7675
}
77-
7876
// System.err.println(">>> " + size() + " removeLRU:" + linkEntry.getKey().toString());
7977
if (super.removeLRU(linkEntry)) {
8078
// force detach
@@ -85,7 +83,6 @@ protected boolean removeLRU(final AbstractLinkedMap.LinkEntry<FileName, FileObje
8583
}
8684
return true;
8785
}
88-
8986
return false;
9087
}
9188
}
@@ -122,16 +119,10 @@ public LRUFilesCache(final int lruSize) {
122119

123120
@Override
124121
public void clear(final FileSystem filesystem) {
125-
final Map<FileName, FileObject> files = getOrCreateFilesystemCache(filesystem);
126-
127-
writeLock().lock();
128-
try {
129-
files.clear();
130-
122+
createLockingVisitors(filesystem).acceptReadLocked(m -> {
123+
m.clear();
131124
fileSystemCache.remove(filesystem);
132-
} finally {
133-
writeLock().unlock();
134-
}
125+
});
135126
}
136127

137128
@Override
@@ -140,15 +131,17 @@ public void close() {
140131
fileSystemCache.clear();
141132
}
142133

134+
private ReadWriteLockVisitor<Map<FileName, FileObject>> createLockingVisitors(final FileObject file) {
135+
return createLockingVisitors(file.getFileSystem());
136+
}
137+
138+
private ReadWriteLockVisitor<Map<FileName, FileObject>> createLockingVisitors(final FileSystem filesystem) {
139+
return LockingVisitors.create(getOrCreateFilesystemCache(filesystem), rwLock);
140+
}
141+
143142
@Override
144143
public FileObject getFile(final FileSystem filesystem, final FileName name) {
145-
final Map<FileName, FileObject> files = getOrCreateFilesystemCache(filesystem);
146-
readLock().lock();
147-
try {
148-
return files.get(name);
149-
} finally {
150-
readLock().unlock();
151-
}
144+
return createLockingVisitors(filesystem).applyReadLocked(m -> m.get(name));
152145
}
153146

154147
/**
@@ -163,55 +156,27 @@ protected Map<FileName, FileObject> getOrCreateFilesystemCache(final FileSystem
163156

164157
@Override
165158
public void putFile(final FileObject file) {
166-
final Map<FileName, FileObject> files = getOrCreateFilesystemCache(file.getFileSystem());
167-
168-
writeLock().lock();
169-
try {
170-
files.put(file.getName(), file);
171-
} finally {
172-
writeLock().unlock();
173-
}
159+
createLockingVisitors(file).acceptWriteLocked(m -> m.put(file.getName(), file));
174160
}
175161

176162
@Override
177163
public boolean putFileIfAbsent(final FileObject file) {
178-
final Map<FileName, FileObject> files = getOrCreateFilesystemCache(file.getFileSystem());
179-
180-
writeLock().lock();
181-
try {
182-
return files.putIfAbsent(file.getName(), file) == null;
183-
} finally {
184-
writeLock().unlock();
185-
}
186-
}
187-
188-
private Lock readLock() {
189-
return rwLock.readLock();
164+
return createLockingVisitors(file).applyWriteLocked(m -> m.putIfAbsent(file.getName(), file) == null);
190165
}
191166

192167
@Override
193168
public void removeFile(final FileSystem filesystem, final FileName name) {
194-
final Map<?, ?> files = getOrCreateFilesystemCache(filesystem);
195-
196-
writeLock().lock();
197-
try {
198-
files.remove(name);
199-
200-
if (files.isEmpty()) {
169+
createLockingVisitors(filesystem).acceptWriteLocked(m -> {
170+
m.remove(name);
171+
if (m.isEmpty()) {
201172
fileSystemCache.remove(filesystem);
202173
}
203-
} finally {
204-
writeLock().unlock();
205-
}
174+
});
206175
}
207176

208177
@Override
209178
public void touchFile(final FileObject file) {
210179
// this moves the file back on top
211180
getFile(file.getFileSystem(), file.getName());
212181
}
213-
214-
private Lock writeLock() {
215-
return rwLock.writeLock();
216-
}
217182
}

0 commit comments

Comments
 (0)