提交 5c3fc9ca 编写于 作者: B Benjamin Pasero

storage - dispose some listeners on close already

上级 b782c3a6
......@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import { Database, Statement } from 'vscode-sqlite3';
import { Disposable, IDisposable } from 'vs/base/common/lifecycle';
import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle';
import { Emitter, Event } from 'vs/base/common/event';
import { ThrottledDelayer, timeout } from 'vs/base/common/async';
import { isUndefinedOrNull } from 'vs/base/common/types';
......@@ -97,6 +97,8 @@ export class Storage extends Disposable implements IStorage {
private pendingDeletes: Set<string> = new Set<string>();
private pendingInserts: Map<string, string> = new Map();
private onDidChangeItemsExternalListener: IDisposable;
constructor(
protected database: IStorageDatabase,
private options: IStorageOptions = Object.create(null)
......@@ -109,7 +111,7 @@ export class Storage extends Disposable implements IStorage {
}
private registerListeners(): void {
this._register(this.database.onDidChangeItemsExternal(e => this.onDidChangeItemsExternal(e)));
this.onDidChangeItemsExternalListener = this.database.onDidChangeItemsExternal(e => this.onDidChangeItemsExternal(e));
}
private onDidChangeItemsExternal(e: IStorageItemsChangeEvent): void {
......@@ -265,7 +267,12 @@ export class Storage extends Disposable implements IStorage {
}
beforeClose(): void {
this.flushDelay = 0; // when we are about to close, reduce our flush delay to 0 to consume too much time
// when we are about to close, reduce our flush delay to 0 to consume too much time
this.flushDelay = 0;
// when we are about to close, we start to ignore external changes since we close anyway
this.onDidChangeItemsExternalListener = dispose(this.onDidChangeItemsExternalListener);
}
close(): Thenable<void> {
......@@ -302,6 +309,12 @@ export class Storage extends Disposable implements IStorage {
checkIntegrity(full: boolean): Thenable<string> {
return this.database.checkIntegrity(full);
}
dispose(): void {
super.dispose();
this.onDidChangeItemsExternalListener = dispose(this.onDidChangeItemsExternalListener);
}
}
interface IOpenDatabaseResult {
......
......@@ -8,7 +8,7 @@ import { Event, Emitter, debounceEvent } from 'vs/base/common/event';
import { StorageMainService, IStorageChangeEvent } from 'vs/platform/storage/node/storageMainService';
import { IUpdateRequest, IStorageDatabase, IStorageItemsChangeEvent } from 'vs/base/node/storage';
import { mapToSerializable, serializableToMap, values } from 'vs/base/common/map';
import { Disposable } from 'vs/base/common/lifecycle';
import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle';
type Key = string;
type Value = string;
......@@ -107,6 +107,8 @@ export class GlobalStorageDatabaseChannelClient extends Disposable implements IS
private _onDidChangeItemsExternal: Emitter<IStorageItemsChangeEvent> = this._register(new Emitter<IStorageItemsChangeEvent>());
get onDidChangeItemsExternal(): Event<IStorageItemsChangeEvent> { return this._onDidChangeItemsExternal.event; }
private onDidChangeItemsOnMainListener: IDisposable;
constructor(private channel: IChannel) {
super();
......@@ -114,7 +116,7 @@ export class GlobalStorageDatabaseChannelClient extends Disposable implements IS
}
private registerListeners(): void {
this._register(this.channel.listen('onDidChangeItems')((e: ISerializableItemsChangeEvent) => this.onDidChangeItemsOnMain(e)));
this.onDidChangeItemsOnMainListener = this.channel.listen('onDidChangeItems')((e: ISerializableItemsChangeEvent) => this.onDidChangeItemsOnMain(e));
}
private onDidChangeItemsOnMain(e: ISerializableItemsChangeEvent): void {
......@@ -153,6 +155,16 @@ export class GlobalStorageDatabaseChannelClient extends Disposable implements IS
}
close(): Thenable<void> {
// when we are about to close, we start to ignore main-side changes since we close anyway
this.onDidChangeItemsOnMainListener = dispose(this.onDidChangeItemsOnMainListener);
return Promise.resolve(); // global storage is closed on the main side
}
dispose(): void {
super.dispose();
this.onDidChangeItemsOnMainListener = dispose(this.onDidChangeItemsOnMainListener);
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册