Skip to content

Commit d4bb7ae

Browse files
yyjdeletenayato
authored andcommitted
Fix issue #472 (#473)
* Align and add some missing overloads for ByteBuffer * Add the workaround for case 1 in #436 * Remove Deque.cs from DotNetty.Common * Fix false positive resource leak report. * Change some behavior of ResourceLeakDetector
1 parent c011350 commit d4bb7ae

8 files changed

+349
-939
lines changed

src/DotNetty.Buffers/AbstractByteBuffer.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -560,16 +560,20 @@ public virtual IByteBuffer SetShortLE(int index, int value)
560560

561561
protected internal abstract void _SetShortLE(int index, int value);
562562

563-
public virtual IByteBuffer SetUnsignedShort(int index, ushort value)
563+
public IByteBuffer SetUnsignedShort(int index, ushort value)
564564
{
565-
this.SetShort(index, value);
566-
return this;
565+
unchecked
566+
{
567+
return this.SetShort(index, (short)value);
568+
}
567569
}
568570

569-
public virtual IByteBuffer SetUnsignedShortLE(int index, ushort value)
571+
public IByteBuffer SetUnsignedShortLE(int index, ushort value)
570572
{
571-
this.SetShortLE(index, value);
572-
return this;
573+
unchecked
574+
{
575+
return this.SetShortLE(index, (short)value);
576+
}
573577
}
574578

575579
public virtual IByteBuffer SetChar(int index, char value)

src/DotNetty.Buffers/AdvancedLeakAwareByteBuffer.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -771,6 +771,30 @@ public override IReferenceCounted Retain(int increment)
771771
return base.Retain(increment);
772772
}
773773

774+
public override IByteBuffer RetainedSlice()
775+
{
776+
RecordLeakNonRefCountingOperation(this.Leak);
777+
return base.RetainedSlice();
778+
}
779+
780+
public override IByteBuffer RetainedSlice(int index, int length)
781+
{
782+
RecordLeakNonRefCountingOperation(this.Leak);
783+
return base.RetainedSlice(index, length);
784+
}
785+
786+
public override IByteBuffer RetainedDuplicate()
787+
{
788+
RecordLeakNonRefCountingOperation(this.Leak);
789+
return base.RetainedDuplicate();
790+
}
791+
792+
public override IByteBuffer ReadRetainedSlice(int length)
793+
{
794+
RecordLeakNonRefCountingOperation(this.Leak);
795+
return base.ReadRetainedSlice(length);
796+
}
797+
774798
public override IReferenceCounted Touch()
775799
{
776800
this.Leak.Record();

src/DotNetty.Buffers/AdvancedLeakAwareCompositeByteBuffer.cs

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
namespace DotNetty.Buffers
55
{
66
using System;
7+
using System.Collections.Generic;
78
using System.IO;
89
using System.Text;
910
using System.Threading;
@@ -593,6 +594,156 @@ public override IByteBuffer GetBytes(int index, Stream destination, int length)
593594
return base.GetBytes(index, destination, length);
594595
}
595596

597+
public override CompositeByteBuffer AddComponent(bool increaseWriterIndex, IByteBuffer buffer)
598+
{
599+
RecordLeakNonRefCountingOperation(this.Leak);
600+
return base.AddComponent(increaseWriterIndex, buffer);
601+
}
602+
603+
public override CompositeByteBuffer AddComponent(bool increaseWriterIndex, int cIndex, IByteBuffer buffer)
604+
{
605+
RecordLeakNonRefCountingOperation(this.Leak);
606+
return base.AddComponent(increaseWriterIndex, cIndex, buffer);
607+
}
608+
609+
public override CompositeByteBuffer AddComponent(IByteBuffer buffer)
610+
{
611+
RecordLeakNonRefCountingOperation(this.Leak);
612+
return base.AddComponent(buffer);
613+
}
614+
615+
public override CompositeByteBuffer AddComponent(int cIndex, IByteBuffer buffer)
616+
{
617+
RecordLeakNonRefCountingOperation(this.Leak);
618+
return base.AddComponent(cIndex, buffer);
619+
}
620+
621+
public override CompositeByteBuffer AddComponents(bool increaseWriterIndex, params IByteBuffer[] buffers)
622+
{
623+
RecordLeakNonRefCountingOperation(this.Leak);
624+
return base.AddComponents(increaseWriterIndex, buffers);
625+
}
626+
627+
public override CompositeByteBuffer AddComponents(bool increaseWriterIndex, IEnumerable<IByteBuffer> buffers)
628+
{
629+
RecordLeakNonRefCountingOperation(this.Leak);
630+
return base.AddComponents(increaseWriterIndex, buffers);
631+
}
632+
633+
public override CompositeByteBuffer AddComponents(IEnumerable<IByteBuffer> buffers)
634+
{
635+
RecordLeakNonRefCountingOperation(this.Leak);
636+
return base.AddComponents(buffers);
637+
}
638+
639+
public override CompositeByteBuffer AddComponents(int cIndex, IEnumerable<IByteBuffer> buffers)
640+
{
641+
RecordLeakNonRefCountingOperation(this.Leak);
642+
return base.AddComponents(cIndex, buffers);
643+
}
644+
645+
public override CompositeByteBuffer AddComponents(int cIndex, params IByteBuffer[] buffers)
646+
{
647+
RecordLeakNonRefCountingOperation(this.Leak);
648+
return base.AddComponents(cIndex, buffers);
649+
}
650+
651+
public override CompositeByteBuffer AddComponents(params IByteBuffer[] buffers)
652+
{
653+
RecordLeakNonRefCountingOperation(this.Leak);
654+
return base.AddComponents(buffers);
655+
}
656+
657+
public override CompositeByteBuffer RemoveComponent(int cIndex)
658+
{
659+
RecordLeakNonRefCountingOperation(this.Leak);
660+
return base.RemoveComponent(cIndex);
661+
}
662+
663+
public override CompositeByteBuffer RemoveComponents(int cIndex, int numComponents)
664+
{
665+
RecordLeakNonRefCountingOperation(this.Leak);
666+
return base.RemoveComponents(cIndex, numComponents);
667+
}
668+
669+
public override CompositeByteBuffer Consolidate()
670+
{
671+
RecordLeakNonRefCountingOperation(this.Leak);
672+
return base.Consolidate();
673+
}
674+
675+
public override CompositeByteBuffer Consolidate(int cIndex, int numComponents)
676+
{
677+
RecordLeakNonRefCountingOperation(this.Leak);
678+
return base.Consolidate(cIndex, numComponents);
679+
}
680+
681+
public override CompositeByteBuffer DiscardReadComponents()
682+
{
683+
RecordLeakNonRefCountingOperation(this.Leak);
684+
return base.DiscardReadComponents();
685+
}
686+
687+
public override IList<IByteBuffer> Decompose(int offset, int length)
688+
{
689+
RecordLeakNonRefCountingOperation(this.Leak);
690+
return base.Decompose(offset, length);
691+
}
692+
693+
public override ICharSequence GetCharSequence(int index, int length, Encoding encoding)
694+
{
695+
RecordLeakNonRefCountingOperation(this.Leak);
696+
return base.GetCharSequence(index, length, encoding);
697+
}
698+
699+
public override ICharSequence ReadCharSequence(int length, Encoding encoding)
700+
{
701+
RecordLeakNonRefCountingOperation(this.Leak);
702+
return base.ReadCharSequence(length, encoding);
703+
}
704+
705+
public override int SetCharSequence(int index, ICharSequence sequence, Encoding encoding)
706+
{
707+
RecordLeakNonRefCountingOperation(this.Leak);
708+
return base.SetCharSequence(index, sequence, encoding);
709+
}
710+
711+
public override int WriteCharSequence(ICharSequence sequence, Encoding encoding)
712+
{
713+
RecordLeakNonRefCountingOperation(this.Leak);
714+
return base.WriteCharSequence(sequence, encoding);
715+
}
716+
717+
public override string GetString(int index, int length, Encoding encoding)
718+
{
719+
RecordLeakNonRefCountingOperation(this.Leak);
720+
return base.GetString(index, length, encoding);
721+
}
722+
723+
public override string ReadString(int length, Encoding encoding)
724+
{
725+
RecordLeakNonRefCountingOperation(this.Leak);
726+
return base.ReadString(length, encoding);
727+
}
728+
729+
public override int SetString(int index, string value, Encoding encoding)
730+
{
731+
RecordLeakNonRefCountingOperation(this.Leak);
732+
return base.SetString(index, value, encoding);
733+
}
734+
735+
public override int WriteString(string value, Encoding encoding)
736+
{
737+
RecordLeakNonRefCountingOperation(this.Leak);
738+
return base.WriteString(value, encoding);
739+
}
740+
741+
public override IEnumerator<IByteBuffer> GetEnumerator()
742+
{
743+
RecordLeakNonRefCountingOperation(this.Leak);
744+
return base.GetEnumerator();
745+
}
746+
596747
public override IReferenceCounted Retain()
597748
{
598749
this.Leak.Record();
@@ -605,6 +756,30 @@ public override IReferenceCounted Retain(int increment)
605756
return base.Retain(increment);
606757
}
607758

759+
public override IByteBuffer RetainedSlice()
760+
{
761+
RecordLeakNonRefCountingOperation(this.Leak);
762+
return base.RetainedSlice();
763+
}
764+
765+
public override IByteBuffer RetainedSlice(int index, int length)
766+
{
767+
RecordLeakNonRefCountingOperation(this.Leak);
768+
return base.RetainedSlice(index, length);
769+
}
770+
771+
public override IByteBuffer RetainedDuplicate()
772+
{
773+
RecordLeakNonRefCountingOperation(this.Leak);
774+
return base.RetainedDuplicate();
775+
}
776+
777+
public override IByteBuffer ReadRetainedSlice(int length)
778+
{
779+
RecordLeakNonRefCountingOperation(this.Leak);
780+
return base.ReadRetainedSlice(length);
781+
}
782+
608783
public override bool Release()
609784
{
610785
this.Leak.Record();

src/DotNetty.Buffers/SimpleLeakAwareCompositeByteBuffer.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ void CloseLeak(IByteBuffer trackedByteBuf)
6161

6262
public override IByteBuffer ReadSlice(int length) => this.NewLeakAwareByteBuffer(base.ReadSlice(length));
6363

64+
public override IByteBuffer RetainedSlice() => this.NewLeakAwareByteBuffer(base.RetainedSlice());
65+
66+
public override IByteBuffer RetainedSlice(int index, int length) => this.NewLeakAwareByteBuffer(base.RetainedSlice(index, length));
67+
68+
public override IByteBuffer RetainedDuplicate() => this.NewLeakAwareByteBuffer(base.RetainedDuplicate());
69+
70+
public override IByteBuffer ReadRetainedSlice(int length) => this.NewLeakAwareByteBuffer(base.ReadRetainedSlice(length));
71+
6472
SimpleLeakAwareByteBuffer NewLeakAwareByteBuffer(IByteBuffer wrapped) => this.NewLeakAwareByteBuffer(wrapped, this.Unwrap(), this.Leak);
6573

6674
protected virtual SimpleLeakAwareByteBuffer NewLeakAwareByteBuffer(IByteBuffer wrapped, IByteBuffer trackedByteBuf, IResourceLeakTracker leakTracker) =>

src/DotNetty.Buffers/UnpooledUnsafeDirectByteBuffer.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,9 @@ public override Task<int> SetBytesAsync(int index, Stream src, int length, Cance
297297
{
298298
this.CheckIndex(index, length);
299299
fixed (byte* addr = &this.Addr(index))
300+
{
300301
return UnsafeByteBufferUtil.SetBytesAsync(this, addr, index, src, length, cancellationToken);
302+
}
301303
}
302304

303305
public override int IoBufferCount => 1;

src/DotNetty.Buffers/WrappedCompositeByteBuffer.cs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,13 +110,13 @@ internal WrappedCompositeByteBuffer(CompositeByteBuffer wrapped) : base(wrapped.
110110

111111
public override int ForEachByteDesc(int index, int length, IByteProcessor processor) => this.wrapped.ForEachByteDesc(index, length, processor);
112112

113-
public override int GetHashCode() => this.wrapped.GetHashCode();
113+
public sealed override int GetHashCode() => this.wrapped.GetHashCode();
114114

115-
public override bool Equals(IByteBuffer buf) => this.wrapped.Equals(buf);
115+
public sealed override bool Equals(IByteBuffer buf) => this.wrapped.Equals(buf);
116116

117-
public override int CompareTo(IByteBuffer that) => this.wrapped.CompareTo(that);
117+
public sealed override int CompareTo(IByteBuffer that) => this.wrapped.CompareTo(that);
118118

119-
public override int ReferenceCount => this.wrapped.ReferenceCount;
119+
public sealed override int ReferenceCount => this.wrapped.ReferenceCount;
120120

121121
public override IByteBuffer Duplicate() => this.wrapped.Duplicate();
122122

@@ -669,5 +669,25 @@ public override IByteBuffer DiscardSomeReadBytes()
669669
protected internal sealed override void Deallocate() => this.wrapped.Deallocate();
670670

671671
public sealed override IByteBuffer Unwrap() => this.wrapped;
672+
673+
public sealed override IntPtr AddressOfPinnedMemory() => this.wrapped.AddressOfPinnedMemory();
674+
675+
public sealed override ref byte GetPinnableMemoryAddress() => ref this.wrapped.GetPinnableMemoryAddress();
676+
677+
public sealed override bool HasMemoryAddress => this.wrapped.HasMemoryAddress;
678+
679+
public sealed override bool IsWritable(int size) => this.wrapped.IsWritable(size);
680+
681+
public sealed override int MaxCapacity => this.wrapped.MaxCapacity;
682+
683+
public sealed override bool IsDirect => this.wrapped.IsDirect;
684+
685+
public override IByteBuffer ReadRetainedSlice(int length) => this.wrapped.ReadRetainedSlice(length);
686+
687+
public override IByteBuffer RetainedDuplicate() => this.wrapped.RetainedDuplicate();
688+
689+
public override IByteBuffer RetainedSlice() => this.wrapped.RetainedSlice();
690+
691+
public override IByteBuffer RetainedSlice(int index, int length) => this.wrapped.RetainedSlice(index, length);
672692
}
673693
}

0 commit comments

Comments
 (0)