Clear up few todos, introduce tile processing promise to await single tiles.

This commit is contained in:
Aiosa 2024-12-10 14:16:19 +01:00
parent e12a349f52
commit fec033f9d2
4 changed files with 23 additions and 27 deletions

View File

@ -258,10 +258,12 @@ $.Tile = function(level, x, y, bounds, exists, url, context2D, loadWithAjax, aja
*/
this.processing = false;
/**
* Remembers last processing time of the tile, 1 if the tile has just been loaded.
* Processing promise, resolves when the tile exits processing, or
* resolves immediatelly if not in the processing state.
* @member {OpenSeadragon.Promise}
* @private
*/
this.lastProcess = 0;
this.processingPromise = $.Promise.resolve();
};
/** @lends OpenSeadragon.Tile.prototype */
@ -644,7 +646,6 @@ $.Tile.prototype = {
let ref = this._caches[this._cKey];
if (ref) {
// make sure we free drawer internal cache if people change cache key externally
// todo make sure this is really needed even after refactoring
ref.destroyInternalCache();
}
this._cKey = value;

View File

@ -1069,7 +1069,7 @@
if ( prevTile.level <= cutoff ||
prevTile.beingDrawn ||
prevTile.loading ||
prevTile.processing ) { //todo exempt from deletion, or block this routine on data updates
prevTile.processing ) {
continue;
}
if ( !worstTile ) {

View File

@ -2132,9 +2132,6 @@ $.extend($.TiledImage.prototype, $.EventSource.prototype, /** @lends OpenSeadrag
}
function markTileAsReady() {
tile.lastProcess = false;
tile.processing = false;
const fallbackCompletion = getCompletionCallback();
/**
@ -2183,8 +2180,7 @@ $.extend($.TiledImage.prototype, $.EventSource.prototype, /** @lends OpenSeadrag
if (tileCacheCreated) {
const updatePromise = _this.viewer.world.requestTileInvalidateEvent([tile], now, false, true);
updatePromise.then(markTileAsReady);
_this.viewer.world.requestTileInvalidateEvent([tile], now, false, true).then(markTileAsReady);
} else {
// Tile-invalidated not called on each tile, but only on tiles with new data! Verify we share the main cache
const origCache = tile.getCache(tile.originalCacheKey);
@ -2199,15 +2195,12 @@ $.extend($.TiledImage.prototype, $.EventSource.prototype, /** @lends OpenSeadrag
tile.setCache(t.cacheKey, targetMainCache, true, false);
break;
} else if (t.processing) {
// TODO consider something nicer, now just wait until subsequent routine finishes
let interval = setInterval(() => {
if (!t.processing && t.getCache()) {
const targetMainCache = t.getCache();
tile.setCache(t.cacheKey, targetMainCache, true, false);
clearInterval(interval);
markTileAsReady();
}
}, 50);
// Await once processing finishes - mark tile as loaded
t.processingPromise.then(t => {
const targetMainCache = t.getCache();
tile.setCache(t.cacheKey, targetMainCache, true, false);
markTileAsReady();
});
return;
}
}

View File

@ -275,7 +275,7 @@ $.extend( $.World.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.W
}
const tileList = [],
markedTiles = [];
tileFinishResolvers = [];
for (const tile of tilesToProcess) {
// We allow re-execution on tiles that are in process but have too low processing timestamp,
// which must be solved by ensuring subsequent data calls in the suddenly outdated processing
@ -289,11 +289,14 @@ $.extend( $.World.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.W
}
for (let t of tileCache._tiles) {
// Mark all related tiles as processing and cache the references to unmark later on,
// last processing is set to old processing (null if finished)
t.lastProcess = t.processing;
// Mark all related tiles as processing and register callback to unmark later on
t.processing = tStamp;
markedTiles.push(t);
t.processingPromise = new $.Promise((resolve) => {
tileFinishResolvers.push(() => {
t.processing = false;
resolve(t);
});
});
}
tileCache.__invStamp = tStamp;
@ -350,7 +353,7 @@ $.extend( $.World.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.W
cache: workingCache,
targetKey: newCacheKey,
setAsMainCache: true,
tileAllowNotLoaded: false //todo what if called from load event?
tileAllowNotLoaded: tile.loading
});
} else if (restoreTiles) {
// If we requested restore, perform now
@ -425,9 +428,8 @@ $.extend( $.World.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.W
});
return $.Promise.all(jobList).then(() => {
for (let tile of markedTiles) {
tile.lastProcess = false;
tile.processing = false;
for (let resolve of tileFinishResolvers) {
resolve();
}
this.draw();
});