-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Closed
Labels
area-System.Reflection.Metadatahelp wanted[up-for-grabs] Good issue for external contributors[up-for-grabs] Good issue for external contributors
Milestone
Description
Description
Both LinkSuffix and LinkPrefix have an optimization around zero length chunk to avoid unnecessary chaining:
// avoid chaining empty chunks:
if (prefix.Count == 0)
{
return;
}The issue is that LinkPrefix/Suffix effectively pass ownership of the BlobBuilder to the receiver. In the non-zero case it's put into the chain of chunks and freeing the head will free the time. In the zero case though the suffix / prefix is never freed. That makes managing pools difficult:
BlobBuilder b1 = GetBuilder1();
BlobBuilder b2 = GetBuilder2();
b1.LinkSuffix(b2);
b1.Free(); // Did that free b2 or not? Depends on length of b2Reproduction Steps
var b1 = PooledBlobBuilder.GetInstance();
var b2 = PooledBlobBuilder.GetInstance();
var b3 = PooledBlobBuilder.GetInstance();
b1.WriteBytes(1, 1);
b2.WriteBytes(1, 1);
b1.LinkSuffix(b2);
b1.LinkSuffix(b3);
b1.Free();Expected behavior
All of the instances are freed
Actual behavior
The b3 instance is not freed cause it was discarded in LinkSuffix for having a zero length.
Regression?
No.
Known Workarounds
Add LinkSuffixSmart / LinkPrefixSmart extension methods that do the zero check.
Configuration
No response
Other information
No response
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area-System.Reflection.Metadatahelp wanted[up-for-grabs] Good issue for external contributors[up-for-grabs] Good issue for external contributors