From: stephan Date: Sat, 21 May 2022 21:13:44 +0000 (+0000) Subject: Minor fiddle-related build restructuring to support upcoming development of the C... X-Git-Tag: version-3.39.0~123 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4ec29fc1158afb199a0b631339e4cda72b252522;p=thirdparty%2Fsqlite.git Minor fiddle-related build restructuring to support upcoming development of the C-style wasm sqlite3 interface, plus some commentary about the plans and goals for that. FossilOrigin-Name: c7cfdd4c3682659352642461d3307bf8180703b121ec1802ba5881f8e1ef9809 --- diff --git a/Makefile.in b/Makefile.in index 7a90bb5f0c..7bc9694ce6 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1518,13 +1518,12 @@ sqlite3.dll: $(REAL_LIBOBJ) sqlite3.def # fiddle section # fiddle_dir = ext/fiddle +fiddle_dir_abs = $(TOP)/$(fiddle_dir) +# ^^^ some emcc opts require absolute paths fiddle_html = $(fiddle_dir)/fiddle.html fiddle_module_js = $(fiddle_dir)/fiddle-module.js fiddle_generated = $(fiddle_module_js) \ $(fiddle_dir)/fiddle-module.wasm -# fiddle_dummy_exports = ,comma,list of func bound solely for -# experimentation and testing purposes in the WASM build. -fiddle_dummy_exports = ,_fiddle_experiment,_fiddle_the_db,_fiddle_db_arg clean-fiddle: rm -f $(fiddle_generated) clean: clean-fiddle @@ -1535,11 +1534,12 @@ clean: clean-fiddle # --js-library $(fiddle_dir)/_dummylib.js emcc_opt = -Oz emcc_flags = $(emcc_opt) $(SHELL_OPT) \ - -sEXPORTED_RUNTIME_METHODS=ccall,cwrap \ - -sEXPORTED_FUNCTIONS=_fiddle_exec,_fiddle_interrupt$(fiddle_dummy_exports) \ + -sEXPORTED_RUNTIME_METHODS=@$(fiddle_dir_abs)/EXPORTED_RUNTIME_METHODS \ + -sEXPORTED_FUNCTIONS=@$(fiddle_dir_abs)/EXPORTED_FUNCTIONS \ $(fiddle_cflags) # $(fiddle_cflags) is intended to be passed to make via the CLI in # order to override, e.g., -Ox for one-off builds. -$(fiddle_module_js): Makefile sqlite3.c shell.c +$(fiddle_module_js): Makefile sqlite3.c shell.c \ + $(fiddle_dir)/EXPORTED_RUNTIME_METHODS $(fiddle_dir)/EXPORTED_FUNCTIONS emcc -o $@ $(emcc_flags) sqlite3.c shell.c fiddle: $(fiddle_module_js) diff --git a/ext/fiddle/EXPORTED_FUNCTIONS b/ext/fiddle/EXPORTED_FUNCTIONS new file mode 100644 index 0000000000..7ec5df3e47 --- /dev/null +++ b/ext/fiddle/EXPORTED_FUNCTIONS @@ -0,0 +1,5 @@ +_fiddle_exec +_fiddle_interrupt +_fiddle_experiment +_fiddle_the_db +_fiddle_db_arg diff --git a/ext/fiddle/EXPORTED_RUNTIME_METHODS b/ext/fiddle/EXPORTED_RUNTIME_METHODS new file mode 100644 index 0000000000..a5b33fb786 --- /dev/null +++ b/ext/fiddle/EXPORTED_RUNTIME_METHODS @@ -0,0 +1,6 @@ +ccall +cwrap +stackAlloc +stackSave +stackRestore +UTF8ToString diff --git a/ext/fiddle/fiddle-worker.js b/ext/fiddle/fiddle-worker.js index 5c6ed1d483..4f0f7e6c13 100644 --- a/ext/fiddle/fiddle-worker.js +++ b/ext/fiddle/fiddle-worker.js @@ -138,4 +138,48 @@ self.onmessage = function(ev){ }; self.Module.setStatus('Downloading...'); importScripts('fiddle-module.js') -/* loads module and notifies, via Module.setStatus(), when it's done loading. */; +/* loads the wasm module and notifies, via Module.setStatus() and + Module.onRuntimeInitialized(), when it's done loading. */; + +Module["onRuntimeInitialized"] = function onRuntimeInitialized() { + /* For reference: sql.js does essentially everything we want and + it solves much of the wasm-related voodoo, but we'll need a + different structure because we want the db connection to run in + a worker thread and feed data back into the main + thread. Regardless of those differences, it makes a great point + of reference: + + https://github.com/sql-js/sql.js + + Some of the specific design goals here: + + - Bind a low-level sqlite3 API which is close to the native one in + terms of usage. + + - Create a higher-level one, more akin to sql.js and + node.js-style implementations. This one would speak directly + to the low-level API. This API could be used by clients who + import the low-level API directly into their main thread + (which we don't want to recommend but also don't want to + outright forbid). + + - Create a second higher-level one which speaks to the + low-level API via worker messages. This one would be intended + for use in the main thread, talking to the low-level UI via + worker messages. Because workers have only a single message + channel, some acrobatics will be needed here to feed async + work results back into client-side callbacks (as those + callbacks cannot simply be passed to the worker). Exactly + what those acrobatics should look like is not yet entirely + clear and much experimentation is pending. + + */ + console.log('onRuntimeInitialized'); + + /* + TODO: create the main sqlite API here. We'll have another for + use in the main thread which will talk to this one via worker + messages. + */ + +} diff --git a/ext/fiddle/fiddle.js b/ext/fiddle/fiddle.js index d91f98a6df..920491e9d3 100644 --- a/ext/fiddle/fiddle.js +++ b/ext/fiddle/fiddle.js @@ -203,6 +203,14 @@ if(sql) SF.dbExec(sql); },false); + /** To be called immediately before work is sent to the + worker. Updates some UI elements. The 'working'/'end' + event will apply the inverse, undoing the bits this + function does. This impl is not in the 'working'/'start' + event handler because that event is given to us + asynchronously _after_ we need to have performed this + work. + */ const preStartWork = function f(){ if(!f._){ const title = E('title'); @@ -230,7 +238,7 @@ SF.addMsgHandler('working',function f(ev){ if('start' === ev.data){ - //btnShellExec.innerText = "Working..."; // forces layout reflow (annoying) + /* See notes in preStartWork(). */ }else if('end' === ev.data){ preStartWork._.pageTitle.innerText = preStartWork._.pageTitleOrig; btnShellExec.innerText = preStartWork._.btnLabel; @@ -238,7 +246,7 @@ } }); - /* For each checkboxes with data-csstgt, set up a handler which + /* For each checkbox with data-csstgt, set up a handler which toggles the given CSS class on the element matching E(data-csstgt). */ EAll('input[type=checkbox][data-csstgt]') diff --git a/manifest b/manifest index e97042e51b..8bc74a5e82 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C fiddle:\srefactor\sinto\smain\sthread\s(UI)\sand\sworker\sthread\s(wasm\smodule).\sAdded\sbits\sneeded\sto\ssupport\striggering\ssqlite3_interrupt()\sbut\sdo\snot\syet\shave\sa\ssecond\sSharedWorker\sto\stest\sit\swith. -D 2022-05-21T14:19:05.384 +C Minor\sfiddle-related\sbuild\srestructuring\sto\ssupport\supcoming\sdevelopment\sof\sthe\sC-style\swasm\ssqlite3\sinterface,\splus\ssome\scommentary\sabout\sthe\splans\sand\sgoals\sfor\sthat. +D 2022-05-21T21:13:44.686 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in 91cf7d4ee6e97dd84cd5cdf541df498e2df038dd83f4b30d1ed8b19fbee3bbdd +F Makefile.in 62df7206650987c76f15b2e1c23830976858892815b9fc4d283c850628e0c724 F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 F Makefile.msc b28a8a7a977e7312f6859f560348e1eb110c21bd6cf9fab0d16537c0a514eef3 F README.md 8b8df9ca852aeac4864eb1e400002633ee6db84065bd01b78c33817f97d31f5e @@ -55,10 +55,12 @@ F ext/expert/expert1.test 3c642a4e7bbb14f21ddab595436fb465a4733f47a0fe5b2855e1d5 F ext/expert/sqlite3expert.c 6ca30d73b9ed75bd56d6e0d7f2c962d2affaa72c505458619d0ff5d9cdfac204 F ext/expert/sqlite3expert.h ca81efc2679a92373a13a3e76a6138d0310e32be53d6c3bfaedabd158ea8969b F ext/expert/test_expert.c d56c194b769bdc90cf829a14c9ecbc1edca9c850b837a4d0b13be14095c32a72 +F ext/fiddle/EXPORTED_FUNCTIONS 487fc7c83d45c48326f731c89162ed17ab15767e5efede8999d7d6c6e2d04c0f +F ext/fiddle/EXPORTED_RUNTIME_METHODS 91d5dcb0168ee056fa1a340cb8ab3c23d922622f8dad39d28919dd8af2b3ade0 F ext/fiddle/Makefile b2904d52c10a7c984cfab95c54fb85f33aa8a6b2653faf1527d08ce57114be46 -F ext/fiddle/fiddle-worker.js eae61419d5a7fcc9c4fcfda157ca0fe0a36b690b716899e5ec54a6d20c7037a9 -F ext/fiddle/fiddle.html f536878dbaa35ba4d9ad8c87dda7fb2ea5502fdd824577d83b2265d65b8ca4d1 w ext/fiddle/fiddle.in.html -F ext/fiddle/fiddle.js 76a490d59bf0e09fb8a9610e6fa5c5032ee44680fbf9773b55974cb50d6dc3dc +F ext/fiddle/fiddle-worker.js 28e50e021e84aaedf4cbdb2ef25e4183f1e5be8da7996a50fc8d0b5ed78fa00a +F ext/fiddle/fiddle.html f536878dbaa35ba4d9ad8c87dda7fb2ea5502fdd824577d83b2265d65b8ca4d1 +F ext/fiddle/fiddle.js 9361d451845ac3c97c5492c24c8d18b8fe2deff07741462bdf8e39c375be25b2 F ext/fiddle/index.md d9c1c308d8074341bc3b11d1d39073cd77754cb3ca9aeb949f23fdd8323d81cf F ext/fts1/README.txt 20ac73b006a70bcfd80069bdaf59214b6cf1db5e F ext/fts1/ft_hash.c 3927bd880e65329bdc6f506555b228b28924921b @@ -1959,8 +1961,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 74abf03977e1ff8c6043defa38211cdfcfbba1979771b90ed9d3dbc99750fe9f -R 209182df1b3b6bd2044e6acab7e588b4 +P 5ff3326856bc190cee15a5fca5ded89aacc4bf931a8df98726a872b310e2a4fc +R 3ab23a2e617cc2f177067d0130c7a41f U stephan -Z 8cd34b489ca85b418bdc02d766bcd2dc +Z 0792a8e58fb57cfdbc5dcb7974589bd6 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 06ad51f191..b2ce3cbe35 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5ff3326856bc190cee15a5fca5ded89aacc4bf931a8df98726a872b310e2a4fc \ No newline at end of file +c7cfdd4c3682659352642461d3307bf8180703b121ec1802ba5881f8e1ef9809 \ No newline at end of file