From 3679cf25e5ef80d77f977dfcaf9b48963ed0d775 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Fri, 27 Jan 2023 11:23:26 +0100 Subject: [PATCH] feat: allow using atomics to communicate between threads (#2758) --- docs/config/index.md | 10 ++++++++++ packages/vitest/package.json | 2 +- packages/vitest/src/node/pool.ts | 4 ++-- packages/vitest/src/types/config.ts | 9 +++++++++ pnpm-lock.yaml | 20 +++++++++++--------- 5 files changed, 33 insertions(+), 12 deletions(-) diff --git a/docs/config/index.md b/docs/config/index.md index 4df279c59dac..2ab7fefa93a8 100644 --- a/docs/config/index.md +++ b/docs/config/index.md @@ -489,6 +489,16 @@ Maximum number of threads. You can also use `VITEST_MAX_THREADS` environment var Minimum number of threads. You can also use `VITEST_MIN_THREADS` environment variable. +### useAtomics + +- **Type:** `boolean` +- **Default:** `false` +- **Version:** Since Vitest 0.28.3 + +Use Atomics to synchronize threads. + +This can improve performance in some cases, but might cause segfault in older Node versions. + ### testTimeout - **Type:** `number` diff --git a/packages/vitest/package.json b/packages/vitest/package.json index 182a3e44383b..d0bbc65ac461 100644 --- a/packages/vitest/package.json +++ b/packages/vitest/package.json @@ -133,7 +133,7 @@ "std-env": "^3.3.1", "strip-literal": "^1.0.0", "tinybench": "^2.3.1", - "tinypool": "^0.3.0", + "tinypool": "^0.3.1", "tinyspy": "^1.0.2", "vite": "^3.0.0 || ^4.0.0", "vite-node": "workspace:*", diff --git a/packages/vitest/src/node/pool.ts b/packages/vitest/src/node/pool.ts index 997cb80f1914..c480b236ac4c 100644 --- a/packages/vitest/src/node/pool.ts +++ b/packages/vitest/src/node/pool.ts @@ -43,7 +43,7 @@ export function createPool(ctx: Vitest): WorkerPool { filename: workerPath, // TODO: investigate further // It seems atomics introduced V8 Fatal Error https://github.com/vitest-dev/vitest/issues/1191 - useAtomics: false, + useAtomics: ctx.config.useAtomics ?? false, maxThreads, minThreads, @@ -141,7 +141,7 @@ export function createPool(ctx: Vitest): WorkerPool { // node before 16.17 has a bug that causes FATAL ERROR because of the race condition const nodeVersion = Number(process.version.match(/v(\d+)\.(\d+)/)?.[0].slice(1)) if (nodeVersion >= 16.17) - await Promise.all(pool.threads.map(w => w.terminate())) + await pool.destroy() }, } } diff --git a/packages/vitest/src/types/config.ts b/packages/vitest/src/types/config.ts index 376654d606ec..9ba0879ff7aa 100644 --- a/packages/vitest/src/types/config.ts +++ b/packages/vitest/src/types/config.ts @@ -235,6 +235,15 @@ export interface InlineConfig { */ minThreads?: number + /** + * Use Atomics to synchronize threads + * + * This can improve performance in some cases, but might cause segfault in older Node versions. + * + * @default false + */ + useAtomics?: boolean + /** * Default timeout of a test in milliseconds * diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f4eaa27bb62e..e7fdb39d60b0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -504,7 +504,7 @@ importers: vue: latest devDependencies: '@vitejs/plugin-vue': 4.0.0_vite@4.0.0+vue@3.2.45 - '@vue/test-utils': 2.2.7_vue@3.2.45 + '@vue/test-utils': 2.2.8_vue@3.2.45 jsdom: 21.1.0 vite: 4.0.0 vite-plugin-ruby: 3.1.2_vite@4.0.0 @@ -598,7 +598,7 @@ importers: devDependencies: '@vitejs/plugin-vue': 4.0.0_vite@4.0.0+vue@3.2.45 '@vitejs/plugin-vue-jsx': 3.0.0_vite@4.0.0+vue@3.2.45 - '@vue/test-utils': 2.2.7_vue@3.2.45 + '@vue/test-utils': 2.2.8_vue@3.2.45 jsdom: 21.1.0 vite: 4.0.0 vitest: link:../../packages/vitest @@ -898,7 +898,7 @@ importers: strip-ansi: ^7.0.1 strip-literal: ^1.0.0 tinybench: ^2.3.1 - tinypool: ^0.3.0 + tinypool: ^0.3.1 tinyspy: ^1.0.2 typescript: ^4.9.4 vite: ^4.0.0 @@ -925,7 +925,7 @@ importers: std-env: 3.3.1 strip-literal: 1.0.0 tinybench: 2.3.1 - tinypool: 0.3.0 + tinypool: 0.3.1 tinyspy: 1.0.2 vite: 4.0.0_@types+node@18.7.13 vite-node: link:../vite-node @@ -1073,7 +1073,7 @@ importers: vue: latest devDependencies: '@vitejs/plugin-vue': 4.0.0_vite@4.0.0+vue@3.2.45 - '@vue/test-utils': 2.2.7_vue@3.2.45 + '@vue/test-utils': 2.2.8_vue@3.2.45 happy-dom: 8.1.5 vite: 4.0.0 vitest: link:../../packages/vitest @@ -8528,11 +8528,13 @@ packages: vue: 3.2.45 dev: true - /@vue/test-utils/2.2.7_vue@3.2.45: - resolution: {integrity: sha512-BMuoruUFTEqhLoOgsMcgNVMiByYbfHCKGr2C4CPdGtz/affUtDVX5zr1RnPuq0tYSiaqq+Enw5voUpG6JY8Q7g==} + /@vue/test-utils/2.2.8_vue@3.2.45: + resolution: {integrity: sha512-/R8DKzp41Ip/RqTt1jvOVi5gxby3EwNWiYHNYsG9FAjEvt0gzDvYN55lCKzX7IdnI5zVIOo5tHtts0SLT+JrWw==} peerDependencies: + '@vue/compiler-dom': ^3.0.1 vue: ^3.0.1 dependencies: + js-beautify: 1.14.6 vue: 3.2.45 dev: true @@ -19813,8 +19815,8 @@ packages: resolution: {integrity: sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==} dev: false - /tinypool/0.3.0: - resolution: {integrity: sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ==} + /tinypool/0.3.1: + resolution: {integrity: sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==} engines: {node: '>=14.0.0'} dev: false