Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion packages/vitest/src/node/pools/pool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,9 @@ export class Pool {
const activeTask = { task, resolver, method, cancelTask }
this.activeTasks.push(activeTask)

// active tasks receive cancel signal and shut down gracefully
async function cancelTask() {
await runner.stop()
await runner.waitForTerminated
resolver.reject(new Error('Cancelled'))
}

Expand Down
12 changes: 11 additions & 1 deletion packages/vitest/src/node/pools/poolRunner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ export class PoolRunner {

private _state: RunnerState = RunnerState.IDLE
private _operationLock: DeferPromise<void> | null = null
private _terminatePromise: DeferPromise<void> = createDefer()

private _eventEmitter: EventEmitter<{
message: [WorkerResponse]
Expand All @@ -44,6 +45,10 @@ export class PoolRunner {
return this._state === RunnerState.STOPPED
}

public get waitForTerminated(): Promise<void> {
return this._terminatePromise
}

public get isStarted(): boolean {
return this._state === RunnerState.STARTED
}
Expand All @@ -58,7 +63,11 @@ export class PoolRunner {
}),
{
eventNames: ['onCancel'],
post: request => this.postMessage(request),
post: (request) => {
if (this._state !== RunnerState.STOPPING && this._state !== RunnerState.STOPPED) {
this.postMessage(request)
}
},
on: callback => this._eventEmitter.on('rpc', callback),
timeout: -1,
},
Expand Down Expand Up @@ -199,6 +208,7 @@ export class PoolRunner {
finally {
this._operationLock.resolve()
this._operationLock = null
this._terminatePromise.resolve()
}
}

Expand Down
Loading