Skip to content
This repository has been archived by the owner on Jan 23, 2023. It is now read-only.
/ corefx Public archive

Commit

Permalink
Merge pull request #43141 from teo-tsirpanis/backport57472
Browse files Browse the repository at this point in the history
[release/2.1] Fix ReadOnlySequence created out of sliced Memory owned by MemoryManager
  • Loading branch information
carlossanlop authored May 4, 2022
2 parents 0d40b48 + d4b40e8 commit 8b6f401
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 5 deletions.
5 changes: 3 additions & 2 deletions pkg/Microsoft.Private.PackageBaseline/packageIndex.json
Original file line number Diff line number Diff line change
Expand Up @@ -2510,9 +2510,10 @@
"4.5.1",
"4.5.2",
"4.5.3",
"4.5.4"
"4.5.4",
"4.5.5"
],
"BaselineVersion": "4.5.4",
"BaselineVersion": "4.5.5",
"InboxOn": {
"netcoreapp2.1": "4.1.0.0"
},
Expand Down
2 changes: 1 addition & 1 deletion src/System.Memory/dir.props
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\dir.props" />
<PropertyGroup>
<AssemblyVersion>4.0.1.1</AssemblyVersion>
<AssemblyVersion>4.0.1.2</AssemblyVersion>
<!-- System.Memory has forwarded types into the runtime on netcoreapp/uap
It must win over assemblies versioned at 4.0.* -->
<AssemblyVersion Condition="'$(TargetGroup)' == 'netcoreapp' OR '$(TargetGroup)' == 'uap' ">4.1.0.0</AssemblyVersion>
Expand Down
2 changes: 1 addition & 1 deletion src/System.Memory/pkg/System.Memory.pkgproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
<PropertyGroup>
<PackageVersion>4.5.4</PackageVersion>
<PackageVersion>4.5.5</PackageVersion>
</PropertyGroup>
<ItemGroup>
<PackageIndex Include="$(ProjectDir)\pkg\baseline\packageBaseline.1.1.json" />
Expand Down
2 changes: 1 addition & 1 deletion src/System.Memory/src/System/Buffers/ReadOnlySequence.cs
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ public ReadOnlySequence(ReadOnlyMemory<T> memory)
if (MemoryMarshal.TryGetMemoryManager(memory, out MemoryManager<T> manager, out int index, out int length))
{
_sequenceStart = new SequencePosition(manager, ReadOnlySequence.MemoryManagerToSequenceStart(index));
_sequenceEnd = new SequencePosition(manager, ReadOnlySequence.MemoryManagerToSequenceEnd(length));
_sequenceEnd = new SequencePosition(manager, ReadOnlySequence.MemoryManagerToSequenceEnd(index + length));
}
else if (MemoryMarshal.TryGetArray(memory, out ArraySegment<T> segment))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,16 @@
using System.Buffers;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

namespace System.Memory.Tests
{
public abstract class ReadOnlySequenceFactory<T>
{
public static ReadOnlySequenceFactory<T> ArrayFactory { get; } = new ArrayTestSequenceFactory();
public static ReadOnlySequenceFactory<T> MemoryFactory { get; } = new MemoryTestSequenceFactory();
public static ReadOnlySequenceFactory<T> MemoryManagerFactory { get; } = new MemoryManagerTestSequenceFactory();
public static ReadOnlySequenceFactory<T> SingleSegmentFactory { get; } = new SingleSegmentTestSequenceFactory();
public static ReadOnlySequenceFactory<T> SegmentPerItemFactory { get; } = new BytePerSegmentTestSequenceFactory();
public static ReadOnlySequenceFactory<T> SplitInThree { get; } = new SplitInThreeSegmentsTestSequenceFactory();
Expand Down Expand Up @@ -102,6 +105,49 @@ public override ReadOnlySequence<T> CreateWithContent(T[] data)
}
}

internal class MemoryManagerTestSequenceFactory : ReadOnlySequenceFactory<T>
{
public override ReadOnlySequence<T> CreateOfSize(int size)
{
#if DEBUG
return new ReadOnlySequence<T>(new CustomMemoryManager(size + 1).Memory.Slice(1));
#else
return new ReadOnlySequence<T>(new CustomMemoryManager(size).Memory);
#endif
}

public override ReadOnlySequence<T> CreateWithContent(T[] data)
{
return new ReadOnlySequence<T>(new CustomMemoryManager(data).Memory);
}

private unsafe class CustomMemoryManager : MemoryManager<T>
{
private readonly T[] _buffer;

public CustomMemoryManager(int size) => _buffer = new T[size];

public CustomMemoryManager(T[] content) => _buffer = content;

public unsafe override Span<T> GetSpan() => _buffer;

public override unsafe MemoryHandle Pin(int elementIndex = 0)
{
if ((uint)elementIndex > (uint)_buffer.Length)
{
throw new ArgumentOutOfRangeException(nameof(elementIndex));
}

var handle = GCHandle.Alloc(_buffer, GCHandleType.Pinned);
return new MemoryHandle(Unsafe.Add<T>((void*)handle.AddrOfPinnedObject(), elementIndex), handle, this);
}

public override void Unpin() { }

protected override void Dispose(bool disposing) { }
}
}

public static ReadOnlySequence<T> CreateSegments(params T[][] inputs) => CreateSegments((IEnumerable<T[]>)inputs);

public static ReadOnlySequence<T> CreateSegments(IEnumerable<T[]> inputs)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ public class Memory : ReadOnlySequenceTestsByte
public Memory() : base(ReadOnlySequenceFactory<byte>.MemoryFactory) { }
}

public class MemoryManager : ReadOnlySequenceTestsByte
{
public MemoryManager() : base(ReadOnlySequenceFactory<byte>.MemoryManagerFactory) { }
}

public class SingleSegment : ReadOnlySequenceTestsByte
{
public SingleSegment() : base(ReadOnlySequenceFactory<byte>.SingleSegmentFactory) { }
Expand Down
3 changes: 3 additions & 0 deletions src/packages.builds
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
<AdditionalProperties>$(AdditionalProperties)</AdditionalProperties>
</Project>
<!-- add specific builds / pkgproj's here to include in servicing builds -->
<Project Include="$(MSBuildThisFileDirectory)System.Memory\pkg\System.Memory.pkgproj">
<AdditionalProperties>$(AdditionalProperties)</AdditionalProperties>
</Project>
</ItemGroup>

<!-- Need the PackageIndexFile file property from baseline.props -->
Expand Down

0 comments on commit 8b6f401

Please sign in to comment.