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
6{
7 private byte[][] _blocks;
8
9 private uint _allocatedEnd;
10
11 private uint _activeStart;
12
13 private uint _availableStart;
14
16
18
20
21 public MultiArrayBuffer(int initialBufferSize)
22 {
23 this = default(System.Net.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
85 {
86 if (byteCount > AvailableMemory.Length)
87 {
89 }
90 }
91
93 {
94 uint num = (uint)(byteCount - AvailableMemory.Length);
95 uint num2 = (num + 16384 - 1) / 16384;
96 if (_blocks == null)
97 {
98 int num3;
99 for (num3 = 4; num3 < num2; num3 *= 2)
100 {
101 }
102 _blocks = new byte[num3][];
103 }
104 else
105 {
106 uint num4 = _allocatedEnd / 16384;
107 uint num5 = (uint)_blocks.Length;
108 if (num4 + num2 > num5)
109 {
110 uint num6 = _activeStart / 16384;
111 uint num7 = num4 - num6;
112 uint num8 = num7 + num2;
113 Span<byte[]> span;
114 if (num8 > num5)
115 {
116 while (num5 < num8)
117 {
118 num5 *= 2;
119 }
120 byte[][] array = new byte[num5][];
121 span = _blocks.AsSpan();
122 span = span.Slice((int)num6, (int)num7);
123 span.CopyTo(array);
124 _blocks = array;
125 }
126 else
127 {
128 span = _blocks.AsSpan();
129 span = span.Slice((int)num6, (int)num7);
130 span.CopyTo(_blocks);
131 span = _blocks.AsSpan();
132 span = span.Slice((int)num7, (int)num6);
133 span.Clear();
134 }
135 uint num9 = num6 * 16384;
136 _allocatedEnd -= num9;
137 _activeStart -= num9;
138 _availableStart -= num9;
139 }
140 }
141 uint num10 = _allocatedEnd / 16384;
142 for (uint num11 = 0u; num11 < num2; num11++)
143 {
144 _blocks[num10++] = ArrayPool<byte>.Shared.Rent(16384);
145 }
146 _allocatedEnd = num10 * 16384;
147 }
148}
static ArrayPool< T > Shared
Definition ArrayPool.cs:7
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