From 656782c7dc9ad9e2c94dacb7da9688d712062a77 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 3 Jul 2023 12:45:19 -0700 Subject: [PATCH] Prevent the same terminal being reconnected to twice Part of #186922 Part of #133542 --- src/vs/platform/terminal/node/ptyService.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/vs/platform/terminal/node/ptyService.ts b/src/vs/platform/terminal/node/ptyService.ts index ae9a5c7a7d3dc..a046543bad8dd 100644 --- a/src/vs/platform/terminal/node/ptyService.ts +++ b/src/vs/platform/terminal/node/ptyService.ts @@ -518,7 +518,8 @@ export class PtyService extends Disposable implements IPtyService { performance.mark('code/willGetTerminalLayoutInfo'); const layout = this._workspaceLayoutInfos.get(args.workspaceId); if (layout) { - const expandedTabs = await Promise.all(layout.tabs.map(async tab => this._expandTerminalTab(tab))); + const doneSet: Set = new Set(); + const expandedTabs = await Promise.all(layout.tabs.map(async tab => this._expandTerminalTab(tab, doneSet))); const tabs = expandedTabs.filter(t => t.terminals.length > 0); performance.mark('code/didGetTerminalLayoutInfo'); return { tabs }; @@ -527,8 +528,8 @@ export class PtyService extends Disposable implements IPtyService { return undefined; } - private async _expandTerminalTab(tab: ITerminalTabLayoutInfoById): Promise { - const expandedTerminals = (await Promise.all(tab.terminals.map(t => this._expandTerminalInstance(t)))); + private async _expandTerminalTab(tab: ITerminalTabLayoutInfoById, doneSet: Set): Promise { + const expandedTerminals = (await Promise.all(tab.terminals.map(t => this._expandTerminalInstance(t, doneSet)))); const filtered = expandedTerminals.filter(term => term.terminal !== null) as IRawTerminalInstanceLayoutInfo[]; return { isActive: tab.isActive, @@ -537,12 +538,16 @@ export class PtyService extends Disposable implements IPtyService { }; } - private async _expandTerminalInstance(t: ITerminalInstanceLayoutInfoById): Promise> { + private async _expandTerminalInstance(t: ITerminalInstanceLayoutInfoById, doneSet: Set): Promise> { try { const revivedPtyId = this._revivedPtyIdMap.get(t.terminal)?.newId; this._logService.info(`Expanding terminal instance, old id ${t.terminal} -> new id ${revivedPtyId}`); this._revivedPtyIdMap.delete(t.terminal); const persistentProcessId = revivedPtyId ?? t.terminal; + if (doneSet.has(persistentProcessId)) { + throw new Error(`Terminal ${persistentProcessId} has already been expanded`); + } + doneSet.add(persistentProcessId); const persistentProcess = this._throwIfNoPty(persistentProcessId); const processDetails = persistentProcess && await this._buildProcessDetails(t.terminal, persistentProcess, revivedPtyId !== undefined); return {