未验证 提交 bacbfd23 编写于 作者: C Connor Peet

use built-in queue(), pr comments

上级 04ebcec7
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
import { Emitter, Event } from 'vs/base/common/event'; import { Emitter, Event } from 'vs/base/common/event';
import { IDebugAdapter } from 'vs/workbench/contrib/debug/common/debug'; import { IDebugAdapter } from 'vs/workbench/contrib/debug/common/debug';
import { timeout } from 'vs/base/common/async'; import { timeout, Queue } from 'vs/base/common/async';
/** /**
* Abstract implementation of the low level API for a debug adapter. * Abstract implementation of the low level API for a debug adapter.
...@@ -18,7 +18,7 @@ export abstract class AbstractDebugAdapter implements IDebugAdapter { ...@@ -18,7 +18,7 @@ export abstract class AbstractDebugAdapter implements IDebugAdapter {
private requestCallback: ((request: DebugProtocol.Request) => void) | undefined; private requestCallback: ((request: DebugProtocol.Request) => void) | undefined;
private eventCallback: ((request: DebugProtocol.Event) => void) | undefined; private eventCallback: ((request: DebugProtocol.Event) => void) | undefined;
private messageCallback: ((message: DebugProtocol.ProtocolMessage) => void) | undefined; private messageCallback: ((message: DebugProtocol.ProtocolMessage) => void) | undefined;
private readonly queue: DebugProtocol.ProtocolMessage[] = []; private readonly queue = new Queue();
protected readonly _onError = new Emitter<Error>(); protected readonly _onError = new Emitter<Error>();
protected readonly _onExit = new Emitter<number | null>(); protected readonly _onExit = new Emitter<number | null>();
...@@ -109,41 +109,33 @@ export abstract class AbstractDebugAdapter implements IDebugAdapter { ...@@ -109,41 +109,33 @@ export abstract class AbstractDebugAdapter implements IDebugAdapter {
this.messageCallback(message); this.messageCallback(message);
} }
else { else {
// Artificially queueing protocol messages guarantees that any microtasks for this.queue.queue(() => {
// previous message finish before next message is processed. This is essential switch (message.type) {
// to guarantee ordering when using promises anywhere along the call path. case 'event':
this.queue.push(message); if (this.eventCallback) {
if (this.queue.length === 1) { this.eventCallback(<DebugProtocol.Event>message);
setTimeout(() => this.processQueue(), 0); }
} break;
} case 'request':
} if (this.requestCallback) {
this.requestCallback(<DebugProtocol.Request>message);
private processQueue(): void { }
const message = this.queue!.shift()!; break;
switch (message.type) { case 'response':
case 'event': const response = <DebugProtocol.Response>message;
if (this.eventCallback) { const clb = this.pendingRequests.get(response.request_seq);
this.eventCallback(<DebugProtocol.Event>message); if (clb) {
} this.pendingRequests.delete(response.request_seq);
break; clb(response);
case 'request': }
if (this.requestCallback) { break;
this.requestCallback(<DebugProtocol.Request>message);
} }
break;
case 'response':
const response = <DebugProtocol.Response>message;
const clb = this.pendingRequests.get(response.request_seq);
if (clb) {
this.pendingRequests.delete(response.request_seq);
clb(response);
}
break;
}
if (this.queue.length) { // Artificially queueing protocol messages guarantees that any microtasks for
setTimeout(() => this.processQueue(), 0); // previous message finish before next message is processed. This is essential
// to guarantee ordering when using promises anywhere along the call path.
return timeout(0);
});
} }
} }
...@@ -180,6 +172,6 @@ export abstract class AbstractDebugAdapter implements IDebugAdapter { ...@@ -180,6 +172,6 @@ export abstract class AbstractDebugAdapter implements IDebugAdapter {
} }
dispose(): void { dispose(): void {
// noop this.queue.dispose();
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册