From d11dcabce8575fbf74de7a279246d62a02f47448 Mon Sep 17 00:00:00 2001 From: Jaifroid Date: Sun, 6 Feb 2022 17:14:43 +0000 Subject: [PATCH] Fix race condition while loading decompressors Former-commit-id: 588d8f114bcbaf595b95d67b831486e5a82fcb28 [formerly 1dac03025f7974975f85a5399b4194ec536e9552] [formerly d8572192ccb248b85bbd881cc4930f95a930fd7b] [formerly 4b6bf4ca42f2f5ca4bc3d964df0bca673dd9d6a8 [formerly 7480b0a6790073125d42e55eb17d402044e9e705 [formerly fa0b47cb1d48fe9ee3fed96da8a9d2f7ab2939cf]]] Former-commit-id: 5e0565d37a525d347356475e5abc445b614a6fe8 [formerly e595b77eb7baeb73c7cd15224f1808c389ac0933 [formerly d8f99fd4dc692a0d7f484fd382be9f586b934683]] Former-commit-id: e634a80bff96925d9ad901c1812f17cbfd4e801e [formerly ada8d9087c5130595401196ac155104572c8a12c] Former-commit-id: e5c4b37b2d392f48e9aee3e6542d5cb601d690f8 --- www/js/lib/uiUtil.js | 5 ++--- www/js/lib/xzdec_wrapper.js | 18 ++++++++++++------ www/js/lib/zstddec_wrapper.js | 18 ++++++++++++------ 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/www/js/lib/uiUtil.js b/www/js/lib/uiUtil.js index f6d4d720..4af8cceb 100644 --- a/www/js/lib/uiUtil.js +++ b/www/js/lib/uiUtil.js @@ -754,12 +754,11 @@ define(rqDef, function(util) { appstate.sessionScale = appstate.windowScale; } - // Reports an error in loading one of the ASM or WASM machines to the UI API Status Panel // This can't be done in app.js because the error occurs after the API panel is first displayed - function reportAssemblerErrorToAPIStatusPanel(decoderType, error) { - // Report error to API panel because error is produced asynchronously after panel is first displayed + function reportAssemblerErrorToAPIStatusPanel(decoderType, error, assemblerMachineType) { console.error('Could not instantiate any ' + decoderType + ' decoder!', error); + params.decompressorAPI.assemblerMachineType = assemblerMachineType; params.decompressorAPI.errorStatus = 'Error loading ' + decoderType + ' decompressor!'; var decompAPI = document.getElementById('decompressorAPIStatus'); decompAPI.innerHTML = 'Decompressor API: ' + params.decompressorAPI.errorStatus; diff --git a/www/js/lib/xzdec_wrapper.js b/www/js/lib/xzdec_wrapper.js index 8107f8c3..292ba7ba 100644 --- a/www/js/lib/xzdec_wrapper.js +++ b/www/js/lib/xzdec_wrapper.js @@ -26,14 +26,17 @@ // because they cannot interpret WebAssembly. var rqDefXZ = ['uiUtil']; +// Variable specific to this decompressor (will be used to populate global variable) +var XZMachineType = null; + // Select asm or wasm conditionally if ('WebAssembly' in self) { console.debug('Instantiating WASM xz decoder'); - params.decompressorAPI.assemblerMachineType = 'WASM'; + XZMachineType = 'WASM'; rqDefXZ.push('xzdec-wasm'); } else { console.debug('Instantiating ASM xz decoder'); - params.decompressorAPI.assemblerMachineType = 'ASM'; + XZMachineType = 'ASM'; rqDefXZ.push('xzdec-asm'); } @@ -54,20 +57,23 @@ define(rqDefXZ, function(uiUtil) { var xzdec; XZ().then(function (instance) { + params.decompressorAPI.assemblerMachineType = XZMachineType; xzdec = instance; }).catch(function (err) { - if (params.decompressorAPI.assemblerMachineType === 'ASM') { + if (XZMachineType === 'ASM') { // There is no fallback, because we were attempting to load the ASM machine, so report error immediately - uiUtil.reportAssemblerErrorToAPIStatusPanel('XZ', err); + uiUtil.reportAssemblerErrorToAPIStatusPanel('XZ', err, XZMachineType); } else { console.warn('WASM failed to load, falling back to ASM...', err); - params.decompressorAPI.assemblerMachineType = 'ASM'; + // Fall back to ASM + XZMachineType = 'ASM'; XZ = null; require(['xzdec-asm'], function () { XZ().then(function (instance) { + params.decompressorAPI.assemblerMachineType = XZMachineType; xzdec = instance; }).catch(function (err) { - uiUtil.reportAssemblerErrorToAPIStatusPanel('XZ', err); + uiUtil.reportAssemblerErrorToAPIStatusPanel('XZ', err, XZMachineType); }); }); } diff --git a/www/js/lib/zstddec_wrapper.js b/www/js/lib/zstddec_wrapper.js index f33f7527..3c057c07 100644 --- a/www/js/lib/zstddec_wrapper.js +++ b/www/js/lib/zstddec_wrapper.js @@ -26,14 +26,17 @@ // because they cannot interpret WebAssembly. var rqDefZD = ['uiUtil']; +// Variable specific to this decompressor (will be used to populate global variable) +var ZSTDMachineType = null; + // Select asm or wasm conditionally if ('WebAssembly' in self) { console.debug('Instantiating WASM zstandard decoder'); - params.decompressorAPI.assemblerMachineType = 'WASM'; + ZSTDMachineType = 'WASM'; rqDefZD.push('zstddec-wasm'); } else { console.debug('Instantiating ASM zstandard decoder'); - params.decompressorAPI.assemblerMachineType = 'ASM'; + ZSTDMachineType = 'ASM'; rqDefZD.push('zstddec-asm'); } @@ -102,20 +105,23 @@ define(rqDefZD, function(uiUtil) { }; ZD().then(function (inst) { + params.decompressorAPI.assemblerMachineType = ZSTDMachineType; instantiateDecoder(inst); }).catch(function (err) { - if (params.decompressorAPI.assemblerMachineType === 'ASM') { + if (ZSTDMachineType === 'ASM') { // There is no fallback, because we were attempting to load the ASM machine, so report error immediately - uiUtil.reportAssemblerErrorToAPIStatusPanel('ZSTD', err); + uiUtil.reportAssemblerErrorToAPIStatusPanel('ZSTD', err, ZSTDMachineType); } else { console.warn('WASM failed to load, falling back to ASM...', err); - params.decompressorAPI.assemblerMachineType = 'ASM'; + // Fall back to ASM + ZSTDMachineType = 'ASM'; ZD = null; require(['zstddec-asm'], function () { ZD().then(function (inst) { + params.decompressorAPI.assemblerMachineType = ZSTDMachineType; instantiateDecoder(inst); }).catch(function (err) { - uiUtil.reportAssemblerErrorToAPIStatusPanel('ZSTD', err); + uiUtil.reportAssemblerErrorToAPIStatusPanel('ZSTD', err, ZSTDMachineType); }); }); }