Skip to content

Commit 384153d

Browse files
Memoizer: ask any ImageReader instances to remove all but the current reader
1 parent 783bb54 commit 384153d

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

components/formats-api/src/loci/formats/ImageReader.java

+18
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,24 @@ public ImageReader(ClassList<IFormatReader> classList) {
150150

151151
// -- ImageReader API methods --
152152

153+
/**
154+
* Intended for use prior to caching an initialized reader.
155+
* This removes everything except the current reader from the
156+
* list of possible readers to use. Be very careful, and do
157+
* not call this method on an ImageReader that may be reused
158+
* for multiple different files.
159+
*
160+
* If the current reader index is less than 0 (i.e. not initialized),
161+
* this does nothing.
162+
*/
163+
protected void cleanupReaderList() {
164+
if (current >= 0) {
165+
IFormatReader currentReader = readers[current];
166+
current = 0;
167+
readers = new IFormatReader[] {currentReader};
168+
}
169+
}
170+
153171
/**
154172
* Toggles whether or not file system access is allowed when doing type
155173
* detection. By default, file system access is allowed.

components/formats-bsd/src/loci/formats/Memoizer.java

+11
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,17 @@ public void saveRevision(String revision) {
208208

209209
@Override
210210
public void saveReader(IFormatReader reader) {
211+
// clean up reader list in any instances of ImageReader
212+
IFormatReader r = reader;
213+
while (r instanceof ReaderWrapper || r instanceof ImageReader) {
214+
if (r instanceof ImageReader) {
215+
ImageReader ir = (ImageReader) r;
216+
ir.cleanupReaderList();
217+
r = ir.getReader();
218+
}
219+
else r = ((ReaderWrapper) r).getReader();
220+
}
221+
211222
kryo.writeObject(output, reader.getClass());
212223
kryo.writeObject(output, reader);
213224
}

0 commit comments

Comments
 (0)