Spaces:
Sleeping
Sleeping
File size: 1,505 Bytes
4a288a7 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | // @flow
import WebWorker from './web_worker';
import type {WorkerInterface} from './web_worker';
import browser from './browser';
export const PRELOAD_POOL_ID = 'mapboxgl_preloaded_worker_pool';
/**
* Constructs a worker pool.
* @private
*/
export default class WorkerPool {
static workerCount: number;
active: {[_: number | string]: boolean};
workers: Array<WorkerInterface>;
constructor() {
this.active = {};
}
acquire(mapId: number | string): Array<WorkerInterface> {
if (!this.workers) {
// Lazily look up the value of mapboxgl.workerCount so that
// client code has had a chance to set it.
this.workers = [];
while (this.workers.length < WorkerPool.workerCount) {
this.workers.push(new WebWorker());
}
}
this.active[mapId] = true;
return this.workers.slice();
}
release(mapId: number | string) {
delete this.active[mapId];
if (this.numActive() === 0) {
this.workers.forEach((w) => {
w.terminate();
});
this.workers = (null: any);
}
}
isPreloaded(): boolean {
return !!this.active[PRELOAD_POOL_ID];
}
numActive(): number {
return Object.keys(this.active).length;
}
}
const availableLogicalProcessors = Math.floor(browser.hardwareConcurrency / 2);
WorkerPool.workerCount = Math.max(Math.min(availableLogicalProcessors, 6), 1);
|