const checkMemoryUsage = promises.serializeAsyncCall(async () => { const usage = new Map(); await Promise.all(clangServers.values().map(async server => { const mem = await server.getMemoryUsage(); usage.set(server, mem); })); // Servers may have been deleted in the meantime, so calculate the total now. let total = 0; let count = 0; clangServers.forEach(server => { const mem = usage.get(server); if (mem) { total += mem; count++; } }); // Remove servers until we're under the memory limit. // Make sure we allow at least one server to stay alive. if (count > 1 && total > MEMORY_LIMIT) { const toDispose = []; clangServers.rforEach((server, key) => { const mem = usage.get(server); if (mem && count > 1 && total > MEMORY_LIMIT) { total -= mem; count--; toDispose.push(key); } }); toDispose.forEach(key => clangServers.del(key)); } });
async _checkMemoryUsageImpl(): Promise<number> { const serverPids = this._servers .values() .map(server => server.getPID()) .filter(Boolean); if (serverPids.length === 0) { return 0; } const usage = await memoryUsagePerPid(serverPids); let total = Array.from(usage.values()).reduce((a, b) => a + b, 0); // Remove servers until we're under the memory limit. // Make sure we allow at least one server to stay alive. let count = usage.size; if (count > 1 && total > this._memoryLimit) { const toDispose = []; this._servers.rforEach((server, key) => { const mem = usage.get(server.getPID()); if (mem != null && count > 1 && total > this._memoryLimit) { total -= mem; count--; toDispose.push(key); } }); toDispose.forEach(key => this._servers.del(key)); } return total; }