11import { deepStrictEqual } from 'node:assert'
2- import { EventEmitter } from 'node:events'
2+ import { EventEmitter , once } from 'node:events'
33import { readdirSync , readFileSync , statSync } from 'node:fs'
4+ import { cpus } from 'node:os'
45import { basename , isAbsolute , join , resolve } from 'node:path'
56import { fileURLToPath } from 'node:url'
67import { Worker } from 'node:worker_threads'
@@ -82,10 +83,11 @@ export class WPTRunner extends EventEmitter {
8283 return [ ...files ]
8384 }
8485
85- run ( ) {
86+ async run ( ) {
8687 const workerPath = fileURLToPath ( join ( import . meta. url , '../worker.mjs' ) )
8788 /** @type {Set<Worker> } */
8889 const activeWorkers = new Set ( )
90+ let finishedFiles = 0
8991
9092 for ( const test of this . #files) {
9193 const code = test . includes ( '.sub.' )
@@ -95,6 +97,7 @@ export class WPTRunner extends EventEmitter {
9597
9698 if ( this . #status[ basename ( test ) ] ?. skip ) {
9799 this . #stats. skipped += 1
100+ finishedFiles ++
98101 continue
99102 }
100103
@@ -131,10 +134,14 @@ export class WPTRunner extends EventEmitter {
131134 activeWorkers . delete ( worker )
132135 clearTimeout ( timeout )
133136
134- if ( activeWorkers . size === 0 ) {
137+ if ( ++ finishedFiles === this . #files . length ) {
135138 this . handleRunnerCompletion ( )
136139 }
137140 } )
141+
142+ if ( activeWorkers . size === cpus ( ) . length ) {
143+ await once ( worker , 'exit' )
144+ }
138145 }
139146 }
140147
0 commit comments