@@ -236,210 +236,6 @@ internal class StreamLogger : IObserver<(PsesLogLevel logLevel, string message)>
236236 {
237237 public static StreamLogger CreateWithNewFile ( string path )
238238 {
239-
240- /* Unmerged change from project 'PowerShellEditorServices.Hosting(net461)'
241- Before:
242- var fileStream = new FileStream(
243- path,
244- FileMode.Create,
245- FileAccess.Write,
246- FileShare.Read,
247- bufferSize: 4096,
248- FileOptions.SequentialScan);
249-
250- return new StreamLogger(new StreamWriter(fileStream, new UTF8Encoding(encoderShouldEmitUTF8Identifier: true)));
251- }
252-
253- private readonly StreamWriter _fileWriter;
254-
255- private readonly BlockingCollection<string> _messageQueue;
256-
257- private readonly CancellationTokenSource _cancellationSource;
258-
259- private readonly Thread _writerThread;
260-
261- // This cannot be a bool
262- // See https://stackoverflow.com/q/6164751
263- private int _hasCompleted;
264-
265- private IDisposable _unsubscriber;
266-
267- public StreamLogger(StreamWriter streamWriter)
268- {
269- streamWriter.AutoFlush = true;
270- _fileWriter = streamWriter;
271- _hasCompleted = 0;
272- _cancellationSource = new CancellationTokenSource();
273- _messageQueue = new BlockingCollection<string>();
274-
275- // Start writer listening to queue
276- _writerThread = new Thread(RunWriter)
277- {
278- Name = "PSES Stream Logger Thread",
279- };
280- _writerThread.Start();
281- }
282-
283- public void OnCompleted()
284- {
285- // Ensure we only complete once
286- if (Interlocked.Exchange(ref _hasCompleted, 1) != 0)
287- {
288- return;
289- }
290-
291- _cancellationSource.Cancel();
292-
293- _writerThread.Join();
294-
295- _unsubscriber.Dispose();
296- _fileWriter.Flush();
297- _fileWriter.Close();
298- _fileWriter.Dispose();
299- _cancellationSource.Dispose();
300- _messageQueue.Dispose();
301- }
302-
303- public void OnError(Exception error)
304- {
305- OnNext((PsesLogLevel.Error, $"Error occurred while logging: {error}"));
306- }
307-
308- public void OnNext((PsesLogLevel logLevel, string message) value)
309- {
310- string message = null;
311- switch (value.logLevel)
312- {
313- case PsesLogLevel.Diagnostic:
314- message = $"[DBG]: {value.message}";
315- break;
316-
317- case PsesLogLevel.Verbose:
318- message = $"[VRB]: {value.message}";
319- break;
320-
321- case PsesLogLevel.Normal:
322- message = $"[INF]: {value.message}";
323- break;
324-
325- case PsesLogLevel.Warning:
326- message = $"[WRN]: {value.message}";
327- break;
328-
329- case PsesLogLevel.Error:
330- message = $"[ERR]: {value.message}";
331- break;
332- };
333-
334- _messageQueue.Add(message);
335- }
336-
337- public void AddUnsubscriber(IDisposable unsubscriber)
338- {
339- _unsubscriber = unsubscriber;
340- }
341-
342- public void Dispose()
343- {
344- OnCompleted();
345- }
346- After:
347- var fileStream = new(
348- path,
349- FileMode.Create,
350- FileAccess.Write,
351- FileShare.Read,
352- bufferSize: 4096,
353- FileOptions.SequentialScan);
354-
355- return new StreamLogger(new StreamWriter(fileStream, new UTF8Encoding(encoderShouldEmitUTF8Identifier: true)));
356- }
357-
358- private readonly StreamWriter _fileWriter;
359-
360- private readonly BlockingCollection<string> _messageQueue;
361-
362- private readonly CancellationTokenSource _cancellationSource;
363-
364- private readonly Thread _writerThread;
365-
366- // This cannot be a bool
367- // See https://stackoverflow.com/q/6164751
368- private int _hasCompleted;
369-
370- private IDisposable _unsubscriber;
371-
372- public StreamLogger(StreamWriter streamWriter)
373- {
374- streamWriter.AutoFlush = true;
375- _fileWriter = streamWriter;
376- _hasCompleted = 0;
377- _cancellationSource = new CancellationTokenSource();
378- _messageQueue = new BlockingCollection<string>();
379-
380- // Start writer listening to queue
381- _writerThread = new Thread(RunWriter)
382- {
383- Name = "PSES Stream Logger Thread",
384- };
385- _writerThread.Start();
386- }
387-
388- public void OnCompleted()
389- {
390- // Ensure we only complete once
391- if (Interlocked.Exchange(ref _hasCompleted, 1) != 0)
392- {
393- return;
394- }
395-
396- _cancellationSource.Cancel();
397-
398- _writerThread.Join();
399-
400- _unsubscriber.Dispose();
401- _fileWriter.Flush();
402- _fileWriter.Close();
403- _fileWriter.Dispose();
404- _cancellationSource.Dispose();
405- _messageQueue.Dispose();
406- }
407-
408- public void OnError(Exception error) => OnNext((PsesLogLevel.Error, $"Error occurred while logging: {error}"));
409-
410- public void OnNext((PsesLogLevel logLevel, string message) value)
411- {
412- string message = null;
413- switch (value.logLevel)
414- {
415- case PsesLogLevel.Diagnostic:
416- message = $"[DBG]: {value.message}";
417- break;
418-
419- case PsesLogLevel.Verbose:
420- message = $"[VRB]: {value.message}";
421- break;
422-
423- case PsesLogLevel.Normal:
424- message = $"[INF]: {value.message}";
425- break;
426-
427- case PsesLogLevel.Warning:
428- message = $"[WRN]: {value.message}";
429- break;
430-
431- case PsesLogLevel.Error:
432- message = $"[ERR]: {value.message}";
433- break;
434- };
435-
436- _messageQueue.Add(message);
437- }
438-
439- public void AddUnsubscriber(IDisposable unsubscriber) => _unsubscriber = unsubscriber;
440-
441- public void Dispose() => OnCompleted();
442- */
443239 FileStream fileStream = new (
444240 path ,
445241 FileMode . Create ,
0 commit comments