From: stephan Date: Sat, 29 Nov 2025 20:27:42 +0000 (+0000) Subject: A failed experiment in hiding JS async behind a sync interface. It's a fraction of... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fheads%2Fjs-async-as-sync;p=thirdparty%2Fsqlite.git A failed experiment in hiding JS async behind a sync interface. It's a fraction of a hair's width from working but can't work because of the timing when async tasks get the chance to run. Stashing for future contemplation. FossilOrigin-Name: d5753272e4861f664297ac0b81f3da9709bbdc9c67663d53688b12d7a05c68a7 --- diff --git a/ext/wasm/api/sqlite3-wasm.c b/ext/wasm/api/sqlite3-wasm.c index a1d7cb07e1..a9def8164d 100644 --- a/ext/wasm/api/sqlite3-wasm.c +++ b/ext/wasm/api/sqlite3-wasm.c @@ -1836,6 +1836,21 @@ int sqlite3__wasm_init_wasmfs(const char *zUnused){ } #endif /* __EMSCRIPTEN__ && SQLITE_ENABLE_WASMFS */ +#if 0 +SQLITE_WASM_EXPORT +int sqlite3__wasm_wait_int32(int32_t * addr, int interval, int max){ + unsigned tWaited = 0; + if( interval <= 0 ) interval = 50; + if( max <= 0 ) max = 3000; + while( tWaited < max ){ + //printf("tWaited=%d, interval=%d, max=%d, *addr=%d\n", tWaited, interval, max, *addr); + if( *addr ) return 1; + tWaited += sqlite3_sleep(interval); + } + return 0; +} +#endif + #if SQLITE_WASM_ENABLE_C_TESTS SQLITE_WASM_EXPORT diff --git a/ext/wasm/tester1.c-pp.html b/ext/wasm/tester1.c-pp.html index 4bb53ee569..364a4af75e 100644 --- a/ext/wasm/tester1.c-pp.html +++ b/ext/wasm/tester1.c-pp.html @@ -40,5 +40,15 @@ //#endif - +//#if nope + +//#endif + diff --git a/ext/wasm/tester1.c-pp.js b/ext/wasm/tester1.c-pp.js index b7d4afe152..8451bdc051 100644 --- a/ext/wasm/tester1.c-pp.js +++ b/ext/wasm/tester1.c-pp.js @@ -140,6 +140,9 @@ globalThis.sqlite3InitModule = sqlite3InitModule; } TestUtil.checkHeapSize(true); }; + const debug = (...args)=>{ + console.debug('tester1',...args); + }; const log = (...args)=>{ //console.log(...args); logClass('',...args); @@ -3304,6 +3307,70 @@ globalThis.sqlite3InitModule = sqlite3InitModule; //#endif enable-see ;/* end kvvfs tests */ +//#if nope + //////////////////////////////////////////////////////////////////////// + T.g('Async as sync experiment') + .t({ + name: 'async via sync', + predicate: ()=>isUIThread() || 'UI thread only', + test: function(sqlite3){ + log("An experiment in hiding async behind a sync interface."); + const nExpect = 11; + const blob = new Blob( + [document.querySelector("#worker-asyncTest1").textContent], + { type: "text/javascript" } + ); + const dbg = (...args)=>console.warn('syncy test',...args); + const startTime = Date.now(); + const indirection = function*(pOut){ + const genWaiter = function*(ptrToWatch, maxWait){ + const maxTime = startTime + maxWait; + const gap = 200; + let n = 0; + const f = wasm.exports.sqlite3__wasm_wait_int32; + do{ + dbg("Checking ptr..."); + ++n; + if( f(ptrToWatch, 75, gap) ){ + break; + } + dbg("nope to ptr", n); + yield 0; + }while( Date.now() + gap < maxTime ); + dbg("Exited loop?"); + dbg("Got async result", wasm.peek32(ptrToWatch)); + return 1; + //return 0; + }; + const waiter = genWaiter(pOut, 3000); + // does not fire when we need it to. setTimeout( fa, 300 ); + debug("Beginning wait on pOut..."); + yield *waiter; + //wasm.dealloc(pOut); + }; + const pOut = wasm.alloc(4); + if( 1 ){ + dbg("Starting worker"); + const worker = new Worker(window.URL.createObjectURL(blob)); + worker.onmessage = function(ev){ + dbg("worker shows signs of life",ev); + dbg("Setting pOut async", startTime, Date.now()); + //wasm.poke32(pOut, nExpect); + }; + } + wasm.poke32(pOut, 0); + const indy = indirection(pOut); + const p = new Promise((ok,nok)=>{ + while( !indy.next().done ); + ok(); + }); + //indy.next(); + //indy.next(); + //indy.next(); + } + })/*async-as-sync experiment*/; +//#endif + //////////////////////////////////////////////////////////////////////// T.g('Hook APIs') .t({ diff --git a/manifest b/manifest index b1271a14aa..f753534b6e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\skvvfs\svtab\sfor\sinspecting\sthe\sstorage\sstate.\sThis\sis\sfor\stesting\sand\smy\sown\sedification,\snot\spart\sof\sthe\spublic\sAPI. -D 2025-11-29T16:41:27.823 +C A\sfailed\sexperiment\sin\shiding\sJS\sasync\sbehind\sa\ssync\sinterface.\sIt's\sa\sfraction\sof\sa\shair's\swidth\sfrom\sworking\sbut\scan't\swork\sbecause\sof\sthe\stiming\swhen\sasync\stasks\sget\sthe\schance\sto\srun.\sStashing\sfor\sfuture\scontemplation. +D 2025-11-29T20:27:42.350 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -604,7 +604,7 @@ F ext/wasm/api/sqlite3-vfs-kvvfs.c-pp.js 3f65769166670f2bd044374958f8eeb43b9fae8 F ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js a2eea6442556867b589e04107796c6e1d04a472219529eeb45b7cd221d7d048b F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 88ce2078267a2d1af57525a32d896295f4a8db7664de0e17e82dc9ff006ed8d3 F ext/wasm/api/sqlite3-vtab-helper.c-pp.js 366596d8ff73d4cefb938bbe95bc839d503c3fab6c8335ce4bf52f0d8a7dee81 -F ext/wasm/api/sqlite3-wasm.c 1d6f8f3486f4f9a21db597f84a015fe9bb7c111652ce6beacdaceb0d162617ff +F ext/wasm/api/sqlite3-wasm.c c19f1271030cd45d3b36018e03b6f765222d2408b31f5c0f5e92da7aedd8cfa7 F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js bda1c75bd674a92a0e27cc2f3d46dbbf21e422413f8046814515a0bd7409328a F ext/wasm/api/sqlite3-worker1.c-pp.js 802d69ead8c38dc1be52c83afbfc77e757da8a91a2e159e7ed3ecda8b8dba2e7 F ext/wasm/c-pp-lite.c f38254fba42561728c2e4764a7ba8d68700091e7c2f4418112868c0daba16783 @@ -646,8 +646,8 @@ F ext/wasm/sql/001-sudoku.sql 35b7cb7239ba5d5f193bc05ec379bcf66891bce6f2a5b3879f F ext/wasm/test-opfs-vfs.html 1f2d672f3f3fce810dfd48a8d56914aba22e45c6834e262555e685bce3da8c3f F ext/wasm/test-opfs-vfs.js 1618670e466f424aa289859fe0ec8ded223e42e9e69b5c851f809baaaca1a00c F ext/wasm/tester1-worker.c-pp.html 0e432ec2c0d99cd470484337066e8d27e7aee4641d97115338f7d962bf7b081a -F ext/wasm/tester1.c-pp.html 52d88fe2c6f21a046030a36410b4839b632f4424028197a45a3d5669ea724ddb -F ext/wasm/tester1.c-pp.js 05bb1099472d410b8b5b822af0f362ec565c617eea924d5f53a3b643fc1466d8 +F ext/wasm/tester1.c-pp.html dc583906438f2d309664c39e7e12f2d9c733275e362e7c98f295605a64e25524 +F ext/wasm/tester1.c-pp.js 37855d8f06a687fb101284b42b0c0bd6f74057df7f9d378b1e087b7a883e1cf5 F ext/wasm/tests/opfs/concurrency/index.html 657578a6e9ce1e9b8be951549ed93a6a471f4520a99e5b545928668f4285fb5e F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65ad09f510589c779b7cc6a803a88 F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 @@ -2180,8 +2180,12 @@ F tool/version-info.c 33d0390ef484b3b1cb685d59362be891ea162123cea181cb8e6d2cf6dd F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0e1a6ca0f1123da680918027b16608bf87593a9d91f7b1f3fc0c3a454185740d -R 2aee549605fa5886143a182c3a989cec +P eaff2e8b7f63575e85fb9be800a2c59163e402d6a25fc6a955b9df15afe13b92 +R eee05954a5d93d6f5b89fedeca9b5693 +T *branch * js-async-as-sync +T *sym-js-async-as-sync * +T +closed * +T -sym-kvvfs-v2 * U stephan -Z db62e7bb06a82ac76e6e3341ca1c99a3 +Z 8e292bd04ff361d77347b3aa9675c412 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.tags b/manifest.tags index 4a6dd7dc3c..ba913ce805 100644 --- a/manifest.tags +++ b/manifest.tags @@ -1,2 +1,2 @@ -branch kvvfs-v2 -tag kvvfs-v2 +branch js-async-as-sync +tag js-async-as-sync diff --git a/manifest.uuid b/manifest.uuid index 9f0211379b..7b0a846d05 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eaff2e8b7f63575e85fb9be800a2c59163e402d6a25fc6a955b9df15afe13b92 +d5753272e4861f664297ac0b81f3da9709bbdc9c67663d53688b12d7a05c68a7