]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add scratchpad/test app for WASMFS/OPFS running in the main window thread. Enable...
authorstephan <stephan@noemail.net>
Sat, 13 Aug 2022 16:11:38 +0000 (16:11 +0000)
committerstephan <stephan@noemail.net>
Sat, 13 Aug 2022 16:11:38 +0000 (16:11 +0000)
FossilOrigin-Name: ae24ac0f7dd9e12a40de0f6ccd61a16f010804da454085f886c217cc600cdba4

ext/wasm/GNUmakefile
ext/wasm/scratchpad-opfs-main.html [new file with mode: 0644]
ext/wasm/scratchpad-opfs-main.js [new file with mode: 0644]
manifest
manifest.uuid

index dad77dba0a48178524ee8604c01cadadf1739470..1fc2a57652a30e01bf108d289943b1bd6198b666 100644 (file)
@@ -168,7 +168,6 @@ emcc.cflags :=
 emcc.cflags += -std=c99 -fPIC
 # -------------^^^^^^^^ we currently need c99 for WASM-specific sqlite3 APIs.
 emcc.cflags += -I. -I$(dir.top) # $(SQLITE_OPT)
-emcc.cflags += -pthread
 
 ########################################################################
 # emcc flags specific to building the final .js/.wasm file...
@@ -183,36 +182,38 @@ emcc.jsflags += -sEXPORTED_RUNTIME_METHODS=FS,wasmMemory # wasmMemory==>for -sIM
 emcc.jsflags += -sUSE_CLOSURE_COMPILER=0
 emcc.jsflags += -sIMPORTED_MEMORY
 emcc.environment := -sENVIRONMENT=web
-ifeq (0,1)
+ENABLE_WASMFS := 1
+ifneq (0,$(ENABLE_WASMFS))
+  emcc.cflags += -pthread
   emcc.jsflags += -pthread -sWASMFS -sPTHREAD_POOL_SIZE=2
   emcc.environment := $(emcc.environment),worker
+else
+  emcc.jsflags += -sALLOW_MEMORY_GROWTH
+  # emcc: warning: USE_PTHREADS + ALLOW_MEMORY_GROWTH may run non-wasm code
+  #       slowly, see https://github.com/WebAssembly/design/issues/1271
+  #       [-Wpthreads-mem-growth]
 endif
 emcc.jsflags += $(emcc.environment)
 #emcc.jsflags += -sINITIAL_MEMORY=13107200
 #emcc.jsflags += -sTOTAL_STACK=4194304
 emcc.jsflags += -sEXPORT_NAME=sqlite3InitModule
 emcc.jsflags += -sGLOBAL_BASE=4096 # HYPOTHETICALLY keep func table indexes from overlapping w/ heap addr.
-emcc.jsflags +=--post-js=$(post-js.js)
+emcc.jsflags += --post-js=$(post-js.js)
 #emcc.jsflags += -sSTRICT # fails due to missing __syscall_...()
 #emcc.jsflags += -sALLOW_UNIMPLEMENTED_SYSCALLS
 #emcc.jsflags += -sFILESYSTEM=0 # only for experimentation. sqlite3 needs the FS API
 #emcc.jsflags += -sABORTING_MALLOC
-emcc.jsflags += -sALLOW_MEMORY_GROWTH
 emcc.jsflags += -sALLOW_TABLE_GROWTH
 emcc.jsflags += -Wno-limited-postlink-optimizations
 # ^^^^^ it likes to warn when we have "limited optimizations" via the -g3 flag.
-#emcc.jsflags += -sMALLOC=emmalloc
-#emcc.jsflags += -sMALLOC=dlmalloc # a good 8k larger than emmalloc
 #emcc.jsflags += -sSTANDALONE_WASM # causes OOM errors, not sure why
-#emcc.jsflags += --import=foo_bar
-#emcc.jsflags += --no-gc-sections
 # https://lld.llvm.org/WebAssembly.html
 emcc.jsflags += -sERROR_ON_UNDEFINED_SYMBOLS=0
 emcc.jsflags += -sLLD_REPORT_UNDEFINED
 #emcc.jsflags += --allow-undefined
 emcc.jsflags += --import-undefined
 #emcc.jsflags += --unresolved-symbols=import-dynamic --experimental-pic
-#emcc.jsflags +=  --experimental-pic --unresolved-symbols=ingore-all --import-undefined
+#emcc.jsflags += --experimental-pic --unresolved-symbols=ingore-all --import-undefined
 #emcc.jsflags += --unresolved-symbols=ignore-all
 enable_bigint ?= 1
 ifneq (0,$(enable_bigint))
@@ -228,7 +229,7 @@ emcc.jsflags += -sMEMORY64=0
 #  new Uint8Array(heapWrappers().HEAP8U.buffer, ptr, n)
 #
 # because ptr is now a BigInt, so is invalid for passing to arguments
-# which have strict must-be-a-number requirements.
+# which have strict must-be-a-Number requirements.
 ########################################################################
 
 
diff --git a/ext/wasm/scratchpad-opfs-main.html b/ext/wasm/scratchpad-opfs-main.html
new file mode 100644 (file)
index 0000000..36ae55c
--- /dev/null
@@ -0,0 +1,40 @@
+<!doctype html>
+<html lang="en-us">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
+    <link rel="stylesheet" href="common/emscripten.css"/>
+    <link rel="stylesheet" href="common/testing.css"/>
+    <title>sqlite3 WASMFS/OPFS Main-thread Scratchpad</title>
+  </head>
+  <body>
+    <header id='titlebar'><span>sqlite3 WASMFS/OPFS Main-thread Scratchpad</span></header>
+    <!-- emscripten bits -->
+    <figure id="module-spinner">
+      <div class="spinner"></div>
+      <div class='center'><strong>Initializing app...</strong></div>
+      <div class='center'>
+        On a slow internet connection this may take a moment.  If this
+        message displays for "a long time", intialization may have
+        failed and the JavaScript console may contain clues as to why.
+      </div>
+    </figure>
+    <div class="emscripten" id="module-status">Downloading...</div>
+    <div class="emscripten">
+      <progress value="0" max="100" id="module-progress" hidden='1'></progress>  
+    </div><!-- /emscripten bits -->
+    <p>Scratchpad/test app for the WASMF/OPFS integration in the
+      main window thread. This page requires that the sqlite3 API have
+      been built with WASMFS support. If OPFS support is available then
+      it "should" persist a database across reloads (watch the dev console
+      output), otherwise it will not.
+    </p>
+    <p>All stuff on this page happens in the dev console.</p>
+    <hr>
+    <div id='test-output'></div>
+    <script src="api/sqlite3.js"></script>
+    <script src="common/SqliteTestUtil.js"></script>
+    <script src="scratchpad-opfs-main.js"></script>
+  </body>
+</html>
diff --git a/ext/wasm/scratchpad-opfs-main.js b/ext/wasm/scratchpad-opfs-main.js
new file mode 100644 (file)
index 0000000..f0e38fc
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+  2022-05-22
+
+  The author disclaims copyright to this source code.  In place of a
+  legal notice, here is a blessing:
+
+  *   May you do good and not evil.
+  *   May you find forgiveness for yourself and forgive others.
+  *   May you share freely, never taking more than you give.
+
+  ***********************************************************************
+
+  A basic test script for sqlite3-api.js. This file must be run in
+  main JS thread and sqlite3.js must have been loaded before it.
+*/
+'use strict';
+(function(){
+  const toss = function(...args){throw new Error(args.join(' '))};
+  const log = console.log.bind(console),
+        warn = console.warn.bind(console),
+        error = console.error.bind(console);
+
+  const stdout = log;
+  const stderr = error;
+
+  const test1 = function(db){
+    db.execMulti("create table if not exists t(a);")
+      .callInTransaction(function(db){
+        db.prepare("insert into t(a) values(?)")
+          .bind(new Date().getTime())
+          .stepFinalize();
+        stdout("Number of values in table t:",
+            db.selectValue("select count(*) from t"));
+      });
+  };
+
+  const runTests = function(Module){
+    //stdout("Module",Module);
+    self._MODULE = Module /* this is only to facilitate testing from the console */;
+    const sqlite3 = Module.sqlite3,
+          capi = sqlite3.capi,
+          oo = sqlite3.oo1,
+          wasm = capi.wasm;
+    stdout("Loaded sqlite3:",capi.sqlite3_libversion(), capi.sqlite3_sourceid());
+    const persistentDir = capi.sqlite3_web_persistent_dir();
+    if(persistentDir){
+      stdout("Persistent storage dir:",persistentDir);
+    }else{
+      stderr("No persistent storage available.");
+    }
+    const startTime = performance.now();
+    let db;
+    try {
+      db = new oo.DB(persistentDir+'/foo.db');
+      stdout("DB filename:",db.filename,db.fileName());
+      const banner1 = '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>',
+            banner2 = '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<';
+      [
+        test1
+      ].forEach((f)=>{
+        const n = performance.now();
+        stdout(banner1,"Running",f.name+"()...");
+        f(db, sqlite3, Module);
+        stdout(banner2,f.name+"() took ",(performance.now() - n),"ms");
+      });
+    }finally{
+      if(db) db.close();
+    }
+    stdout("Total test time:",(performance.now() - startTime),"ms");
+  };
+
+  sqlite3InitModule(self.sqlite3TestModule).then(runTests);
+})();
index f1d2fe46413073a1bc8214938d9dde903e140ef0..a573cd64fcae23e2f1cbe11b0c529ce1a655fb31 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Cleanups\sin\sthe\swasmfs/opfs\sintegration\sbut\sdisable\sit\sin\sorder\sto\sget\sthe\sbuild\sinto\sa\sknown-working\sstate\sbefore\scontinuing\swith\sexperimentation.
-D 2022-08-13T13:56:00.886
+C Add\sscratchpad/test\sapp\sfor\sWASMFS/OPFS\srunning\sin\sthe\smain\swindow\sthread.\sEnable\sWASMFS\sby\sdefault\sin\sthe\slibrary\sbuild.
+D 2022-08-13T16:11:38.873
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -474,7 +474,7 @@ F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04
 F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865f002fc80cb
 F ext/wasm/EXPORTED_FUNCTIONS.fiddle db7a4602f043cf4a5e4135be3609a487f9f1c83f05778bfbdf93766be4541b96
 F ext/wasm/EXPORTED_RUNTIME_METHODS.fiddle a004bd5eeeda6d3b28d16779b7f1a80305bfe009dfc7f0721b042967f0d39d02
-F ext/wasm/GNUmakefile 15ee5d1e182bcee23f0a5fa8062697f4135606c642efe600fa2d5e794ad71588
+F ext/wasm/GNUmakefile 1bcfcde973bfbf1ea59acc551728aaf0fc74fcb52ddcd219a9b0f93e42c744f0
 F ext/wasm/README.md 4b00ae7c7d93c4591251245f0996a319e2651361013c98d2efb0b026771b7331
 F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api 77ef4bcf37e362b9ad61f9c175dfc0f1b3e571563fb311b96581cf422ee6a8ec
 F ext/wasm/api/EXPORTED_RUNTIME_METHODS.sqlite3-api 1ec3c73e7d66e95529c3c64ac3de2470b0e9e7fbf7a5b41261c367cf4f1b7287
@@ -502,6 +502,8 @@ F ext/wasm/jaccwabyt/jaccwabyt.js 0d7f32817456a0f3937fcfd934afeb32154ca33580ab26
 F ext/wasm/jaccwabyt/jaccwabyt.md 447cc02b598f7792edaa8ae6853a7847b8178a18ed356afacbdbf312b2588106
 F ext/wasm/jaccwabyt/jaccwabyt_test.c 39e4b865a33548f943e2eb9dd0dc8d619a80de05d5300668e9960fff30d0d36f
 F ext/wasm/jaccwabyt/jaccwabyt_test.exports 5ff001ef975c426ffe88d7d8a6e96ec725e568d2c2307c416902059339c06f19
+F ext/wasm/scratchpad-opfs-main.html 079b6ec0b3a6c35c9ac92e639ede1b253b901c52ec6a793e5411babb708ace40
+F ext/wasm/scratchpad-opfs-main.js 55ac5a0841d6436ac2990a4c26fea7f7fb98b0cfbb02ac169dc91f3c9ed5303d
 F ext/wasm/testing1.html 0bf3ff224628c1f1e3ed22a2dc1837c6c73722ad8c0ad9c8e6fb9e6047667231
 F ext/wasm/testing1.js a25069e20d5f8dc548cc98bcf7002cec812084421a1f7f70ffae2c706d1167b2
 F ext/wasm/testing2.html 73e5048e666fd6fb28b6e635677a9810e1e139c599ddcf28d687c982134b92b8
@@ -1999,8 +2001,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 3bc510a614973eafa60960a99bedb063594a693bdbfd80d7eb480b293b4ab811
-R a2b4eef7c61958031f6931d9df602912
+P 41045be752a5bd7966849638f3ca56f4905308df70f79f2cb6196ca7dce9d525
+R 767e1ce7730172518cd5acb6e01d575b
 U stephan
-Z 3b291cb3c0f3e97625538cf3bb7fa23a
+Z 6b8d7c0e41c798b0afb745ee9b8f505a
 # Remove this line to create a well-formed Fossil manifest.
index 91690836df7a393e4f2268acf1952564f579d465..7336ee31abc90f7c2f99301775b786c679127f1d 100644 (file)
@@ -1 +1 @@
-41045be752a5bd7966849638f3ca56f4905308df70f79f2cb6196ca7dce9d525
\ No newline at end of file
+ae24ac0f7dd9e12a40de0f6ccd61a16f010804da454085f886c217cc600cdba4
\ No newline at end of file