Skip to content

Commit 9b50f56

Browse files
Get server working again
1 parent 26c71c9 commit 9b50f56

File tree

3 files changed

+70
-57
lines changed

3 files changed

+70
-57
lines changed

src/features/status.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -278,17 +278,11 @@ function showMessageSoon() {
278278
function forwardOutput(server: OmniSharpServer) {
279279

280280
const logChannel = server.getChannel();
281-
const timing200Pattern = /^\[INFORMATION:OmniSharp.Middleware.LoggingMiddleware\] \/\w+: 200 \d+ms/;
282281

283282
function forward(message: string) {
284-
// strip stuff like: /codecheck: 200 339ms
285-
if(!timing200Pattern.test(message)) {
286-
logChannel.append(message);
287-
}
283+
logChannel.append(message);
288284
}
289285

290286
return vscode.Disposable.from(
291-
server.onStdout(forward),
292287
server.onStderr(forward));
293-
}
294-
288+
}

src/omnisharp/queue.ts renamed to src/omnisharp/requestQueue.ts

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ import { Logger } from '../logger';
77
import * as protocol from './protocol';
88
import * as prioritization from './prioritization';
99

10-
interface Request {
10+
export interface Request {
1111
command: string;
1212
data?: any;
1313
onSuccess(value: any): void;
1414
onError(err: any): void;
15+
startTime?: number;
16+
endTime?: number;
1517
}
1618

1719
/**
@@ -20,37 +22,47 @@ interface Request {
2022
*/
2123
class RequestQueue {
2224
private _pending: Request[] = [];
23-
private _waiting: Map<number, protocol.WireProtocol.RequestPacket> = new Map<number, protocol.WireProtocol.RequestPacket>();
25+
private _waiting: Map<number, Request> = new Map<number, Request>();
2426

2527
public constructor(
2628
private _name: string,
2729
private _maxSize: number,
2830
private _logger: Logger,
29-
private _makeRequest: (request: Request) => protocol.WireProtocol.RequestPacket) {
31+
private _makeRequest: (request: Request) => number) {
3032
}
3133

3234
/**
3335
* Enqueue a new request.
3436
*/
3537
public enqueue(request: Request) {
36-
this._logger.appendLine(`Enqueuing request for ${request.command}.`);
38+
this._logger.appendLine(`Enqueue request for ${request.command}.`);
3739
this._pending.push(request);
3840
}
3941

40-
public dequeue(seq: number) {
41-
return this._waiting.delete(seq);
42+
/**
43+
* Dequeue a request that has completed.
44+
*/
45+
public dequeue(id: number) {
46+
const request = this._waiting.get(id);
47+
48+
if (request) {
49+
this._waiting.delete(id);
50+
this._logger.appendLine(`Dequeue request for ${request.command}.`);
51+
}
52+
53+
return request;
4254
}
4355

44-
public delete(request: Request) {
56+
public cancelRequest(request: Request) {
4557
let index = this._pending.indexOf(request);
4658
if (index !== -1) {
4759
this._pending.splice(index, 1);
4860

49-
// Do something better here.
50-
let err = new Error('Canceled');
51-
err.message = 'Canceled';
52-
request.onError(err);
61+
// Note: This calls reject() on the promise returned by OmniSharpServer.makeRequest
62+
request.onError(new Error(`Pending request cancelled: ${request.command}`));
5363
}
64+
65+
// TODO: Handle cancellation of a request already waiting on the OmniSharp server.
5466
}
5567

5668
/**
@@ -79,8 +91,10 @@ class RequestQueue {
7991

8092
for (let i = 0; i < slots && this._pending.length > 0; i++) {
8193
const item = this._pending.shift();
82-
const request = this._makeRequest(item);
83-
this._waiting.set(request.Seq, request);
94+
item.startTime = Date.now();
95+
96+
const id = this._makeRequest(item);
97+
this._waiting.set(id, item);
8498

8599
if (this.isFull()) {
86100
return;
@@ -89,7 +103,7 @@ class RequestQueue {
89103
}
90104
}
91105

92-
export class Queue {
106+
export class RequestQueueCollection {
93107
private _logger: Logger;
94108
private _isProcessing: boolean;
95109
private _priorityQueue: RequestQueue;
@@ -99,7 +113,7 @@ export class Queue {
99113
public constructor(
100114
logger: Logger,
101115
concurrency: number,
102-
makeRequest: (request: Request) => protocol.WireProtocol.RequestPacket
116+
makeRequest: (request: Request) => number
103117
) {
104118
this._priorityQueue = new RequestQueue('Priority', 1, logger, makeRequest);
105119
this._normalQueue = new RequestQueue('Normal', concurrency, logger, makeRequest);
@@ -132,7 +146,7 @@ export class Queue {
132146

133147
public cancelRequest(request: Request) {
134148
const queue = this.getQueue(request.command);
135-
queue.delete(request);
149+
queue.cancelRequest(request);
136150
}
137151

138152
public drain() {

src/omnisharp/server.ts

Lines changed: 38 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,19 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
'use strict';
7-
8-
import {EventEmitter} from 'events';
9-
import {ChildProcess, exec} from 'child_process';
10-
import {dirname} from 'path';
11-
import {ReadLine, createInterface} from 'readline';
12-
import {launchOmniSharp} from './launcher';
13-
import * as protocol from './protocol';
14-
import {Options} from './options';
15-
import {Logger} from '../logger';
16-
import {DelayTracker} from './delayTracker';
17-
import {LaunchTarget, findLaunchTargets} from './launcher';
18-
import { Queue } from './queue';
6+
import { EventEmitter } from 'events';
7+
import { ChildProcess, exec } from 'child_process';
8+
import { ReadLine, createInterface } from 'readline';
9+
import { launchOmniSharp } from './launcher';
10+
import { Options } from './options';
11+
import { Logger } from '../logger';
12+
import { DelayTracker } from './delayTracker';
13+
import { LaunchTarget, findLaunchTargets } from './launcher';
14+
import { PlatformInformation } from '../platform';
15+
import { Request, RequestQueueCollection } from './requestQueue';
1916
import TelemetryReporter from 'vscode-extension-telemetry';
17+
import * as path from 'path';
18+
import * as protocol from './protocol';
2019
import * as vscode from 'vscode';
2120

2221
enum ServerState {
@@ -25,13 +24,6 @@ enum ServerState {
2524
Stopped
2625
}
2726

28-
interface Request {
29-
command: string;
30-
data?: any;
31-
onSuccess(value: any): void;
32-
onError(err: any): void;
33-
}
34-
3527
module Events {
3628
export const StateChanged = 'stateChanged';
3729

@@ -78,7 +70,7 @@ export class OmniSharpServer {
7870
private _eventBus = new EventEmitter();
7971
private _state: ServerState = ServerState.Stopped;
8072
private _launchTarget: LaunchTarget;
81-
private _requestQueue: Queue;
73+
private _requestQueue: RequestQueueCollection;
8274
private _channel: vscode.OutputChannel;
8375
private _logger: Logger;
8476

@@ -92,7 +84,7 @@ export class OmniSharpServer {
9284

9385
this._channel = vscode.window.createOutputChannel('OmniSharp Log');
9486
this._logger = new Logger(message => this._channel.append(message));
95-
this._requestQueue = new Queue(this._logger, 8, request => this._makeRequest(request));
87+
this._requestQueue = new RequestQueueCollection(this._logger, 8, request => this._makeRequest(request));
9688
}
9789

9890
public isRunning(): boolean {
@@ -123,9 +115,9 @@ export class OmniSharpServer {
123115
private _reportTelemetry() {
124116
const delayTrackers = this._delayTrackers;
125117

126-
for (const path in delayTrackers) {
127-
const tracker = delayTrackers[path];
128-
const eventName = 'omnisharp' + path;
118+
for (const requestName in delayTrackers) {
119+
const tracker = delayTrackers[requestName];
120+
const eventName = 'omnisharp' + requestName;
129121
if (tracker.hasMeasures()) {
130122
const measures = tracker.getMeasures();
131123
tracker.clearMeasures();
@@ -236,7 +228,7 @@ export class OmniSharpServer {
236228
this._launchTarget = launchTarget;
237229

238230
const solutionPath = launchTarget.target;
239-
const cwd = dirname(solutionPath);
231+
const cwd = path.dirname(solutionPath);
240232
let args = [
241233
'-s', solutionPath,
242234
'--hostPID', process.pid.toString(),
@@ -472,6 +464,7 @@ export class OmniSharpServer {
472464
if (listener) {
473465
listener.dispose();
474466
}
467+
475468
clearTimeout(handle);
476469
resolve();
477470
});
@@ -522,24 +515,25 @@ export class OmniSharpServer {
522515
}
523516

524517
private _handleResponsePacket(packet: protocol.WireProtocol.ResponsePacket) {
525-
if (!this._requestQueue.dequeue(packet.Command, packet.Request_seq)) {
518+
const request = this._requestQueue.dequeue(packet.Command, packet.Request_seq);
519+
520+
if (!request) {
526521
this._logger.appendLine(`Received response for ${packet.Command} but could not find request.`);
527522
return;
528523
}
529524

530525
if (packet.Success) {
531-
// Handle success
526+
request.onSuccess(packet.Body);
532527
}
533528
else {
534-
// Handle failure
529+
request.onError(packet.Message || packet.Body);
535530
}
536531
}
537532

538533
private _handleEventPacket(packet: protocol.WireProtocol.EventPacket): void {
539534
if (packet.Event === 'log') {
540-
// handle log events
541535
const entry = <{ LogLevel: string; Name: string; Message: string; }>packet.Body;
542-
this._logger.appendLine(`[${entry.LogLevel}:${entry.Name}] ${entry.Message}`);
536+
this._logOutput(entry.LogLevel, entry.Name, entry.Message);
543537
}
544538
else {
545539
// fwd all other events
@@ -557,10 +551,21 @@ export class OmniSharpServer {
557551
Arguments: request.data
558552
};
559553

560-
console.log(`Making request: ${request.command} (${id})`);
554+
this._logger.appendLine(`Making request: ${request.command} (${id})`);
561555

562556
this._serverProcess.stdin.write(JSON.stringify(requestPacket) + '\n');
563557

564-
return requestPacket;
558+
return id;
559+
}
560+
561+
private _logOutput(logLevel: string, name: string, message: string) {
562+
const timing200Pattern = /^\[INFORMATION:OmniSharp.Middleware.LoggingMiddleware\] \/[\/\w]+: 200 \d+ms/;
563+
564+
const output = `[${logLevel}:${name}] ${message}`;
565+
566+
// strip stuff like: /codecheck: 200 339ms
567+
if (!timing200Pattern.test(output)) {
568+
this._logger.appendLine(output);
569+
}
565570
}
566571
}

0 commit comments

Comments
 (0)