in FixAntenna/NetCore/FixEngine/Session/IoThreads/SyncMessagePumper.cs [420:502]
private bool WriteToTransport(int messageCount, byte[] externalBuffer)
{
//TODO extract next block into separate function. Looks like for main thread it should be used without the rest part of code (messageCount = 0, externalBuffer = null)
int toWrite, written;
if (HasDataChunkToTransfer())
{
toWrite = _dataChunkEnd - _dataChunkStart;
written = _transport.Write(_messageBuffer, _dataChunkStart, toWrite);
_dataChunkStart += written;
// update statistics
if (_statisticEnabled)
{
_messageStatistic.AddBytesProcessed(written);
}
return false;
}
toWrite = _messageEnd[messageCount - 1] - _messageStart[0];
if (externalBuffer != null)
{
try
{
written = _transport.Write(externalBuffer, _messageStart[0], toWrite);
if (written < toWrite)
{
_messageBuffer.Add(externalBuffer, _messageStart[0] + written, toWrite - written);
ScheduleChunkToTransfer(_messageStart[0] + written, toWrite);
return false;
}
}
catch (IOException e)
{
_messageBuffer.Add(externalBuffer, _messageStart[0], toWrite);
ScheduleChunkToTransfer(_messageStart[0], toWrite);
//throw e;
var messages = new string[1];
messages[0] = StringHelper.NewString(externalBuffer, _messageStart[0], toWrite);
throw new TransportMessagesNotSentException(e, messages);
}
}
else
{
try
{
written = _transport.Write(_messageBuffer, _messageStart[0], toWrite);
if (written < toWrite)
{
ScheduleChunkToTransfer(_messageStart[0] + written, toWrite);
return false;
}
}
catch (IOException e)
{
ScheduleChunkToTransfer(_messageStart[0], toWrite);
//throw e;
var messages = new string[messageCount];
for (var i = 0; i < messageCount; i++)
{
messages[i] = StringHelper.NewString(_messageBuffer.GetByteArray(), _messageStart[i], _messageEnd[i]);
}
throw new TransportMessagesNotSentException(e, messages);
}
}
// update statistics
MessageProcessedTimestamp = DateTimeHelper.CurrentMilliseconds;
if (_statisticEnabled)
{
//updateStatistic();
_messageStatistic.AddMessagesProcessed(messageCount);
_messageStatistic.AddBytesProcessed(written);
}
return true;
}