diff options
| -rwxr-xr-x | build | 9 | ||||
| -rw-r--r-- | web/callback.js | 9 | ||||
| -rw-r--r-- | web/http/index.html | 2 | ||||
| -rw-r--r-- | web/http/nissyapp.mjs | 14 | ||||
| -rw-r--r-- | web/storage.cpp | 7 | ||||
| -rw-r--r-- | web/worker.mjs | 7 |
6 files changed, 22 insertions, 26 deletions
| @@ -127,9 +127,12 @@ MFLAGS="-DTHREADS=$THREADS -D$ARCH" | |||
| 127 | CPPFLAGS="-std=c++20 -pthread" | 127 | CPPFLAGS="-std=c++20 -pthread" |
| 128 | 128 | ||
| 129 | # Build flags for emscripten (WASM target) | 129 | # Build flags for emscripten (WASM target) |
| 130 | WASMCFLAGS="-std=c11 -fPIC -D_POSIX_C_SOURCE=199309L -pthread" | 130 | WASMCFLAGS="-std=c11 -fPIC -D_POSIX_C_SOURCE=199309L -pthread \ |
| 131 | -sMEMORY64 -sMAXIMUM_MEMORY=10737418240 -sASSERTIONS" | ||
| 132 | WASMCPPFLAGS="-std=c++20 -pthread -sMEMORY64 -sMAXIMUM_MEMORY=10737418240 \ | ||
| 133 | -sASSERTIONS" | ||
| 131 | WASMMFLAGS="-DTHREADS=$THREADS -DWASMSIMD" | 134 | WASMMFLAGS="-DTHREADS=$THREADS -DWASMSIMD" |
| 132 | WASMLINKFLAGS="--no-entry -sEXPORT_NAME='Nissy' -sMODULARIZE \ | 135 | WASMLINKFLAGS="--no-entry -sEXPORT_NAME='Nissy' -sMODULARIZE -sMEMORY64 \ |
| 133 | -sALLOW_MEMORY_GROWTH -sSTACK_SIZE=5MB -sPTHREAD_POOL_SIZE=$THREADS \ | 136 | -sALLOW_MEMORY_GROWTH -sSTACK_SIZE=5MB -sPTHREAD_POOL_SIZE=$THREADS \ |
| 134 | -sFETCH -sASYNCIFY -sLINKABLE -sEXPORT_ALL" | 137 | -sFETCH -sASYNCIFY -sLINKABLE -sEXPORT_ALL" |
| 135 | 138 | ||
| @@ -271,7 +274,7 @@ build_web() { | |||
| 271 | run $EMCC $WASMCFLAGS $WFLAGS $WASMMFLAGS $(odflags) -c \ | 274 | run $EMCC $WASMCFLAGS $WFLAGS $WASMMFLAGS $(odflags) -c \ |
| 272 | -o nissy.o src/nissy.c || exit 1 | 275 | -o nissy.o src/nissy.c || exit 1 |
| 273 | run $EMCC -lembind -lidbfs.js \ | 276 | run $EMCC -lembind -lidbfs.js \ |
| 274 | $CPPFLAGS $(odflags) $WASMLINKFLAGS \ | 277 | $WASMCPPFLAGS $(odflags) $WASMLINKFLAGS \ |
| 275 | --js-library web/callback.js -o web/"$obj".mjs \ | 278 | --js-library web/callback.js -o web/"$obj".mjs \ |
| 276 | cpp/nissy.cpp web/storage.cpp web/adapter.cpp nissy.o || exit 1 | 279 | cpp/nissy.cpp web/storage.cpp web/adapter.cpp nissy.o || exit 1 |
| 277 | cp web/"$obj".mjs web/http/ | 280 | cp web/"$obj".mjs web/http/ |
diff --git a/web/callback.js b/web/callback.js index 178b8e9..e277cf5 100644 --- a/web/callback.js +++ b/web/callback.js | |||
| @@ -31,8 +31,15 @@ addCallbackFunction: function(f) { | |||
| 31 | 31 | ||
| 32 | callFunction__deps: [ 'cbfl', 'validateCallbackId' ], | 32 | callFunction__deps: [ 'cbfl', 'validateCallbackId' ], |
| 33 | callFunction: function(id, arg) { | 33 | callFunction: function(id, arg) { |
| 34 | // This is a workaround related to usign WASM64 | ||
| 35 | // JavaScript's UTF8ToString expects a pointer argument, which for JS is | ||
| 36 | // of type "number", but WASM64 is passing a BigInt. See also: | ||
| 37 | // https://github.com/emscripten-core/emscripten/issues/21541 | ||
| 38 | // (but I could not make the suggested solution work in this case). | ||
| 39 | // TODO: check if there is a better workaround. | ||
| 40 | const non64_arg = Number(arg); | ||
| 34 | if (_validateCallbackId(id)) | 41 | if (_validateCallbackId(id)) |
| 35 | _cbfl[id](UTF8ToString(arg)); | 42 | _cbfl[id](UTF8ToString(non64_arg)); |
| 36 | }, | 43 | }, |
| 37 | 44 | ||
| 38 | callFunctionInt__deps: [ 'cbfl', 'validateCallbackId' ], | 45 | callFunctionInt__deps: [ 'cbfl', 'validateCallbackId' ], |
diff --git a/web/http/index.html b/web/http/index.html index 0846ea8..47ccc0d 100644 --- a/web/http/index.html +++ b/web/http/index.html | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | <select id="solverSelector"> | 11 | <select id="solverSelector"> |
| 12 | <option value="h48h0k4">h48 h=0 k=4 (59Mb)</option> | 12 | <option value="h48h0k4">h48 h=0 k=4 (59Mb)</option> |
| 13 | <option value="h48h3k2" selected="selected">h48 h=3 k=2 (283Mb)</option> | 13 | <option value="h48h3k2" selected="selected">h48 h=3 k=2 (283Mb)</option> |
| 14 | <!--option value="h48h7k2">h48 h=7 k=2 (3.6Gb)</option--> | 14 | <option value="h48h7k2">h48 h=7 k=2 (3.6Gb)</option> |
| 15 | </select> | 15 | </select> |
| 16 | <button id="solveButton">Solve</button> | 16 | <button id="solveButton">Solve</button> |
| 17 | <div id="confirmDownload" style="display:none"> | 17 | <div id="confirmDownload" style="display:none"> |
diff --git a/web/http/nissyapp.mjs b/web/http/nissyapp.mjs index b8a525c..55ca198 100644 --- a/web/http/nissyapp.mjs +++ b/web/http/nissyapp.mjs | |||
| @@ -50,20 +50,6 @@ solveButton.addEventListener("click", () => { | |||
| 50 | const solver = solverSelector.options[solverSelector.selectedIndex].value; | 50 | const solver = solverSelector.options[solverSelector.selectedIndex].value; |
| 51 | const scramble = scrField.value; | 51 | const scramble = scrField.value; |
| 52 | loadDataThenSolve(solver, scramble); | 52 | loadDataThenSolve(solver, scramble); |
| 53 | |||
| 54 | const solveCallbackId = ++lastCallbackId; | ||
| 55 | callbacks.set(solveCallbackId, { | ||
| 56 | f: (callbackArg, loadResult) => { | ||
| 57 | if (loadResult.success) { | ||
| 58 | startSolve(callbackArg.solver, callbackArg.scramble); | ||
| 59 | } else { | ||
| 60 | updateResults("", "", true); | ||
| 61 | } | ||
| 62 | }, | ||
| 63 | arg: { solver: solver, scramble: scramble } | ||
| 64 | }); | ||
| 65 | |||
| 66 | const downloadCallbackId = ++lastCallbackId; | ||
| 67 | }); | 53 | }); |
| 68 | 54 | ||
| 69 | function loadDataThenSolve(solver, scramble) { | 55 | function loadDataThenSolve(solver, scramble) { |
diff --git a/web/storage.cpp b/web/storage.cpp index cbf9e9c..eef145e 100644 --- a/web/storage.cpp +++ b/web/storage.cpp | |||
| @@ -43,8 +43,11 @@ EM_ASYNC_JS(int, download_and_store, (const char *key, const char *url), { | |||
| 43 | self instanceof WorkerGlobalScope; | 43 | self instanceof WorkerGlobalScope; |
| 44 | console.assert(inBrowser || inWorker, "Non-browsers not supported"); | 44 | console.assert(inBrowser || inWorker, "Non-browsers not supported"); |
| 45 | 45 | ||
| 46 | url = UTF8ToString(url); | 46 | // See comment in callback.js about this workaround |
| 47 | key = UTF8ToString(key); | 47 | const non64_url = Number(url); |
| 48 | const non64_key = Number(key); | ||
| 49 | url = UTF8ToString(non64_url); | ||
| 50 | key = UTF8ToString(non64_key); | ||
| 48 | let response = await fetch(url); | 51 | let response = await fetch(url); |
| 49 | if (!response.ok) { | 52 | if (!response.ok) { |
| 50 | console.log("Error downloading data for " + key); | 53 | console.log("Error downloading data for " + key); |
diff --git a/web/worker.mjs b/web/worker.mjs index ceceaec..0cb618b 100644 --- a/web/worker.mjs +++ b/web/worker.mjs | |||
| @@ -1,10 +1,7 @@ | |||
| 1 | import Nissy from "./nissy_web_module.mjs" | 1 | import Nissy from "./nissy_web_module.mjs" |
| 2 | 2 | ||
| 3 | const nissy = await Nissy(); | 3 | const nissy = await Nissy(); |
| 4 | function log(message) { | 4 | const log = (msg) => postMessage({ command: "log", id: -1, object: msg }); |
| 5 | postMessage({ command: "log", id: -1, object: message }); | ||
| 6 | console.log(message); | ||
| 7 | } | ||
| 8 | nissy.setLogger(nissy._addCallbackFunction(log)); | 5 | nissy.setLogger(nissy._addCallbackFunction(log)); |
| 9 | 6 | ||
| 10 | const commands = [ | 7 | const commands = [ |
| @@ -32,7 +29,7 @@ onmessage = (event) => { | |||
| 32 | } | 29 | } |
| 33 | } | 30 | } |
| 34 | 31 | ||
| 35 | log("[nissy worker] unknown command " + event.data.command); | 32 | console.log("[nissy worker] unknown command " + event.data.command); |
| 36 | }; | 33 | }; |
| 37 | 34 | ||
| 38 | // Load solver data from storage. | 35 | // Load solver data from storage. |
