Skip to content

Commit 4b4bf8f

Browse files
authored
fix: unnecessary cancellation messages in ipc
* performance optimization * Ensure that requests made by the client are canceled when the client is disposed. * remove the combinedDisposable function * remove the combinedDisposable function Co-authored-by: Connor Peet <[email protected]> --------- Co-authored-by: Connor Peet <[email protected]>
2 parents a83b9ea + dc4aee2 commit 4b4bf8f

File tree

2 files changed

+26
-10
lines changed

2 files changed

+26
-10
lines changed

src/vs/base/parts/ipc/common/ipc.ts

+25-9
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import { CancellationToken, CancellationTokenSource } from '../../../common/canc
1010
import { memoize } from '../../../common/decorators.js';
1111
import { CancellationError, ErrorNoTelemetry } from '../../../common/errors.js';
1212
import { Emitter, Event, EventMultiplexer, Relay } from '../../../common/event.js';
13-
import { combinedDisposable, DisposableStore, dispose, IDisposable, toDisposable } from '../../../common/lifecycle.js';
13+
import { createSingleCallFunction } from '../../../common/functional.js';
14+
import { DisposableStore, dispose, IDisposable, toDisposable } from '../../../common/lifecycle.js';
1415
import { revive } from '../../../common/marshalling.js';
1516
import * as strings from '../../../common/strings.js';
1617
import { isFunction, isUndefinedOrNull } from '../../../common/types.js';
@@ -580,6 +581,7 @@ export class ChannelClient implements IChannelClient, IDisposable {
580581
}
581582

582583
let disposable: IDisposable;
584+
let disposableWithRequestCancel: IDisposable;
583585

584586
const result = new Promise((c, e) => {
585587
if (cancellationToken.isCancellationRequested) {
@@ -635,14 +637,20 @@ export class ChannelClient implements IChannelClient, IDisposable {
635637
e(new CancellationError());
636638
};
637639

638-
const cancellationTokenListener = cancellationToken.onCancellationRequested(cancel);
639-
disposable = combinedDisposable(toDisposable(cancel), cancellationTokenListener);
640-
this.activeRequests.add(disposable);
640+
disposable = cancellationToken.onCancellationRequested(cancel);
641+
disposableWithRequestCancel = {
642+
dispose: createSingleCallFunction(() => {
643+
cancel();
644+
disposable.dispose();
645+
})
646+
};
647+
648+
this.activeRequests.add(disposableWithRequestCancel);
641649
});
642650

643651
return result.finally(() => {
644652
disposable.dispose();
645-
this.activeRequests.delete(disposable);
653+
this.activeRequests.delete(disposableWithRequestCancel);
646654
});
647655
}
648656

@@ -655,12 +663,19 @@ export class ChannelClient implements IChannelClient, IDisposable {
655663

656664
const emitter = new Emitter<any>({
657665
onWillAddFirstListener: () => {
658-
uninitializedPromise = createCancelablePromise(_ => this.whenInitialized());
659-
uninitializedPromise.then(() => {
660-
uninitializedPromise = null;
666+
const doRequest = () => {
661667
this.activeRequests.add(emitter);
662668
this.sendRequest(request);
663-
});
669+
};
670+
if (this.state === State.Idle) {
671+
doRequest();
672+
} else {
673+
uninitializedPromise = createCancelablePromise(_ => this.whenInitialized());
674+
uninitializedPromise.then(() => {
675+
uninitializedPromise = null;
676+
doRequest();
677+
});
678+
}
664679
},
665680
onDidRemoveLastListener: () => {
666681
if (uninitializedPromise) {
@@ -933,6 +948,7 @@ export class IPCServer<TContext = string> implements IChannelServer<TContext>, I
933948
disposables = undefined;
934949
}
935950
});
951+
that.disposables.add(emitter);
936952

937953
return emitter.event;
938954
}

src/vs/workbench/services/extensions/common/rpcProtocol.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,7 @@ export class RPCProtocol extends Disposable implements IRPCProtocol {
483483
disposable.add(cancellationToken.onCancellationRequested(() => {
484484
const msg = MessageIO.serializeCancel(req);
485485
this._logger?.logOutgoing(msg.byteLength, req, RequestInitiator.LocalSide, `cancel`);
486-
this._protocol.send(MessageIO.serializeCancel(req));
486+
this._protocol.send(msg);
487487
}));
488488
}
489489

0 commit comments

Comments
 (0)