diff --git a/Tests/Cosmos.TestRunner.Full/DefaultEngineConfiguration.cs b/Tests/Cosmos.TestRunner.Full/DefaultEngineConfiguration.cs
index bccfcc230..73fad3cff 100644
--- a/Tests/Cosmos.TestRunner.Full/DefaultEngineConfiguration.cs
+++ b/Tests/Cosmos.TestRunner.Full/DefaultEngineConfiguration.cs
@@ -21,8 +21,8 @@ namespace Cosmos.TestRunner.Full
}
}
- public virtual bool RunWithGDB => false;
- public virtual bool StartBochsDebugGUI => false;
+ public virtual bool RunWithGDB => true;
+ public virtual bool StartBochsDebugGUI => true;
public virtual bool DebugIL2CPU => false;
public virtual string KernelPkg => String.Empty;
diff --git a/Tests/Cosmos.TestRunner.TestController/Assert.cs b/Tests/Cosmos.TestRunner.TestController/Assert.cs
index 32abf6a87..2c7971174 100644
--- a/Tests/Cosmos.TestRunner.TestController/Assert.cs
+++ b/Tests/Cosmos.TestRunner.TestController/Assert.cs
@@ -58,6 +58,17 @@ namespace Cosmos.TestRunner
IsTrue(xResult, message, file, line);
}
+ public static void AreEqual(long expected, long actual, string message, [CallerFilePath] string file = null, [CallerLineNumber] int line = 0)
+ {
+ var xResult = expected == actual;
+ if (!xResult)
+ {
+ TestController.Debugger.Send($"Expected value: '{expected}'");
+ TestController.Debugger.Send($"Actual value: '{actual}'");
+ }
+ IsTrue(xResult, message, file, line);
+ }
+
public static void AreEqual(string[] expected, string[] actual, string message, [CallerFilePath] string file = null, [CallerLineNumber] int line = 0)
{
if(expected.Length != actual.Length)
diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/Kernel.cs b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/Kernel.cs
index d0a21a9e8..f3ec50dcc 100644
--- a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/Kernel.cs
+++ b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/Kernel.cs
@@ -36,10 +36,10 @@ namespace Cosmos.Kernel.Tests.Fat
{
mDebugger.Send("Run");
- PathTest.Execute(mDebugger);
- DirectoryTest.Execute(mDebugger);
- FileStreamTest.Execute(mDebugger);
- DirectoryInfoTest.Execute(mDebugger);
+ //PathTest.Execute(mDebugger);
+ //DirectoryTest.Execute(mDebugger);
+ //FileStreamTest.Execute(mDebugger);
+ //DirectoryInfoTest.Execute(mDebugger);
StreamWriterStreamReaderTest.Execute(mDebugger);
BinaryWriterBinaryReaderTest.Execute(mDebugger);
FileInfoTest.Execute(mDebugger);
diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/FileTest.cs b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/FileTest.cs
index 1a25e02b3..5e8dd0c1c 100644
--- a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/FileTest.cs
+++ b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/FileTest.cs
@@ -212,6 +212,7 @@ namespace Cosmos.Kernel.Tests.Fat.System.IO
File.Delete(@"0:\test1.txt");
Assert.IsFalse(File.Exists(@"0:\test1.txt"), "test1.txt wasn't deleted!");
mDebugger.Send("END TEST");
+ mDebugger.Send("");
//mDebugger.Send("START TEST: Delete a directory with File.Delete:");
//Simple test: create a directory, then try to delete it as a file.
@@ -236,23 +237,45 @@ namespace Cosmos.Kernel.Tests.Fat.System.IO
Assert.IsTrue(KudzuTxtContent == Kudzu2TxtContent, "File has not been copied correctly");
/* Now Try to Copy '0:\Kudzu.txt' onto an existing file with the overload of Copy that does permit this */
+ mDebugger.Send("");
mDebugger.Send("START TEST: Copy a file (overwrite existing) :");
File.Copy(@"0:\Kudzu.txt", @"0:\test.dat", true);
mDebugger.Send("The existing file has been overwritten, reading...");
string TestDatContent = File.ReadAllText(@"0:\test.dat");
- Assert.IsTrue(KudzuTxtContent == TestDatContent, "File has not been copied correctly");
+ Assert.AreEqual(KudzuTxtContent, TestDatContent, "File has not been copied correctly");
+ using (StreamReader streamReader = new StreamReader("0:\\test.dat"))
+ {
+ var t = streamReader.ReadToEnd();
+ Assert.AreEqual(KudzuTxtContent, t, "Using StreamReader to read entire (short) file works");
+ }
mDebugger.Send("END TEST");
+ mDebugger.Send("");
#region Test Writing Large Files
string text = new string('o', 4000);
text += new string('l', 4000);
File.WriteAllText("0:\\long.txt", text);
+ var bytes = File.ReadAllBytes("0:\\long.txt");
+ mDebugger.Send("-- Bytes --");
+ mDebugger.Send(BitConverter.ToString(bytes));
+ mDebugger.Send("-- Bytes --");
+
+ using (StreamReader streamReader = new StreamReader("0:\\long.txt"))
+ {
+ Assert.AreEqual(0, streamReader.BaseStream.Position, "Position of StreamReader is correct");
+ Assert.AreEqual(8000, streamReader.BaseStream.Length, "Length of StreamReader is correct");
+ Debugger.DoBochsBreak();
+ var t = streamReader.ReadToEnd();
+ mDebugger.Send("--------------- Check this place! --------- *************");
+ Assert.AreEqual(text, t, "Using StreamReader to read entire (long) file works");
+ }
+
string read = File.ReadAllText("0:\\long.txt");
- Assert.IsTrue(read == text, "Reading files larger than one cluster works using read all text");
+ Assert.AreEqual(text, read, "Reading files larger than one cluster works using read all text");
byte[] textBytes = Encoding.ASCII.GetBytes(text);
mDebugger.Send("Reading all bytes");
byte[] readBytes = File.ReadAllBytes("0:\\long.txt");
diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/StreamWriterStreamReaderTest.cs b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/StreamWriterStreamReaderTest.cs
index ce89a47e1..c50c9c5c6 100644
--- a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/StreamWriterStreamReaderTest.cs
+++ b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/StreamWriterStreamReaderTest.cs
@@ -31,8 +31,8 @@ namespace Cosmos.Kernel.Tests.Fat.System.IO
try
{
mDebugger.Send("Start writing");
-
xSW.Write(text);
+
}
catch
{
diff --git a/build/Targets/RestoreSources.props b/build/Targets/RestoreSources.props
index 8e64ada25..ef7afc63a 100644
--- a/build/Targets/RestoreSources.props
+++ b/build/Targets/RestoreSources.props
@@ -9,7 +9,6 @@
https://ci.appveyor.com/nuget/cosmos-common;
https://ci.appveyor.com/nuget/il2cpu;
https://ci.appveyor.com/nuget/xsharp;
- https://dotnet.myget.org/F/roslyn-tools/api/v3/index.json
$(RestoreSources);$(DefaultPackageOutputPath)
diff --git a/source/Cosmos.Core_Plugs/Runtime/Intrinsics/X86/Sse41Impl.cs b/source/Cosmos.Core_Plugs/Runtime/Intrinsics/X86/Sse41Impl.cs
new file mode 100644
index 000000000..0d96fb8b9
--- /dev/null
+++ b/source/Cosmos.Core_Plugs/Runtime/Intrinsics/X86/Sse41Impl.cs
@@ -0,0 +1,21 @@
+using IL2CPU.API.Attribs;
+
+namespace Cosmos.Core_Plugs.Runtime.Intrinsics.X86
+{
+ [Plug("System.Runtime.Intrinsics.X86.Sse41, System.Private.CoreLib")]
+ class Sse41Impl
+ {
+ public static bool get_IsSupported()
+ {
+ return false;
+ }
+ }
+ [Plug("System.Runtime.Intrinsics.X86.Sse41+X64, System.Private.CoreLib")]
+ class Sse41X86Impl
+ {
+ public static bool get_IsSupported()
+ {
+ return false;
+ }
+ }
+}
diff --git a/source/Cosmos.Core_Plugs/Runtime/Intrinsics/X86/Sse42Impl.cs b/source/Cosmos.Core_Plugs/Runtime/Intrinsics/X86/Sse42Impl.cs
new file mode 100644
index 000000000..932825fc0
--- /dev/null
+++ b/source/Cosmos.Core_Plugs/Runtime/Intrinsics/X86/Sse42Impl.cs
@@ -0,0 +1,21 @@
+using IL2CPU.API.Attribs;
+
+namespace Cosmos.Core_Plugs.Runtime.Intrinsics.X86
+{
+ [Plug("System.Runtime.Intrinsics.X86.Sse42, System.Private.CoreLib")]
+ class Sse42Impl
+ {
+ public static bool get_IsSupported()
+ {
+ return false;
+ }
+ }
+ [Plug("System.Runtime.Intrinsics.X86.Sse42+X64, System.Private.CoreLib")]
+ class Sse42X86Impl
+ {
+ public static bool get_IsSupported()
+ {
+ return false;
+ }
+ }
+}
diff --git a/source/Cosmos.Core_Plugs/System/BufferImpl.cs b/source/Cosmos.Core_Plugs/System/BufferImpl.cs
index 6946a4d82..a48bd1bf9 100644
--- a/source/Cosmos.Core_Plugs/System/BufferImpl.cs
+++ b/source/Cosmos.Core_Plugs/System/BufferImpl.cs
@@ -1,4 +1,5 @@
using System;
+using Cosmos.Debug.Kernel;
using IL2CPU.API.Attribs;
namespace Cosmos.Core_Plugs.System
diff --git a/source/Cosmos.Core_Plugs/System/Collections/Generic/ComparerHelpersImpl.cs b/source/Cosmos.Core_Plugs/System/Collections/Generic/ComparerHelpersImpl.cs
index c58d333b8..6d55fedaa 100644
--- a/source/Cosmos.Core_Plugs/System/Collections/Generic/ComparerHelpersImpl.cs
+++ b/source/Cosmos.Core_Plugs/System/Collections/Generic/ComparerHelpersImpl.cs
@@ -12,8 +12,6 @@ namespace Cosmos.Core_Plugs.System.Collections.Generic
public static object CreateDefaultComparer(Type aType)
{
- Debugger.DoBochsBreak();
-
//TODO: Do application level testing to determine the most frequent comparisons and do those type checks first.
if (aType == typeof(Byte))
@@ -153,8 +151,6 @@ namespace Cosmos.Core_Plugs.System.Collections.Generic
public static object CreateDefaultEqualityComparer(Type aType)
{
- Debugger.DoBochsBreak();
-
//TODO: Do application level testing to determine the most frequent comparisons and do those type checks first.
if (aType == typeof(Byte))
diff --git a/source/Cosmos.Core_Plugs/System/StringImpl.cs b/source/Cosmos.Core_Plugs/System/StringImpl.cs
index 1ab5c8dfa..852dca46a 100644
--- a/source/Cosmos.Core_Plugs/System/StringImpl.cs
+++ b/source/Cosmos.Core_Plugs/System/StringImpl.cs
@@ -1,4 +1,4 @@
-#define COSMOSDEBUG
+//#define COSMOSDEBUG
using System;
using System.Globalization;
using Cosmos.Common;
@@ -113,11 +113,6 @@ namespace Cosmos.Core_Plugs.System
[ObjectPointerAccess] uint* aThis,
[FieldAccess(Name = "System.Int32 System.String._stringLength")] ref int aLength)
{
- if(aLength < 0 || aLength > 1000)
- {
- mDebugger.Send("Length is: " + aLength);
- Debugger.DoBochsBreak();
- }
return aLength;
}
diff --git a/source/Cosmos.HAL2/BlockDevice/BlockDevice.cs b/source/Cosmos.HAL2/BlockDevice/BlockDevice.cs
index 3b70153a4..5b8e52d80 100644
--- a/source/Cosmos.HAL2/BlockDevice/BlockDevice.cs
+++ b/source/Cosmos.HAL2/BlockDevice/BlockDevice.cs
@@ -3,94 +3,94 @@ using System.Collections.Generic;
namespace Cosmos.HAL.BlockDevice
{
- // This class should not support selecting a device or sub device.
- // Each instance must control exactly one device. For example with ATA
- // master/slave, each one needs its own device instance. For ATA
- // this complicates things a bit because they share IO ports, but this
- // is an intentional decision.
- ///
- /// BlockDevice abstract class. See also: .
- ///
- public abstract class BlockDevice : Device
+ // This class should not support selecting a device or sub device.
+ // Each instance must control exactly one device. For example with ATA
+ // master/slave, each one needs its own device instance. For ATA
+ // this complicates things a bit because they share IO ports, but this
+ // is an intentional decision.
+ ///
+ /// BlockDevice abstract class. See also: .
+ ///
+ public abstract class BlockDevice : Device
{
// TODO: Need to protect this from changes except by Hardware ring
- ///
- /// Devices list.
- ///
+ ///
+ /// Devices list.
+ ///
static public List Devices = new List();
- ///
- /// Create new block array.
- ///
- /// Number of blocks to alloc.
- /// byte array.
+ ///
+ /// Create new block array.
+ ///
+ /// Number of blocks to alloc.
+ /// byte array.
public byte[] NewBlockArray(UInt32 aBlockCount)
{
return new byte[aBlockCount * mBlockSize];
}
- ///
- /// Block count.
- ///
+ ///
+ /// Block count.
+ ///
protected UInt64 mBlockCount = 0;
- ///
- /// Get block count.
- ///
- public UInt64 BlockCount => mBlockCount;
+ ///
+ /// Get block count.
+ ///
+ public UInt64 BlockCount => mBlockCount;
- ///
- /// Block size.
- ///
- protected UInt64 mBlockSize = 0;
- ///
- /// Get block size.
- ///
- public UInt64 BlockSize => mBlockSize;
+ ///
+ /// Block size.
+ ///
+ protected UInt64 mBlockSize = 0;
+ ///
+ /// Get block size.
+ ///
+ public UInt64 BlockSize => mBlockSize;
- // Only allow reading and writing whole blocks because many of the hardware
- // command work that way and we dont want to add complexity at the BlockDevice level.
- // public abstract void ReadBlock(UInt64 aBlockNo, UInt32 aBlockCount, byte[] aData);
- ///
- /// Read block from partition.
- ///
- /// A block to read from.
- /// A number of blocks in the partition.
- /// A data that been read.
- /// Thrown when data lenght is greater then Int32.MaxValue.
- /// Thrown when data size invalid.
- public abstract void ReadBlock(UInt64 aBlockNo, UInt64 aBlockCount, ref byte[] aData);
+ // Only allow reading and writing whole blocks because many of the hardware
+ // command work that way and we dont want to add complexity at the BlockDevice level.
+ // public abstract void ReadBlock(UInt64 aBlockNo, UInt32 aBlockCount, byte[] aData);
+ ///
+ /// Read block from partition.
+ ///
+ /// A block to read from.
+ /// A number of blocks in the partition.
+ /// A data that been read.
+ /// Thrown when data lenght is greater then Int32.MaxValue.
+ /// Thrown when data size invalid.
+ public abstract void ReadBlock(UInt64 aBlockNo, UInt64 aBlockCount, ref byte[] aData);
- ///
- /// Write block to partition.
- ///
- /// A block number to write to.
- /// A number of blocks in the partition.
- /// A data to write.
- /// Thrown when data lenght is greater then Int32.MaxValue.
- /// Thrown when data size invalid.
+ ///
+ /// Write block to partition.
+ ///
+ /// A block number to write to.
+ /// A number of blocks in the partition.
+ /// A data to write.
+ /// Thrown when data lenght is greater then Int32.MaxValue.
+ /// Thrown when data size invalid.
public abstract void WriteBlock(UInt64 aBlockNo, UInt64 aBlockCount, ref byte[] aData);
- ///
- /// Check data size.
- ///
- /// A data to check the size of.
- /// Number of blocks used to store the data.
- /// Thrown when data lenght is greater then Int32.MaxValue.
- /// Thrown when data size invalid.
+ ///
+ /// Check data size.
+ ///
+ /// A data to check the size of.
+ /// Number of blocks used to store the data.
+ /// Thrown when data lenght is greater then Int32.MaxValue.
+ /// Thrown when data size invalid.
protected void CheckDataSize(byte[] aData, UInt64 aBlockCount)
{
- if ((ulong)aData.Length != aBlockCount * mBlockSize)
+ if ((ulong)aData.Length != aBlockCount * mBlockSize)
{
throw new Exception("Invalid data size.");
}
}
- ///
- /// Check block number.
- /// Not implemented.
- ///
- /// A block number to be checked.
- /// A block count.
+ ///
+ /// Check block number.
+ /// Not implemented.
+ ///
+ /// A block number to be checked.
+ /// A block count.
protected void CheckBlockNo(UInt64 aBlockNo, UInt64 aBlockCount)
{
if (aBlockNo + aBlockCount >= mBlockCount)
diff --git a/source/Cosmos.HAL2/BlockDevice/Partition.cs b/source/Cosmos.HAL2/BlockDevice/Partition.cs
index 67e0ec1f9..d976939b4 100644
--- a/source/Cosmos.HAL2/BlockDevice/Partition.cs
+++ b/source/Cosmos.HAL2/BlockDevice/Partition.cs
@@ -40,11 +40,13 @@ namespace Cosmos.HAL.BlockDevice
/// Thrown when data size invalid.
public override void ReadBlock(UInt64 aBlockNo, UInt64 aBlockCount, ref byte[] aData)
{
+ Global.mDebugger.Send("-- Partition.ReadBlock --");
CheckDataSize(aData, aBlockCount);
UInt64 xHostBlockNo = mStartingSector + aBlockNo;
CheckBlockNo(xHostBlockNo, aBlockCount);
mHost.ReadBlock(xHostBlockNo, aBlockCount, ref aData);
- }
+ Global.mDebugger.Send("Returning -- Partition.ReadBlock --");
+ }
///
/// Write block to partition.
diff --git a/source/Cosmos.System2/FileSystem/DiskManager.cs b/source/Cosmos.System2/FileSystem/DiskManager.cs
index 6f59afd5d..32e82ac11 100644
--- a/source/Cosmos.System2/FileSystem/DiskManager.cs
+++ b/source/Cosmos.System2/FileSystem/DiskManager.cs
@@ -1,4 +1,4 @@
-#define COSMOSDEBUG
+//#define COSMOSDEBUG
using System;
using System.Collections.Generic;
using System.Text;
diff --git a/source/Cosmos.System2/FileSystem/FAT/FatFileSystem.cs b/source/Cosmos.System2/FileSystem/FAT/FatFileSystem.cs
index 6f02e1881..d83f7cdc5 100644
--- a/source/Cosmos.System2/FileSystem/FAT/FatFileSystem.cs
+++ b/source/Cosmos.System2/FileSystem/FAT/FatFileSystem.cs
@@ -349,11 +349,12 @@ namespace Cosmos.System.FileSystem.FAT
/// Thrown when data size invalid.
private void ReadFatSector(ulong aSector, out byte[] aData)
{
+ Global.mFileSystemDebugger.Send("-- FatFileSystem.ReadFatSector --");
aData = mFileSystem.NewBlockArray();
ulong xSector = mFatSector + aSector;
- Global.mFileSystemDebugger.SendInternal("xSector =");
- Global.mFileSystemDebugger.SendInternal(xSector);
+ Global.mFileSystemDebugger.SendInternal("xSector =" + xSector);
mFileSystem.Device.ReadBlock(xSector, mFileSystem.SectorsPerCluster, ref aData);
+ Global.mFileSystemDebugger.Send("Returning -- FatFileSystem.ReadFatSector --");
}
///
@@ -452,7 +453,7 @@ namespace Cosmos.System.FileSystem.FAT
ulong xEntryOffset = aEntryNumber * xEntrySize;
ulong xSector = xEntryOffset / mFileSystem.BytesPerSector;
- ulong xSectorOffset = (xSector * mFileSystem.BytesPerSector) - xEntryOffset;
+ //ulong xSectorOffset = (xSector * mFileSystem.BytesPerSector) - xEntryOffset;
byte[] xData;
ReadFatSector(xSector, out xData);
@@ -476,6 +477,7 @@ namespace Cosmos.System.FileSystem.FAT
}
WriteFatSector(xSector, xData);
+ Global.mFileSystemDebugger.SendInternal("Returning from --- Fat.SetFatEntry ---");
}
///
diff --git a/source/Cosmos.System2/FileSystem/FAT/FatStream.cs b/source/Cosmos.System2/FileSystem/FAT/FatStream.cs
index 29a407f9b..9fcee0365 100644
--- a/source/Cosmos.System2/FileSystem/FAT/FatStream.cs
+++ b/source/Cosmos.System2/FileSystem/FAT/FatStream.cs
@@ -1,4 +1,4 @@
-#define COSMOSDEBUG
+//#define COSMOSDEBUG
using System;
using System.IO;
diff --git a/source/Cosmos.System2_Plugs/System/IO/CosmosFileSystem.cs b/source/Cosmos.System2_Plugs/System/IO/CosmosFileSystem.cs
index 645dc80c7..64e4c5684 100644
--- a/source/Cosmos.System2_Plugs/System/IO/CosmosFileSystem.cs
+++ b/source/Cosmos.System2_Plugs/System/IO/CosmosFileSystem.cs
@@ -1,4 +1,4 @@
-#define COSMOSDEBUG
+//#define COSMOSDEBUG
using System;
using System.IO;
using System.Collections.Generic;
diff --git a/source/Cosmos.System2_Plugs/System/IO/DirectoryImpl.cs b/source/Cosmos.System2_Plugs/System/IO/DirectoryImpl.cs
index 840fee6b3..19a5b3eb0 100644
--- a/source/Cosmos.System2_Plugs/System/IO/DirectoryImpl.cs
+++ b/source/Cosmos.System2_Plugs/System/IO/DirectoryImpl.cs
@@ -1,4 +1,4 @@
-#define COSMOSDEBUG
+//#define COSMOSDEBUG
using System;
using System.IO;
using System.Collections.Generic;
diff --git a/source/Cosmos.System2_Plugs/System/IO/DirectoryInfoImpl.cs b/source/Cosmos.System2_Plugs/System/IO/DirectoryInfoImpl.cs
index f91fe6aa9..7bcc85cb1 100644
--- a/source/Cosmos.System2_Plugs/System/IO/DirectoryInfoImpl.cs
+++ b/source/Cosmos.System2_Plugs/System/IO/DirectoryInfoImpl.cs
@@ -1,4 +1,4 @@
-#define COSMOSDEBUG
+//#define COSMOSDEBUG
using System.IO;
using IL2CPU.API.Attribs;
using Cosmos.System;
diff --git a/source/Cosmos.System2_Plugs/System/IO/FileStreamImpl.cs b/source/Cosmos.System2_Plugs/System/IO/FileStreamImpl.cs
index 04c68b083..2a99f1926 100644
--- a/source/Cosmos.System2_Plugs/System/IO/FileStreamImpl.cs
+++ b/source/Cosmos.System2_Plugs/System/IO/FileStreamImpl.cs
@@ -1,4 +1,4 @@
-#define COSMOSDEBUG
+//#define COSMOSDEBUG
using global::System;
using global::System.IO;
using Cosmos.System;
diff --git a/source/Cosmos.System2_Plugs/System/IO/StreamWriterImpl.cs b/source/Cosmos.System2_Plugs/System/IO/StreamWriterImpl.cs
index e26eae6e7..daabe5f68 100644
--- a/source/Cosmos.System2_Plugs/System/IO/StreamWriterImpl.cs
+++ b/source/Cosmos.System2_Plugs/System/IO/StreamWriterImpl.cs
@@ -1,5 +1,7 @@
-using System.IO;
-
+using System;
+using System.IO;
+using System.Runtime.InteropServices;
+using Cosmos.Debug.Kernel;
using IL2CPU.API.Attribs;
namespace Cosmos.System_Plugs.System.IO
@@ -8,5 +10,7 @@ namespace Cosmos.System_Plugs.System.IO
public static class StreamWriterImpl
{
public static void CheckAsyncTaskInProgress(StreamWriter aThis) { }
+
+
}
}