From 9207a579347e344e9b007dbf565fbd4761de16ec Mon Sep 17 00:00:00 2001 From: Simon Siefke Date: Thu, 21 May 2026 21:59:36 +0200 Subject: [PATCH 1/2] fix: memory leak in storageMainService --- .../electron-main/storageMainService.ts | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/vs/platform/storage/electron-main/storageMainService.ts b/src/vs/platform/storage/electron-main/storageMainService.ts index d31880cc9b1d9..682f3e75b2b8e 100644 --- a/src/vs/platform/storage/electron-main/storageMainService.ts +++ b/src/vs/platform/storage/electron-main/storageMainService.ts @@ -17,7 +17,7 @@ import { AbstractStorageService, isProfileUsingDefaultStorage, IStorageService, import { ApplicationStorageMain, ApplicationSharedStorageMain, ProfileStorageMain, InMemoryStorageMain, IStorageMain, IStorageMainOptions, WorkspaceStorageMain, IStorageChangeEvent } from './storageMain.js'; import { IUserDataProfile, IUserDataProfilesService } from '../../userDataProfile/common/userDataProfile.js'; import { IUserDataProfilesMainService } from '../../userDataProfile/electron-main/userDataProfile.js'; -import { IAnyWorkspaceIdentifier } from '../../workspace/common/workspace.js'; +import { IAnyWorkspaceIdentifier, toWorkspaceIdentifier } from '../../workspace/common/workspace.js'; import { IUriIdentityService } from '../../uriIdentity/common/uriIdentity.js'; import { Schemas } from '../../../base/common/network.js'; @@ -131,6 +131,20 @@ export class StorageMainService extends Disposable implements IStorageMainServic if (e.workspace) { this.workspaceStorage(e.workspace).init(); } + + + Event.once(Event.any(e.window.onDidClose, e.window.onDidDestroy))(async () => { + if (this.shutdownReason) { + return; + } + if (e.window.profile && this.mapProfileToStorage.has(e.window.profile.id)) { + await this.profileStorage(e.window.profile).close(); + } + const actualWorkspace = e.workspace ?? e.window.openedWorkspace ?? toWorkspaceIdentifier(e.window.backupPath, e.window.isExtensionDevelopmentHost); + if (actualWorkspace && this.mapWorkspaceToStorage.has(actualWorkspace.id)) { + await this.workspaceStorage(actualWorkspace).close(); + } + }); })); // All Storage: Close when shutting down @@ -230,7 +244,7 @@ export class StorageMainService extends Disposable implements IStorageMainServic if (!profileStorage) { this.logService.trace(`StorageMainService: creating profile storage (${profile.name})`); - profileStorage = this._register(this.createProfileStorage(profile)); + profileStorage = this.createProfileStorage(profile); this.mapProfileToStorage.set(profile.id, profileStorage); // Don't use this._register() for listeners that are disposed early @@ -277,7 +291,7 @@ export class StorageMainService extends Disposable implements IStorageMainServic if (!workspaceStorage) { this.logService.trace(`StorageMainService: creating workspace storage (${workspace.id})`); - workspaceStorage = this._register(this.createWorkspaceStorage(workspace)); + workspaceStorage = this.createWorkspaceStorage(workspace); this.mapWorkspaceToStorage.set(workspace.id, workspaceStorage); // Don't use this._register() for Event.once as it auto-disposes From 84b88a6a04c23bea8b379e032bd62adfbef99210 Mon Sep 17 00:00:00 2001 From: Simon Siefke Date: Thu, 21 May 2026 22:25:32 +0200 Subject: [PATCH 2/2] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/vs/platform/storage/electron-main/storageMainService.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/platform/storage/electron-main/storageMainService.ts b/src/vs/platform/storage/electron-main/storageMainService.ts index 682f3e75b2b8e..aecd264dfae87 100644 --- a/src/vs/platform/storage/electron-main/storageMainService.ts +++ b/src/vs/platform/storage/electron-main/storageMainService.ts @@ -132,7 +132,6 @@ export class StorageMainService extends Disposable implements IStorageMainServic this.workspaceStorage(e.workspace).init(); } - Event.once(Event.any(e.window.onDidClose, e.window.onDidDestroy))(async () => { if (this.shutdownReason) { return;