angular/packages/compiler-cli/ngcc/src/execution/single_process_executor.ts
George Kalpakas 16039d837e refactor(ngcc): rename TaskQueue#markTaskCompleted() to markAsCompleted() (#36626)
Rename the `markTaskCompleted()` method to be consistent with the other
similar methods of `TaskQueue` (`markAsFailed()` and
`markAsUnprocessed()`).

PR Close #36626
2020-04-29 14:28:26 -07:00

71 lines
2.5 KiB
TypeScript

/**
* @license
* Copyright Google Inc. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import {AsyncLocker} from '../locking/async_locker';
import {SyncLocker} from '../locking/sync_locker';
import {Logger} from '../logging/logger';
import {AnalyzeEntryPointsFn, CreateCompileFn, Executor} from './api';
import {CreateTaskCompletedCallback} from './tasks/api';
export abstract class SingleProcessorExecutorBase {
constructor(
private logger: Logger, private createTaskCompletedCallback: CreateTaskCompletedCallback) {}
doExecute(analyzeEntryPoints: AnalyzeEntryPointsFn, createCompileFn: CreateCompileFn):
void|Promise<void> {
this.logger.debug(`Running ngcc on ${this.constructor.name}.`);
const taskQueue = analyzeEntryPoints();
const onTaskCompleted = this.createTaskCompletedCallback(taskQueue);
const compile = createCompileFn(onTaskCompleted);
// Process all tasks.
this.logger.debug('Processing tasks...');
const startTime = Date.now();
while (!taskQueue.allTasksCompleted) {
const task = taskQueue.getNextTask()!;
compile(task);
taskQueue.markAsCompleted(task);
}
const duration = Math.round((Date.now() - startTime) / 1000);
this.logger.debug(`Processed tasks in ${duration}s.`);
}
}
/**
* An `Executor` that processes all tasks serially and completes synchronously.
*/
export class SingleProcessExecutorSync extends SingleProcessorExecutorBase implements Executor {
constructor(
logger: Logger, private lockFile: SyncLocker,
createTaskCompletedCallback: CreateTaskCompletedCallback) {
super(logger, createTaskCompletedCallback);
}
execute(analyzeEntryPoints: AnalyzeEntryPointsFn, createCompileFn: CreateCompileFn): void {
this.lockFile.lock(() => this.doExecute(analyzeEntryPoints, createCompileFn));
}
}
/**
* An `Executor` that processes all tasks serially, but still completes asynchronously.
*/
export class SingleProcessExecutorAsync extends SingleProcessorExecutorBase implements Executor {
constructor(
logger: Logger, private lockFile: AsyncLocker,
createTaskCompletedCallback: CreateTaskCompletedCallback) {
super(logger, createTaskCompletedCallback);
}
async execute(analyzeEntryPoints: AnalyzeEntryPointsFn, createCompileFn: CreateCompileFn):
Promise<void> {
await this.lockFile.lock(async () => this.doExecute(analyzeEntryPoints, createCompileFn));
}
}