Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
MultiArrayBuffer.cs
Go to the documentation of this file.
2
3namespace System.Net;
4
5internal struct MultiArrayBuffer : IDisposable
6{
7 private byte[][] _blocks;
8
9 private uint _allocatedEnd;
10
11 private uint _activeStart;
12
13 private uint _availableStart;
14
15 public bool IsEmpty => _activeStart == _availableStart;
16
18
20
21 public MultiArrayBuffer(int initialBufferSize)
22 {
23 this = default(MultiArrayBuffer);
24 }
25
26 public void Dispose()
27 {
28 _activeStart = 0u;
29 _availableStart = 0u;
30 if (_blocks == null)
31 {
32 return;
33 }
34 for (int i = 0; i < _blocks.Length; i++)
35 {
36 byte[] array = _blocks[i];
37 if (array != null)
38 {
39 _blocks[i] = null;
41 }
42 }
43 _blocks = null;
44 _allocatedEnd = 0u;
45 }
46
47 public void Discard(int byteCount)
48 {
49 if (byteCount == ActiveMemory.Length)
50 {
51 DiscardAll();
52 return;
53 }
54 uint startBlock = _activeStart / 16384;
55 _activeStart += (uint)byteCount;
56 uint endBlock = _activeStart / 16384;
57 FreeBlocks(startBlock, endBlock);
58 }
59
60 public void DiscardAll()
61 {
62 uint startBlock = _activeStart / 16384;
63 uint endBlock = _allocatedEnd / 16384;
64 FreeBlocks(startBlock, endBlock);
66 }
67
68 private void FreeBlocks(uint startBlock, uint endBlock)
69 {
70 byte[][] blocks = _blocks;
71 for (uint num = startBlock; num < endBlock; num++)
72 {
73 byte[] array = blocks[num];
74 blocks[num] = null;
76 }
77 }
78
79 public void Commit(int byteCount)
80 {
82 }
83
84 public void EnsureAvailableSpaceUpToLimit(int byteCount, int limit)
85 {
86 if (ActiveMemory.Length < limit)
87 {
88 byteCount = Math.Min(byteCount, limit - ActiveMemory.Length);
90 }
91 }
92
94 {
95 if (byteCount > AvailableMemory.Length)
96 {
98 }
99 }
100
102 {
103 uint num = (uint)(byteCount - AvailableMemory.Length);
104 uint num2 = (num + 16384 - 1) / 16384;
105 if (_blocks == null)
106 {
107 int num3;
108 for (num3 = 4; num3 < num2; num3 *= 2)
109 {
110 }
111 _blocks = new byte[num3][];
112 }
113 else
114 {
115 uint num4 = _allocatedEnd / 16384;
116 uint num5 = (uint)_blocks.Length;
117 if (num4 + num2 > num5)
118 {
119 uint num6 = _activeStart / 16384;
120 uint num7 = num4 - num6;
121 uint num8 = num7 + num2;
122 Span<byte[]> span;
123 if (num8 > num5)
124 {
125 while (num5 < num8)
126 {
127 num5 *= 2;
128 }
129 byte[][] array = new byte[num5][];
130 span = _blocks.AsSpan();
131 span = span.Slice((int)num6, (int)num7);
132 span.CopyTo(array);
133 _blocks = array;
134 }
135 else
136 {
137 span = _blocks.AsSpan();
138 span = span.Slice((int)num6, (int)num7);
139 span.CopyTo(_blocks);
140 span = _blocks.AsSpan();
141 span = span.Slice((int)num7, (int)num6);
142 span.Clear();
143 }
144 uint num9 = num6 * 16384;
145 _allocatedEnd -= num9;
146 _activeStart -= num9;
147 _availableStart -= num9;
148 }
149 }
150 uint num10 = _allocatedEnd / 16384;
151 for (uint num11 = 0u; num11 < num2; num11++)
152 {
153 _blocks[num10++] = ArrayPool<byte>.Shared.Rent(16384);
154 }
155 _allocatedEnd = num10 * 16384;
156 }
157}
static ArrayPool< T > Shared
Definition ArrayPool.cs:7
static byte Min(byte val1, byte val2)
Definition Math.cs:912
void EnsureAvailableSpaceUpToLimit(int byteCount, int limit)
System.Net.MultiMemory ActiveMemory
void FreeBlocks(uint startBlock, uint endBlock)
void GrowAvailableSpace(int byteCount)
System.Net.MultiMemory AvailableMemory
void Discard(int byteCount)
void EnsureAvailableSpace(int byteCount)
MultiArrayBuffer(int initialBufferSize)
void CopyTo(Span< T > destination)
Definition Span.cs:224
Span< T > Slice(int start)
Definition Span.cs:271
unsafe void Clear()
Definition Span.cs:198