Cosmos/source/Cosmos.Debug.Common/DebugConnectorStreamWithoutTimeouts.cs
2015-07-22 18:19:42 +02:00

85 lines
2.8 KiB
C#

// DO NOT remove the following line. Should you want to get rid of read count tracking comment
// out the line. Enabling the symbol will handle a thread safe counter that tracks the count
// of pending reads on the link to the DebugStub.
// #define TRACK_PENDING
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
namespace Cosmos.Debug.Common
{
/// <summary>Use a Stream to implement wire transfer protocol between a Debug Stub hosted in
/// a debugged Cosmos Kernel and our Debug Engine hosted in Visual Studio. This class is still
/// abstract and is further refined by sub-classes handling serial communication line or pipe
/// for example.</summary>
public abstract class DebugConnectorStreamWithoutTimeouts: DebugConnector
{
#if TRACK_PENDING
/// <summary>For debugging purpose we track the number of pending read operations. Should this
/// counter fail to 0, the connector should be considered stalled.</summary>
private int _pendingReadsCount = 0;
#endif
protected volatile Stream mStream;
protected override bool SendRawData(byte[] aBytes)
{
bool OK = false;
System.Diagnostics.Debug.WriteLine(String.Format("DC - sending: {0}", BytesToString(aBytes, 0, aBytes.Length)));
if (mStream != null)
{
try
{
mStream.Write(aBytes, 0, aBytes.Length);
mStream.Flush();
OK = true;
}
catch (IOException)
{
//Catches the stream terminate exception
OK = false;
}
}
else
{
DoDebugMsg("Error! mStream is null! Cannot send data! Is the debugger shutting down?");
}
return OK;
}
public override bool IsConnected
{
get
{
return mStream != null;
}
}
// Start is not in ctor, because for servers we have to wait for the callback. This
// however does not prevent other kind of DebugConnectorStreamWithTimeouts descendants from
// invoking this method from their constructor.
protected void Start(Stream aStream)
{
if (aStream == null)
{
throw new ArgumentNullException("aStream");
}
mStream = aStream;
Start();
}
public override void Dispose()
{
base.Dispose();
// do our own dispose after base, because base dispose cleans up the thread.
if (mStream != null)
{
mStream.Close();
mStream = null;
}
}
}
}