Merge pull request #1723 from mzgoddard/blocks-monitored-cache

Cache the set of actively monitored blocks
This commit is contained in:
Paul Kaplan 2018-11-14 14:16:36 -05:00 committed by GitHub
commit 8aa88fa2a2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -64,7 +64,14 @@ class Blocks {
* execute.
* @type {object.<string, object>}
*/
_executeCached: {}
_executeCached: {},
/**
* A cache of block IDs and targets to start threads on as they are
* actively monitored.
* @type {Array<{blockId: string, target: Target}>}
*/
_monitored: null
};
/**
@ -492,6 +499,7 @@ class Blocks {
this._cache.procedureParamNames = {};
this._cache.procedureDefinitions = {};
this._cache._executeCached = {};
this._cache._monitored = null;
}
/**
@ -702,14 +710,25 @@ class Blocks {
* @param {!object} runtime Runtime to run all blocks in.
*/
runAllMonitored (runtime) {
Object.keys(this._blocks).forEach(blockId => {
if (this.getBlock(blockId).isMonitored) {
if (this._cache._monitored === null) {
this._cache._monitored = Object.keys(this._blocks)
.filter(blockId => this.getBlock(blockId).isMonitored)
.map(blockId => {
const targetId = this.getBlock(blockId).targetId;
runtime.addMonitorScript(blockId, targetId ? runtime.getTargetById(targetId) : null);
}
return {
blockId,
target: targetId ? runtime.getTargetById(targetId) : null
};
});
}
const monitored = this._cache._monitored;
for (let i = 0; i < monitored.length; i++) {
const {blockId, target} = monitored[i];
runtime.addMonitorScript(blockId, target);
}
}
/**
* Block management: delete blocks and their associated scripts. Does nothing if a block
* with the given ID does not exist.