Skip to content

Commit

Permalink
BlobBuilder.LinkSuffix/LinkPrefix need to Free zero length chunks (#1…
Browse files Browse the repository at this point in the history
…00039)

* BlobBuilder.LinkSuffix/LinkPrefix need to Free zero length chunks

* free child blob list

* fix remarks 1

* add unit tests
  • Loading branch information
pedrobsaila authored Apr 5, 2024
1 parent 3e98877 commit fc9ab41
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public partial class BlobBuilder
private uint _length;

private const uint IsFrozenMask = 0x80000000;
private bool IsHead => (_length & IsFrozenMask) == 0;
internal bool IsHead => (_length & IsFrozenMask) == 0;
private int Length => (int)(_length & ~IsFrozenMask);
private uint FrozenLength => _length | IsFrozenMask;
private Span<byte> Span => _buffer.AsSpan(0, Length);
Expand Down Expand Up @@ -97,8 +97,7 @@ public void Clear()
{
if (chunk != this)
{
chunk.ClearChunk();
chunk.FreeChunk();
chunk.ClearAndFreeChunk();
}
}

Expand Down Expand Up @@ -396,6 +395,7 @@ public void LinkPrefix(BlobBuilder prefix)
// avoid chaining empty chunks:
if (prefix.Count == 0)
{
prefix.ClearAndFreeChunk();
return;
}

Expand Down Expand Up @@ -456,6 +456,7 @@ public void LinkSuffix(BlobBuilder suffix)
// avoid chaining empty chunks:
if (suffix.Count == 0)
{
suffix.ClearAndFreeChunk();
return;
}

Expand Down Expand Up @@ -1177,5 +1178,11 @@ private static string Display(byte[] bytes, int length)
BitConverter.ToString(bytes, 0, length) :
BitConverter.ToString(bytes, 0, MaxDisplaySize / 2) + "-...-" + BitConverter.ToString(bytes, length - MaxDisplaySize / 2, MaxDisplaySize / 2);
}

private void ClearAndFreeChunk()
{
ClearChunk();
FreeChunk();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1090,5 +1090,31 @@ public void PrematureEndOfStream()

AssertEx.Equal(sourceArray, builder.ToArray());
}

[Fact]
public void LinkEmptySuffixAndPrefixShouldFreeThem()
{
var b1 = PooledBlobBuilder.GetInstance();
var b2 = PooledBlobBuilder.GetInstance();
var b3 = PooledBlobBuilder.GetInstance();
var b4 = PooledBlobBuilder.GetInstance();
var b5 = PooledBlobBuilder.GetInstance();

b1.WriteBytes(1, 1);
b2.WriteBytes(1, 1);
b3.WriteBytes(1, 1);

b1.LinkSuffix(b2);
Assert.False(b2.IsHead);

b1.LinkPrefix(b3);
Assert.False(b3.IsHead);

b1.LinkSuffix(b4);
Assert.True(b4.IsHead);

b1.LinkPrefix(b5);
Assert.True(b4.IsHead);
}
}
}

0 comments on commit fc9ab41

Please sign in to comment.