1100b496dSstephan<!doctype html> 2100b496dSstephan<html lang="en-us"> 3100b496dSstephan <head> 4100b496dSstephan <meta charset="utf-8"> 5100b496dSstephan <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 6100b496dSstephan <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon"> 7100b496dSstephan <link rel="stylesheet" href="common/emscripten.css"/> 8100b496dSstephan <link rel="stylesheet" href="common/testing.css"/> 9100b496dSstephan <title>speedtest1.wasm</title> 10100b496dSstephan </head> 11100b496dSstephan <body> 12100b496dSstephan <header id='titlebar'><span>speedtest1.wasm</span></header> 13*44a87f08Sstephan <div>See also: <a href='speedtest1-worker.html'>A Worker-thread variant of this page.</a></div> 14100b496dSstephan <!-- emscripten bits --> 15100b496dSstephan <figure id="module-spinner"> 16100b496dSstephan <div class="spinner"></div> 17100b496dSstephan <div class='center'><strong>Initializing app...</strong></div> 18100b496dSstephan <div class='center'> 19100b496dSstephan On a slow internet connection this may take a moment. If this 20100b496dSstephan message displays for "a long time", intialization may have 21100b496dSstephan failed and the JavaScript console may contain clues as to why. 22100b496dSstephan </div> 23100b496dSstephan </figure> 24100b496dSstephan <div class="emscripten" id="module-status">Downloading...</div> 25100b496dSstephan <div class="emscripten"> 26100b496dSstephan <progress value="0" max="100" id="module-progress" hidden='1'></progress> 27100b496dSstephan </div><!-- /emscripten bits --> 28*44a87f08Sstephan <div class='warning'>This page starts running the main exe when it loads, which will 29*44a87f08Sstephan block the UI until it finishes! Adding UI controls to manually configure and start it 30*44a87f08Sstephan are TODO.</div> 31100b496dSstephan <div>Output is sent to the dev console because we cannot update the UI while the 32100b496dSstephan speedtest is running unless/until we move the speedtest to a worker thread.</div> 33100b496dSstephan <hr> 34100b496dSstephan <div id='test-output'></div> 35100b496dSstephan <script src="common/whwasmutil.js"></script> 36100b496dSstephan <script src="common/SqliteTestUtil.js"></script> 37100b496dSstephan <script src="speedtest1.js"></script> 388fc8b5b3Sstephan <script>(function(){ 398fc8b5b3Sstephan /** 408fc8b5b3Sstephan If this environment contains OPFS, this function initializes it and 418fc8b5b3Sstephan returns the name of the dir on which OPFS is mounted, else it returns 428fc8b5b3Sstephan an empty string. 438fc8b5b3Sstephan */ 448fc8b5b3Sstephan const opfsDir = function f(wasmUtil){ 458fc8b5b3Sstephan if(undefined !== f._) return f._; 468fc8b5b3Sstephan const pdir = '/persistent'; 478fc8b5b3Sstephan if( !self.FileSystemHandle 488fc8b5b3Sstephan || !self.FileSystemDirectoryHandle 498fc8b5b3Sstephan || !self.FileSystemFileHandle){ 508fc8b5b3Sstephan return f._ = ""; 518fc8b5b3Sstephan } 528fc8b5b3Sstephan try{ 538fc8b5b3Sstephan if(0===wasmUtil.xCallWrapped( 548fc8b5b3Sstephan 'sqlite3_wasm_init_opfs', 'i32', ['string'], pdir 558fc8b5b3Sstephan )){ 568fc8b5b3Sstephan return f._ = pdir; 578fc8b5b3Sstephan }else{ 588fc8b5b3Sstephan return f._ = ""; 598fc8b5b3Sstephan } 608fc8b5b3Sstephan }catch(e){ 618fc8b5b3Sstephan // sqlite3_wasm_init_opfs() is not available 628fc8b5b3Sstephan return f._ = ""; 638fc8b5b3Sstephan } 648fc8b5b3Sstephan }; 658fc8b5b3Sstephan opfsDir._ = undefined; 668fc8b5b3Sstephan 67100b496dSstephan const eOut = document.querySelector('#test-output'); 688fc8b5b3Sstephan const log2 = async function(cssClass,...args){ 69100b496dSstephan const ln = document.createElement('div'); 70100b496dSstephan if(cssClass) ln.classList.add(cssClass); 71100b496dSstephan ln.append(document.createTextNode(args.join(' '))); 72100b496dSstephan eOut.append(ln); 73100b496dSstephan //this.e.output.lastElementChild.scrollIntoViewIfNeeded(); 74100b496dSstephan }; 75100b496dSstephan const doHtmlOutput = false 76100b496dSstephan /* can't update DOM while speedtest is running unless we run 77100b496dSstephan speedtest in a worker thread. */; 788fc8b5b3Sstephan const log = (...args)=>{ 79100b496dSstephan console.log(...args); 808fc8b5b3Sstephan if(doHtmlOutput) log2('', ...args); 81100b496dSstephan }; 82100b496dSstephan const logErr = function(...args){ 83100b496dSstephan console.error(...args); 848fc8b5b3Sstephan if(doHtmlOutput) log2('error', ...args); 85100b496dSstephan }; 86100b496dSstephan 87100b496dSstephan const runTests = function(EmscriptenModule){ 888fc8b5b3Sstephan console.log("Module inited.",EmscriptenModule); 89100b496dSstephan const wasm = { 90100b496dSstephan exports: EmscriptenModule.asm, 91100b496dSstephan alloc: (n)=>EmscriptenModule._malloc(n), 928fc8b5b3Sstephan dealloc: (m)=>EmscriptenModule._free(m), 938fc8b5b3Sstephan memory: EmscriptenModule.asm.memory || EmscriptenModule.wasmMemory 94100b496dSstephan }; 95100b496dSstephan //console.debug('wasm =',wasm); 96100b496dSstephan self.WhWasmUtilInstaller(wasm); 978fc8b5b3Sstephan const unlink = wasm.xWrap("sqlite3_wasm_vfs_unlink", "int", ["string"]); 988fc8b5b3Sstephan const pDir = opfsDir(wasm); 998fc8b5b3Sstephan if(pDir){ 1008fc8b5b3Sstephan console.warn("Persistent storage:",pDir); 1018fc8b5b3Sstephan } 102100b496dSstephan const scope = wasm.scopedAllocPush(); 1038fc8b5b3Sstephan const dbFile = 0 ? "" : pDir+"/speedtest1.db"; 104100b496dSstephan try{ 1058fc8b5b3Sstephan const argv = [ 106100b496dSstephan // TODO: accept flags via URL arguments and/or a 107100b496dSstephan // UI control. A multi-SELECT element should do 108100b496dSstephan // nicely. 109100b496dSstephan "speedtest1", 1108fc8b5b3Sstephan "--singlethread", 1118fc8b5b3Sstephan //"--stats", 1128fc8b5b3Sstephan "--memdb", // note that memdb trumps the filename arg 1138fc8b5b3Sstephan dbFile 114100b496dSstephan ]; 1158fc8b5b3Sstephan console.log("argv =",argv); 1168fc8b5b3Sstephan wasm.xCall('__main_argc_argv', argv.length, 1178fc8b5b3Sstephan wasm.scopedAllocMainArgv(argv)); 118100b496dSstephan }finally{ 119100b496dSstephan wasm.scopedAllocPop(scope); 1208fc8b5b3Sstephan if(pDir) unlink(dbFile); 121100b496dSstephan } 122100b496dSstephan }; 123100b496dSstephan 1248fc8b5b3Sstephan self.sqlite3TestModule.print = log; 125100b496dSstephan self.sqlite3TestModule.printErr = logErr; 126100b496dSstephan sqlite3Speedtest1InitModule(self.sqlite3TestModule).then(function(M){ 127100b496dSstephan setTimeout(()=>runTests(M), 100); 128100b496dSstephan }); 129100b496dSstephan })(); 130100b496dSstephan </script> 131100b496dSstephan </body> 132100b496dSstephan</html> 133