mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-18 09:35:39 -05:00
* Revert "Revert "Merge from vscode merge-base (#22769)" (#22779)"
This reverts commit 47a1745180.
* Fix notebook download task
* Remove done call from extensions-ci
68 lines
1.8 KiB
TypeScript
68 lines
1.8 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
interface ILimitedTaskFactory<T> {
|
|
factory: ITask<Promise<T>>;
|
|
c: (value: T | Promise<T>) => void;
|
|
e: (error?: unknown) => void;
|
|
}
|
|
|
|
interface ITask<T> {
|
|
(): T;
|
|
}
|
|
|
|
/**
|
|
* A helper to queue N promises and run them all with a max degree of parallelism. The helper
|
|
* ensures that at any time no more than M promises are running at the same time.
|
|
*
|
|
* Taken from 'src/vs/base/common/async.ts'
|
|
*/
|
|
export class Limiter<T> {
|
|
|
|
private _size = 0;
|
|
private runningPromises: number;
|
|
private readonly maxDegreeOfParalellism: number;
|
|
private readonly outstandingPromises: ILimitedTaskFactory<T>[];
|
|
|
|
constructor(maxDegreeOfParalellism: number) {
|
|
this.maxDegreeOfParalellism = maxDegreeOfParalellism;
|
|
this.outstandingPromises = [];
|
|
this.runningPromises = 0;
|
|
}
|
|
|
|
get size(): number {
|
|
return this._size;
|
|
}
|
|
|
|
queue(factory: ITask<Promise<T>>): Promise<T> {
|
|
this._size++;
|
|
|
|
return new Promise<T>((c, e) => {
|
|
this.outstandingPromises.push({ factory, c, e });
|
|
this.consume();
|
|
});
|
|
}
|
|
|
|
private consume(): void {
|
|
while (this.outstandingPromises.length && this.runningPromises < this.maxDegreeOfParalellism) {
|
|
const iLimitedTask = this.outstandingPromises.shift()!;
|
|
this.runningPromises++;
|
|
|
|
const promise = iLimitedTask.factory();
|
|
promise.then(iLimitedTask.c, iLimitedTask.e);
|
|
promise.then(() => this.consumed(), () => this.consumed());
|
|
}
|
|
}
|
|
|
|
private consumed(): void {
|
|
this._size--;
|
|
this.runningPromises--;
|
|
|
|
if (this.outstandingPromises.length > 0) {
|
|
this.consume();
|
|
}
|
|
}
|
|
}
|