Skip to content

Commit

Permalink
Adds double checked locking to delay the initialisation of pyramidisa…
Browse files Browse the repository at this point in the history
…tion - allows to properly override the initial cache.

Fix #26
  • Loading branch information
NicoKiaru committed Jul 22, 2024
1 parent d8be8aa commit f31ff60
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 54 deletions.
4 changes: 4 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@
<!-- only used in tests! -->
<bigdataviewer-playground.version>0.8.1</bigdataviewer-playground.version>
<bigdataviewer-biop-tools.version>0.7.3</bigdataviewer-biop-tools.version>
<bf.version>8.0.0-SNAPSHOT</bf.version>

<!-- <scijava.app.directory>C:/Fiji_template</scijava.app.directory> -->
<!-- <scijava.app.subdirectory>plugins/BIOP</scijava.app.subdirectory> -->
Expand All @@ -166,6 +167,7 @@
<dependency>
<groupId>ome</groupId>
<artifactId>formats-bsd</artifactId>
<version>${bf.version}</version>
<exclusions>
<exclusion>
<!-- NB: Exclude problematic uber-JAR that bundles commons-io. -->
Expand All @@ -183,6 +185,7 @@
<dependency>
<groupId>ome</groupId>
<artifactId>formats-api</artifactId>
<version>${bf.version}</version>
<exclusions>
<exclusion>
<!-- NB: Exclude problematic uber-JAR that bundles commons-io. -->
Expand All @@ -200,6 +203,7 @@
<dependency>
<groupId>ome</groupId>
<artifactId>formats-gpl</artifactId>
<version>${bf.version}</version>
<exclusions>
<exclusion>
<!-- NB: Exclude problematic uber-JAR that bundles commons-io. -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,70 +101,80 @@ protected PyramidizeSetupLoader(PyramidizeOpener<?> opener, int channelIdx, int
mmResolutions[iLevel][2] = 1;
}

}

T t = (T) opener.getPixelType();


PyramidizeArrayLoaders.PyramidizeArrayLoader loader;
if (t instanceof UnsignedByteType) {
loader = new PyramidizeArrayLoaders.PyramidizeByteArrayLoader(this);
} else if (t instanceof UnsignedShortType) {
loader = new PyramidizeArrayLoaders.PyramidizeShortArrayLoader(this);
} else if (t instanceof FloatType) {
loader = new PyramidizeArrayLoaders.PyramidizeFloatArrayLoader(this);
} else if (t instanceof IntType) {
loader = new PyramidizeArrayLoaders.PyramidizeIntArrayLoader(this);
} else if (t instanceof ARGBType) {
loader = new PyramidizeArrayLoaders.PyramidizeARGBArrayLoader(this);
} else {
throw new UnsupportedOperationException("Pixel type " + t.getClass()
.getName() + " unsupported in " + PyramidizeSetupLoader.class
.getName());
}

for (int tp = 0; tp< opener.getNTimePoints(); tp++) {
raiTL.add(new ArrayList<>());
raiTLV.add(new ArrayList<>());

for (int level = 1; level< opener.nResolutionLevels; level++) {
int tileSizeLevel = tileSize(level);
final int[] cellDimensions = new int[]{ tileSizeLevel, tileSizeLevel, 1 };
final RandomAccessibleInterval<T> raiBelow;
if (level==1) {
raiBelow = getImage(tp,0);
} else {
raiBelow = raiTL.get(tp).get(level-2);
}
long[] newDimensions = new long[3];
newDimensions[0] = raiBelow.dimensionsAsLongArray()[0]/2;
newDimensions[1] = raiBelow.dimensionsAsLongArray()[1]/2;
newDimensions[2] = raiBelow.dimensionsAsLongArray()[2];
CellGrid grid = new CellGrid(newDimensions, cellDimensions);

int priority = opener.nResolutionLevels - level;
CacheHints cacheHints = new CacheHints(LoadingStrategy.BLOCKING,
priority, false);

raiTL.get(tp).add(cacheSupplier.get().createImg(grid, tp, setup, level,
cacheHints, (CacheArrayLoader<A>) loader, type));

priority = opener.nResolutionLevels - level;
cacheHints = new CacheHints(LoadingStrategy.BUDGETED,
priority, false);
volatile boolean hasBeenInitialised = false;

void ensureInitialisation() {
// delayed initialisation to allow the override of the cache
if (hasBeenInitialised) return;
// here: not initialisation
synchronized (this) {
if (hasBeenInitialised) return;

T t = (T) opener.getPixelType();

PyramidizeArrayLoaders.PyramidizeArrayLoader loader;
if (t instanceof UnsignedByteType) {
loader = new PyramidizeArrayLoaders.PyramidizeByteArrayLoader(this);
} else if (t instanceof UnsignedShortType) {
loader = new PyramidizeArrayLoaders.PyramidizeShortArrayLoader(this);
} else if (t instanceof FloatType) {
loader = new PyramidizeArrayLoaders.PyramidizeFloatArrayLoader(this);
} else if (t instanceof IntType) {
loader = new PyramidizeArrayLoaders.PyramidizeIntArrayLoader(this);
} else if (t instanceof ARGBType) {
loader = new PyramidizeArrayLoaders.PyramidizeARGBArrayLoader(this);
} else {
throw new UnsupportedOperationException("Pixel type " + t.getClass()
.getName() + " unsupported in " + PyramidizeSetupLoader.class
.getName());
}

raiTLV.get(tp).add(cacheSupplier.get().createImg(grid, tp, setup, level,
cacheHints, (CacheArrayLoader<A>) loader, volatileType));
for (int tp = 0; tp< opener.getNTimePoints(); tp++) {
raiTL.add(new ArrayList<>());
raiTLV.add(new ArrayList<>());

for (int level = 1; level< opener.nResolutionLevels; level++) {
int tileSizeLevel = tileSize(level);
final int[] cellDimensions = new int[]{ tileSizeLevel, tileSizeLevel, 1 };
final RandomAccessibleInterval<T> raiBelow;
if (level==1) {
raiBelow = getImage(tp,0);
} else {
raiBelow = raiTL.get(tp).get(level-2);
}
long[] newDimensions = new long[3];
newDimensions[0] = raiBelow.dimensionsAsLongArray()[0]/2;
newDimensions[1] = raiBelow.dimensionsAsLongArray()[1]/2;
newDimensions[2] = raiBelow.dimensionsAsLongArray()[2];
CellGrid grid = new CellGrid(newDimensions, cellDimensions);

int priority = opener.nResolutionLevels - level;
CacheHints cacheHints = new CacheHints(LoadingStrategy.BLOCKING,
priority, false);

raiTL.get(tp).add(cacheSupplier.get().createImg(grid, tp, setup, level,
cacheHints, (CacheArrayLoader<A>) loader, type));

priority = opener.nResolutionLevels - level;
cacheHints = new CacheHints(LoadingStrategy.BUDGETED,
priority, false);

raiTLV.get(tp).add(cacheSupplier.get().createImg(grid, tp, setup, level,
cacheHints, (CacheArrayLoader<A>) loader, volatileType));

}
}
hasBeenInitialised = true;
loader.init();
}

loader.init();

}

@Override
public RandomAccessibleInterval<V> getVolatileImage(int timepointId, int level, ImgLoaderHint... hints) {
if (level == 0) return level0SetupLoader.getVolatileImage(timepointId, level, hints);
ensureInitialisation();
return raiTLV.get(timepointId).get(level-1);
}

Expand All @@ -176,6 +186,7 @@ public Dimensions getImageSize(int timepointId, int level) {
@Override
public RandomAccessibleInterval<T> getImage(int timepointId, int level, ImgLoaderHint... hints) {
if (level==0) return level0SetupLoader.getImage(timepointId, level, hints);
ensureInitialisation();
return raiTL.get(timepointId).get(level-1);
}

Expand Down

0 comments on commit f31ff60

Please sign in to comment.