Skip to content

Commit 9e0a740

Browse files
committed
Using MemoryMarshal.GetArrayDataReference in .net5.0
1 parent ed6cec8 commit 9e0a740

6 files changed

+56
-2
lines changed

src/DotNetty.Buffers/ArrayPooledByteBuffer.cs

+7
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
using System.Buffers;
2525
using DotNetty.Common;
2626
using DotNetty.Common.Internal;
27+
#if NET
28+
using System.Runtime.InteropServices;
29+
#endif
2730

2831
namespace DotNetty.Buffers
2932
{
@@ -186,7 +189,11 @@ public sealed override byte[] Array
186189
public sealed override ref byte GetPinnableMemoryAddress()
187190
{
188191
EnsureAccessible();
192+
#if NET
193+
return ref MemoryMarshal.GetArrayDataReference(Memory);
194+
#else
189195
return ref Memory[0];
196+
#endif
190197
}
191198

192199
public sealed override IntPtr AddressOfPinnedMemory() => IntPtr.Zero;

src/DotNetty.Buffers/ArrayPooledUnsafeDirectByteBuffer.cs

+11-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
using System.Threading;
2828
using System.Threading.Tasks;
2929
using DotNetty.Common;
30+
#if NET
31+
using System.Runtime.InteropServices;
32+
#endif
3033

3134
namespace DotNetty.Buffers
3235
{
@@ -248,7 +251,14 @@ public sealed override IByteBuffer Copy(int index, int length)
248251
}
249252

250253
[MethodImpl(InlineMethod.AggressiveOptimization)]
251-
ref byte Addr(int index) => ref Memory[index];
254+
ref byte Addr(int index)
255+
{
256+
#if NET
257+
return ref Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(Memory), index);
258+
#else
259+
return ref Memory[index];
260+
#endif
261+
}
252262

253263
public sealed override IByteBuffer SetZero(int index, int length)
254264
{

src/DotNetty.Buffers/PooledHeapByteBuffer.cs

+8
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ namespace DotNetty.Buffers
3131
using System.Threading.Tasks;
3232
using DotNetty.Common;
3333
using DotNetty.Common.Internal;
34+
#if NET
35+
using System.Runtime.CompilerServices;
36+
using System.Runtime.InteropServices;
37+
#endif
3438

3539
sealed partial class PooledHeapByteBuffer : PooledByteBuffer<byte[]>
3640
{
@@ -212,7 +216,11 @@ public sealed override byte[] Array
212216
public sealed override ref byte GetPinnableMemoryAddress()
213217
{
214218
EnsureAccessible();
219+
#if NET
220+
return ref Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(Memory), Offset);
221+
#else
215222
return ref Memory[Offset];
223+
#endif
216224
}
217225

218226
public sealed override IntPtr AddressOfPinnedMemory() => IntPtr.Zero;

src/DotNetty.Buffers/UnpooledHeapByteBuffer.cs

+7
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ namespace DotNetty.Buffers
3030
using System.Threading;
3131
using System.Threading.Tasks;
3232
using DotNetty.Common.Internal;
33+
#if NET
34+
using System.Runtime.InteropServices;
35+
#endif
3336

3437
partial class UnpooledHeapByteBuffer : AbstractReferenceCountedByteBuffer
3538
{
@@ -134,7 +137,11 @@ public sealed override byte[] Array
134137
public sealed override ref byte GetPinnableMemoryAddress()
135138
{
136139
EnsureAccessible();
140+
#if NET
141+
return ref MemoryMarshal.GetArrayDataReference(_array);
142+
#else
137143
return ref _array[0];
144+
#endif
138145
}
139146

140147
public sealed override IntPtr AddressOfPinnedMemory() => IntPtr.Zero;

src/DotNetty.Buffers/UnpooledUnsafeDirectByteBuffer.cs

+15-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ namespace DotNetty.Buffers
3131
using System.Threading;
3232
using System.Threading.Tasks;
3333
using DotNetty.Common.Internal;
34+
#if NET
35+
using System.Runtime.InteropServices;
36+
#endif
3437

3538
unsafe partial class UnpooledUnsafeDirectByteBuffer : AbstractReferenceCountedByteBuffer
3639
{
@@ -190,7 +193,11 @@ protected internal sealed override void Deallocate()
190193
public sealed override ref byte GetPinnableMemoryAddress()
191194
{
192195
EnsureAccessible();
196+
#if NET
197+
return ref MemoryMarshal.GetArrayDataReference(_buffer);
198+
#else
193199
return ref _buffer[0];
200+
#endif
194201
}
195202

196203
public sealed override bool IsContiguous => true;
@@ -393,7 +400,14 @@ public sealed override IByteBuffer Copy(int index, int length)
393400
}
394401

395402
[MethodImpl(InlineMethod.AggressiveOptimization)]
396-
ref byte Addr(int index) => ref _buffer[index];
403+
ref byte Addr(int index)
404+
{
405+
#if NET
406+
return ref Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(_buffer), index);
407+
#else
408+
return ref _buffer[index];
409+
#endif
410+
}
397411

398412
public sealed override IByteBuffer SetZero(int index, int length)
399413
{

src/DotNetty.Common/Internal/PlatformDependent.cs

+8
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ namespace DotNetty.Common.Internal
1212
using System.Threading;
1313
using DotNetty.Common.Internal.Logging;
1414
using DotNetty.Common.Utilities;
15+
#if NET
16+
using System.Runtime.InteropServices;
17+
#endif
1518

1619
using static PlatformDependent0;
1720

@@ -262,6 +265,11 @@ public static void CopyMemory(byte[] src, int srcIndex, byte[] dst, int dstIndex
262265
}
263266
}
264267
}
268+
#elif NET
269+
Unsafe.CopyBlockUnaligned(
270+
ref Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(dst), dstIndex),
271+
ref Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(src), srcIndex),
272+
nlen);
265273
#else
266274
Unsafe.CopyBlockUnaligned(ref dst[dstIndex], ref src[srcIndex], nlen);
267275
#endif

0 commit comments

Comments
 (0)