From c3b0890b0bd1a789c0889fa7d31714d7fcda0a03 Mon Sep 17 00:00:00 2001 From: Evan Wallace Date: Mon, 5 Dec 2022 21:50:04 -0500 Subject: [PATCH] fix #714: remove the webassembly `_exit(0)` hack --- .gitignore | 3 --- CHANGELOG.md | 10 +++++++ Makefile | 37 +++---------------------- lib/npm/exit0/darwin-arm64-LE.node | Bin 49953 -> 0 bytes lib/npm/exit0/darwin-x64-LE.node | Bin 32936 -> 0 bytes lib/npm/exit0/linux-arm64-LE.node | Bin 5920 -> 0 bytes lib/npm/exit0/linux-x64-LE.node | Bin 14344 -> 0 bytes lib/npm/exit0/win32-x64-LE.node | Bin 2560 -> 0 bytes npm/esbuild-wasm/bin/esbuild | 42 ----------------------------- scripts/esbuild.js | 21 --------------- 10 files changed, 13 insertions(+), 100 deletions(-) delete mode 100755 lib/npm/exit0/darwin-arm64-LE.node delete mode 100755 lib/npm/exit0/darwin-x64-LE.node delete mode 100755 lib/npm/exit0/linux-arm64-LE.node delete mode 100755 lib/npm/exit0/linux-x64-LE.node delete mode 100644 lib/npm/exit0/win32-x64-LE.node diff --git a/.gitignore b/.gitignore index 34ede119e9d..b056c8e2441 100644 --- a/.gitignore +++ b/.gitignore @@ -7,17 +7,14 @@ /esbuild /github/ /npm/@esbuild/android-arm/esbuild.wasm -/npm/@esbuild/android-arm/exit0.js /npm/@esbuild/android-arm/wasm_exec_node.js /npm/@esbuild/android-arm/wasm_exec.js /npm/@esbuild/android-x64/esbuild.wasm -/npm/@esbuild/android-x64/exit0.js /npm/@esbuild/android-x64/wasm_exec_node.js /npm/@esbuild/android-x64/wasm_exec.js /npm/esbuild-wasm/browser.js /npm/esbuild-wasm/esbuild.wasm /npm/esbuild-wasm/esm/ -/npm/esbuild-wasm/exit0.js /npm/esbuild-wasm/lib/ /npm/esbuild-wasm/wasm_exec_node.js /npm/esbuild-wasm/wasm_exec.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 86a30643f45..7cd5105a87a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -99,6 +99,16 @@ The primary branch for this repository was previously called `master` but is now called `main`. This change mirrors a similar change in many other projects. +* Remove esbuild's `_exit(0)` hack for WebAssembly ([#714](https://github.com/evanw/esbuild/issues/714)) + + Node had an unfortunate bug where the node process is unnecessarily kept open while a WebAssembly module is being optimized: https://github.com/nodejs/node/issues/36616. This means cases where running `esbuild` should take a few milliseconds can end up taking many seconds instead. + + The workaround was to force node to exit by ending the process early. This was done by esbuild in one of two ways depending on the exit code. For non-zero exit codes (i.e. when there is a build error), the `esbuild` command could just call `process.kill(process.pid)` to avoid the hang. But for zero exit codes, esbuild had to load a N-API native node extension that calls the operating system's `exit(0)` function. + + However, this problem has essentially been fixed in node starting with version 18.3.0. So I have removed this hack from esbuild. If you are using an earlier version of node with `esbuild-wasm` and you don't want the `esbuild` command to hang for a while when exiting, you can upgrade to node 18.3.0 or higher to remove the hang. + + The fix came from a V8 upgrade: [this commit](https://github.com/v8/v8/commit/bfe12807c14c91714c7db1485e6b265439375e16) enabled [dynamic tiering for WebAssembly](https://v8.dev/blog/wasm-dynamic-tiering) by default for all projects that use V8's WebAssembly implementation. Previously all functions in the WebAssembly module were optimized in a single batch job but with dynamic tiering, V8 now optimizes individual WebAssembly functions as needed. This avoids unnecessary WebAssembly compilation which allows node to exit on time. + ## 0.15.18 * Performance improvements for both JS and CSS diff --git a/Makefile b/Makefile index c19cd30d943..9ce2ae350b7 100644 --- a/Makefile +++ b/Makefile @@ -221,37 +221,6 @@ test-yarnpnp: platform-wasm version-go: node scripts/esbuild.js --update-version-go -wasm-napi-exit0-darwin-x64: - node -e 'console.log(`#include \nvoid* napi_register_module_v1(void* a, void* b) { _exit(0); }`)' \ - | clang -x c -dynamiclib -mmacosx-version-min=10.5 -o lib/npm/exit0/darwin-x64-LE.node - - ls -l lib/npm/exit0/darwin-x64-LE.node - -wasm-napi-exit0-darwin-arm64: - node -e 'console.log(`#include \nvoid* napi_register_module_v1(void* a, void* b) { _exit(0); }`)' \ - | clang -x c -dynamiclib -mmacosx-version-min=10.5 -o lib/npm/exit0/darwin-arm64-LE.node - - ls -l lib/npm/exit0/darwin-arm64-LE.node - -wasm-napi-exit0-linux-x64: - node -e 'console.log(`#include \nvoid* napi_register_module_v1(void* a, void* b) { _exit(0); }`)' \ - | gcc -x c -shared -o lib/npm/exit0/linux-x64-LE.node - - strip lib/npm/exit0/linux-x64-LE.node - ls -l lib/npm/exit0/linux-x64-LE.node - -wasm-napi-exit0-linux-arm64: - node -e 'console.log(`#include \nvoid* napi_register_module_v1(void* a, void* b) { _exit(0); }`)' \ - | gcc -x c -shared -o lib/npm/exit0/linux-arm64-LE.node - - strip lib/npm/exit0/linux-arm64-LE.node - ls -l lib/npm/exit0/linux-arm64-LE.node - -wasm-napi-exit0-win32-x64: - # This isn't meant to be run directly but is a rough overview of the instructions - echo '__declspec(dllexport) void* napi_register_module_v1(void* a, void* b) { ExitProcess(0); }' > main.c - echo 'setlocal' > main.bat - echo 'call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x64' >> main.bat - echo 'cl.exe /LD main.c /link /DLL /NODEFAULTLIB /NOENTRY kernel32.lib /OUT:lib/npm/exit0/win32-x64-LE.node' >> main.bat - main.bat - rm -f main.* - platform-all: @$(MAKE) --no-print-directory -j4 \ platform-android-arm \ @@ -576,10 +545,10 @@ clean: rm -f npm/@esbuild/win32-arm64/esbuild.exe rm -f npm/@esbuild/win32-ia32/esbuild.exe rm -f npm/@esbuild/win32-x64/esbuild.exe - rm -f npm/esbuild-wasm/esbuild.wasm npm/esbuild-wasm/wasm_exec*.js npm/esbuild-wasm/exit0.js - rm -rf npm/@esbuild/android-arm/bin npm/@esbuild/android-arm/esbuild.wasm npm/@esbuild/android-arm/wasm_exec*.js npm/@esbuild/android-arm/exit0.js + rm -f npm/esbuild-wasm/esbuild.wasm npm/esbuild-wasm/wasm_exec*.js + rm -rf npm/@esbuild/android-arm/bin npm/@esbuild/android-arm/esbuild.wasm npm/@esbuild/android-arm/wasm_exec*.js rm -rf npm/@esbuild/android-arm64/bin - rm -rf npm/@esbuild/android-x64/bin npm/@esbuild/android-x64/esbuild.wasm npm/@esbuild/android-x64/wasm_exec*.js npm/@esbuild/android-x64/exit0.js + rm -rf npm/@esbuild/android-x64/bin npm/@esbuild/android-x64/esbuild.wasm npm/@esbuild/android-x64/wasm_exec*.js rm -rf npm/@esbuild/darwin-arm64/bin rm -rf npm/@esbuild/darwin-x64/bin rm -rf npm/@esbuild/freebsd-arm64/bin diff --git a/lib/npm/exit0/darwin-arm64-LE.node b/lib/npm/exit0/darwin-arm64-LE.node deleted file mode 100755 index 5b684cb74744519d253198153c728e3f19a810b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49953 zcmeI)UrZcD90%~ZJt`zZp{5ZGZTRCqY&;GSQ4c*-W+-LK8VIMBy0Y_)seJTocHuZP zUxCW!jyw5ezY$FuCS8%8Z(QZON9E%jMyI* z)xqnUqw1{7oki`aIuEEeD|XlAKC_h3kW3B7!ilI%T4v6COY5S1oWm{obmHdXJ}LE( z6>>*cudiU#8FTY-oSAR=O6QE9vy-ZnUE8)l-M)33`&~#o<07D16<4WbY?bL%L~(#> zSyq2E686WFF~2bsvFiMK$fOUCFJ#7=8hu^uwef^*&;?YgNw$tp(n9ds3#jE>ZmCQ= z@41fJ8tP;d9)E#i{w|)SmY?Hxs?Sj6;;xZfp3gN`Ii9|;Q#oD0_Zew@>af1$u?vT$ zqrLB(`nkV>`YNe926R_Xp?&V~e5GxnG3S?tPN?wr@lmRr%UMSS{fu~oe;{T08Hwu7 z;gn^>YM-dphbf|oRPLk7d4g%jc%e7WawSYp-}FuC<9Hm-EHKPhPP=+j)CvZ|rzQrT4qDUM(oJ zii_`gwGxhh@Az!OZZ%=|(|+Bug~i2Ew&MM??q2!KmbbR@-uXsqxgJpa%=w)6-16?* z68mZjmbd5I0S*v=00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009Wx8i6zF{{!5b zyW_49fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafu)v0D(QUT@eK@Milr<2R z;YeIJOws+aI4n%DAt0qO6tO7a;*s%CG9pc*FOsqhQ^pedK-7?f^=7cW{_j9J#T3$?Q>wFKp6{i~Etg7>^Zsg?tDZwjyDMo%21AzN zq**#%{jo4j*{i6-UBgD|quXgkLd)YD^Q~i4gH*W`32{zTYNF5y*E$B4Cg>q^cO>o$ znX#ruUsro=JfRz6uw!3wIQ975_r87d(8Zc3KZ!k8ICX4pe){3fS4!JXHoQ3b>Y4Y0 zi7)4OrSra@oqb8$5nQ*p=Yu^X`+xZKVCR7cPpvhsjdYIvGFSg>`PX$brN{P89BF>* zjc`q0&-pUnU$uXa-?7&9H+%fe)AQFq+<3+JP5p)8nae%RuU|SXzi6mme`olS{)5#W rft!8*iK(gc-Nwh!*Z!%W`Fvv1f4ph>`9E4>v6ji^qwn5-;?I8pC19~_ diff --git a/lib/npm/exit0/darwin-x64-LE.node b/lib/npm/exit0/darwin-x64-LE.node deleted file mode 100755 index 73aa6a677135c72ba3d338bdf0abeb233a01a081..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32936 zcmeI*O>5LZ7zgl4?aNYIn?pgxw?(YrVY?QJ78Kmo7PeSyu@!oo?wYg>X0uCP>{d`0 ze1RfDKY@7EtNHC;J;?kZk zeJO4~ua0v}kFiraMSUmWe4Zbayhc-dzIm08--!#y^cszlQu&hOaXz_h+Evq~v)c15 zsC<1Y1IHbWY_zlM`2uIfatvuXi&<1k=oZUne4zdLHdMZx zx{hP+)4dA!>lRfh$MbXfrn7Qte~&HaSzDR6XvC zGb-lyLV*ATAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX?}zY@sLPCY&Lej^O?v*FMt-DTi} z2#4O$&U#dC6xKc#9(>UYYj=MX)`D*%;TBK7T@Qy|MUO;RzoebdZ^AI-14pCQ)-BJw zP1AhsQQC4%=C1QT&;RYC*}#L*j9{UqDW=kx5P;Pjh(HmglvjKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##An<<$cnxp*#z6P;dxO!^_9rPmPTvpU?-6jhK$YWB74x?W1}M&{nAaJn zkpAMr-z(sn7SbtJE$Ny|7Ofuc%5udBY*XGIp{3Y)jda25#!Jr+O0r}*hUF~DWz(*j UyySayXfbeZO1o0I6;vtTZ%MzzDF6Tf diff --git a/lib/npm/exit0/linux-arm64-LE.node b/lib/npm/exit0/linux-arm64-LE.node deleted file mode 100755 index fcd68a66b0b555336e8cae9650593219ce9a398e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5920 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 XM_0hFMD$&m+Aj^>t#ncyJh*=c69%*% diff --git a/lib/npm/exit0/win32-x64-LE.node b/lib/npm/exit0/win32-x64-LE.node deleted file mode 100644 index b556aeece0e512c7187f872ed06259a0d7a34d88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2560 zcmeHIPiqrV5T8x0wAHLRw4g=sMOMhcE}GQRgNIPM5HM>&djKs9`;Gsx{%+8zN{K>po`0dk|yD$I% zS5Vt+fJ3w-S@Aso@eRZJog*FI4WA?rwfsr4u*4gz9{82OuCcQ1d49+iT^6i*jC*YM z`2wr?j%&u_BSzHvYdH9EZ){~>>F15*gV(}e-rq(0qU9e*yAoM0>^v_oQO#Ks&RGD? z_5k=tdP(K{guCooOuq#&MCigw65_C_k)bojuL`JR#X_Q*7?dzo7Af<$FOftN;1%|& zqD@6Tg?RvQ{ZBtSCm6u(9{8CM=0}tCOff^Z8Da#}WMcQ-WvpZdjvd+n$C?Dhj?@yU z7A1>6vo7<*?05%}H$>5nWJPMn@1HL3268(EBaz$58$-FRAF0fz?}IpNZtFPpp?&Z4 z#^s&6KiR+8z+2>{Zc&^W$G{iV`wUfa0g?^6Ab7>7d3Y26agfQ08;nN;DIQb2LOrOL z^o>@lJcCZX#Z&V+dH%S=Xjkq+bogxg7 zvxvJCk7>FF`izMDezZ}@nZbGut^d(7 zZiP2OHz?v4Z?)>?pT)3*A_@8Xx7r!2t7ytkO diff --git a/npm/esbuild-wasm/bin/esbuild b/npm/esbuild-wasm/bin/esbuild index 14b5e4a3470..ec7f0eed47b 100755 --- a/npm/esbuild-wasm/bin/esbuild +++ b/npm/esbuild-wasm/bin/esbuild @@ -3,11 +3,8 @@ // Forward to the automatically-generated WebAssembly loader from the Go compiler const module_ = require('module'); -const crypto = require('crypto'); const path = require('path'); -const zlib = require('zlib'); const fs = require('fs'); -const os = require('os'); const wasm_exec_node = path.join(__dirname, '..', 'wasm_exec_node.js'); const esbuild_wasm = path.join(__dirname, '..', 'esbuild.wasm'); @@ -23,45 +20,6 @@ function instantiate(bytes, importObject) { return Promise.resolve({ instance, module }); } -// Node has an unfortunate bug where the node process is unnecessarily kept open while a -// WebAssembly module is being optimized: https://github.com/nodejs/node/issues/36616. -// This means cases where running "esbuild" should take a few milliseconds can end up -// taking many seconds instead. To work around this bug, it is possible to force node to -// exit by calling the operating system's exit function. That's what this code does. -process.on('exit', code => { - // If it's a non-zero exit code, we can just kill our own process to stop. This will - // preserve the fact that there is a non-zero exit code although the exit code will - // be different. We cannot use this if the exit code is supposed to be zero. - if (code !== 0) { - try { - process.kill(process.pid, 'SIGINT'); - } catch (e) { - } - return; - } - - // Otherwise if the exit code is zero, try to fall back to a binary N-API module that - // calls the operating system's "exit(0)" function. - const nativeModule = `${process.platform}-${os.arch()}-${os.endianness()}.node`; - const base64 = require('../exit0')[nativeModule]; - if (base64) { - try { - const data = zlib.inflateRawSync(Buffer.from(base64, 'base64')); - const hash = crypto.createHash('sha256').update(base64).digest().toString('hex').slice(0, 16); - const tempFile = path.join(os.tmpdir(), `${hash}-${nativeModule}`); - try { - if (fs.readFileSync(tempFile).equals(data)) { - require(tempFile); - } - } finally { - fs.writeFileSync(tempFile, data); - require(tempFile); - } - } catch (e) { - } - } -}); - // Node has another bug where using "fs.read" to read from stdin reads // everything successfully and then throws an error, but only on Windows. Go's // WebAssembly support uses "fs.read" so it hits this problem. This is a patch diff --git a/scripts/esbuild.js b/scripts/esbuild.js index d85244a32b9..b91b518c2b3 100644 --- a/scripts/esbuild.js +++ b/scripts/esbuild.js @@ -186,26 +186,6 @@ exports.buildWasmLib = async (esbuildPath) => { fs.writeFileSync(path.join(esmDir, minify ? 'browser.min.js' : 'browser.js'), browserESM) } - // Generate the "exit0" stubs - const exit0Map = {}; - const exit0Dir = path.join(repoDir, 'lib', 'npm', 'exit0'); - for (const entry of fs.readdirSync(exit0Dir)) { - if (entry.endsWith('.node')) { - const absPath = path.join(exit0Dir, entry); - const compressed = zlib.deflateRawSync(fs.readFileSync(absPath), { level: 9 }); - exit0Map[entry] = compressed.toString('base64'); - } - } - const exit0Code = ` -// Each of these is a native module that calls "exit(0)". This is a workaround -// for https://github.com/nodejs/node/issues/36616. These native modules are -// stored in a string both to make them smaller and to hide them from Yarn 2, -// since they make Yarn 2 unzip this package. - -module.exports = ${JSON.stringify(exit0Map, null, 2)}; -`; - fs.writeFileSync(path.join(npmWasmDir, 'exit0.js'), exit0Code); - // Join with the asynchronous WebAssembly build await goBuildPromise; @@ -217,7 +197,6 @@ module.exports = ${JSON.stringify(exit0Map, null, 2)}; fs.mkdirSync(path.join(dir, 'bin'), { recursive: true }) fs.writeFileSync(path.join(dir, 'wasm_exec.js'), wasm_exec_js); fs.writeFileSync(path.join(dir, 'wasm_exec_node.js'), wasm_exec_node_js); - fs.writeFileSync(path.join(dir, 'exit0.js'), exit0Code); fs.copyFileSync(path.join(npmWasmDir, 'bin', 'esbuild'), path.join(dir, 'bin', 'esbuild')); fs.copyFileSync(path.join(npmWasmDir, 'esbuild.wasm'), path.join(dir, 'esbuild.wasm')); }