Skip to content

Commit 443f50a

Browse files
author
Martin Lercher
committed
Named three background threads
1 parent 7294011 commit 443f50a

File tree

3 files changed

+32
-20
lines changed

3 files changed

+32
-20
lines changed

src/JsonRpc/InputHandler.cs

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ IResponseRouter responseRouter
4242
_responseRouter = responseRouter;
4343

4444
_scheduler = new ProcessScheduler();
45-
_inputThread = new Thread(ProcessInputStream) { IsBackground = true };
46-
}
45+
_inputThread = new Thread(ProcessInputStream) { IsBackground = true, Name = "ProcessInputStream" };
46+
}
4747

4848
public void Start()
4949
{
@@ -60,10 +60,14 @@ private async void ProcessInputStream()
6060

6161
var buffer = new char[300];
6262
var current = await _input.ReadBlockAsync(buffer, 0, MinBuffer);
63+
if (current == 0) return; // no more _input
64+
6365
while (current < MinBuffer || buffer[current - 4] != CR || buffer[current - 3] != LF ||
6466
buffer[current - 2] != CR || buffer[current - 1] != LF)
6567
{
66-
current += await _input.ReadBlockAsync(buffer, current, 1);
68+
var n = await _input.ReadBlockAsync(buffer, current, 1);
69+
if (n == 0) return; // no more _input, mitigates endless loop here.
70+
current += n;
6771
}
6872

6973
var headersContent = new string(buffer, 0, current);
@@ -75,17 +79,28 @@ private async void ProcessInputStream()
7579
var value = headers[i + 1].Trim();
7680
if (header.Equals("Content-Length", StringComparison.OrdinalIgnoreCase))
7781
{
78-
length = long.Parse(value);
82+
length = 0;
83+
long.TryParse(value, out length);
7984
}
8085
}
8186

82-
var requestBuffer = new char[length];
83-
84-
await _input.ReadBlockAsync(requestBuffer, 0, requestBuffer.Length);
85-
86-
var payload = new string(requestBuffer);
87-
88-
HandleRequest(payload);
87+
if (length == 0 || length >= int.MaxValue)
88+
{
89+
HandleRequest(string.Empty);
90+
}
91+
else
92+
{
93+
var requestBuffer = new char[length];
94+
var received = 0;
95+
while (received < length)
96+
{
97+
var n = await _input.ReadBlockAsync(requestBuffer, received, requestBuffer.Length - received);
98+
if (n == 0) return; // no more _input
99+
received += n;
100+
}
101+
var payload = new string(requestBuffer);
102+
HandleRequest(payload);
103+
}
89104
}
90105
}
91106

@@ -140,7 +155,6 @@ private void HandleRequest(string request)
140155
type,
141156
async () => {
142157
var result = await _requestRouter.RouteRequest(item.Request);
143-
144158
_outputHandler.Send(result.Value);
145159
}
146160
);
@@ -168,7 +182,7 @@ public void Dispose()
168182
{
169183
_outputHandler.Dispose();
170184
_inputThread = null;
171-
_scheduler?.Dispose();
185+
_scheduler.Dispose();
172186
}
173187
}
174188
}

src/JsonRpc/OutputHandler.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@ public OutputHandler(TextWriter output)
1919
_output = output;
2020
_queue = new BlockingCollection<object>();
2121
_cancel = new CancellationTokenSource();
22-
_thread = new Thread(ProcessOutputQueue) {
23-
IsBackground = true
24-
};
22+
_thread = new Thread(ProcessOutputQueue) { IsBackground = true, Name = "ProcessOutputQueue" };
2523
}
2624

2725
public void Start()

src/JsonRpc/ProcessScheduler.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,18 @@ public class ProcessScheduler : IScheduler
1010
{
1111
private readonly BlockingCollection<(RequestProcessType type, Func<Task> request)> _queue;
1212
private readonly CancellationTokenSource _cancel;
13-
private readonly Thread _queueThread;
13+
private readonly Thread _thread;
1414

1515
public ProcessScheduler()
1616
{
1717
_queue = new BlockingCollection<(RequestProcessType type, Func<Task> request)>();
1818
_cancel = new CancellationTokenSource();
19-
_queueThread = new Thread(ProcessRequestQueue) { IsBackground = true };
19+
_thread = new Thread(ProcessRequestQueue) { IsBackground = true, Name = "ProcessRequestQueue" };
2020
}
2121

2222
public void Start()
2323
{
24-
_queueThread.Start();
24+
_thread.Start();
2525
}
2626

2727
public void Add(RequestProcessType type, Func<Task> request)
@@ -84,7 +84,7 @@ private void ProcessRequestQueue()
8484
public void Dispose()
8585
{
8686
_cancel.Cancel();
87-
_queueThread.Join();
87+
_thread.Join();
8888
_cancel.Dispose();
8989
}
9090
}

0 commit comments

Comments
 (0)