Skip to content
This repository was archived by the owner on Dec 18, 2018. It is now read-only.

Commit 7482fb6

Browse files
committed
CopyFrom to Buffer.MemoryCopy
1 parent 852e1f4 commit 7482fb6

File tree

1 file changed

+57
-1
lines changed

1 file changed

+57
-1
lines changed

src/Microsoft.AspNetCore.Server.Kestrel/Internal/Infrastructure/MemoryPoolIterator.cs

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1010,7 +1010,7 @@ public void CopyFrom(ArraySegment<byte> buffer)
10101010

10111011
public void CopyFrom(byte[] data, int offset, int count)
10121012
{
1013-
if (IsDefault)
1013+
if (count == 0 || IsDefault)
10141014
{
10151015
return;
10161016
}
@@ -1019,6 +1019,19 @@ public void CopyFrom(byte[] data, int offset, int count)
10191019
Debug.Assert(_block.Next == null);
10201020
Debug.Assert(_block.End == _index);
10211021

1022+
Debug.Assert(count + offset <= data.Length);
1023+
1024+
#if NET451
1025+
BlockCopyFrom(data, offset, count);
1026+
#else
1027+
MemoryCopyFrom(data, offset, count);
1028+
#endif
1029+
}
1030+
1031+
#if NET451
1032+
private void BlockCopyFrom(byte[] data, int offset, int count)
1033+
{
1034+
// Note: Ensure for any changes in this function MemoryCopyFrom is changed to match
10221035
var pool = _block.Pool;
10231036
var block = _block;
10241037
var blockIndex = _index;
@@ -1054,6 +1067,49 @@ public void CopyFrom(byte[] data, int offset, int count)
10541067
_block = block;
10551068
_index = blockIndex;
10561069
}
1070+
#else
1071+
private unsafe void MemoryCopyFrom(byte[] data, int offset, int count)
1072+
{
1073+
// Note: Ensure for any changes in this function BlockCopyFrom is changed to match
1074+
var pool = _block.Pool;
1075+
var block = _block;
1076+
var blockIndex = _index;
1077+
1078+
var bufferIndex = offset;
1079+
var remaining = count;
1080+
var bytesLeftInBlock = block.Data.Offset + block.Data.Count - blockIndex;
1081+
1082+
fixed (byte* pData = &data[0])
1083+
{
1084+
while (remaining > 0)
1085+
{
1086+
if (bytesLeftInBlock == 0)
1087+
{
1088+
var nextBlock = pool.Lease();
1089+
block.End = blockIndex;
1090+
Volatile.Write(ref block.Next, nextBlock);
1091+
block = nextBlock;
1092+
1093+
blockIndex = block.Data.Offset;
1094+
bytesLeftInBlock = block.Data.Count;
1095+
}
1096+
1097+
var bytesToCopy = remaining < bytesLeftInBlock ? remaining : bytesLeftInBlock;
1098+
1099+
Buffer.MemoryCopy(pData + bufferIndex, block.DataFixedPtr + blockIndex, bytesLeftInBlock, bytesToCopy);
1100+
1101+
blockIndex += bytesToCopy;
1102+
bufferIndex += bytesToCopy;
1103+
remaining -= bytesToCopy;
1104+
bytesLeftInBlock -= bytesToCopy;
1105+
}
1106+
}
1107+
1108+
block.End = blockIndex;
1109+
_block = block;
1110+
_index = blockIndex;
1111+
}
1112+
#endif
10571113

10581114
public unsafe void CopyFromAscii(string data)
10591115
{

0 commit comments

Comments
 (0)