File tree 4 files changed +35
-7
lines changed
4 files changed +35
-7
lines changed Original file line number Diff line number Diff line change 35
35
"src\\Servers\\Kestrel\\test\\Sockets.BindTests\\Sockets.BindTests.csproj",
36
36
"src\\Servers\\Kestrel\\test\\Sockets.FunctionalTests\\Sockets.FunctionalTests.csproj",
37
37
"src\\Servers\\Kestrel\\tools\\CodeGenerator\\CodeGenerator.csproj",
38
- "src\\ObjectPool\\src\\Microsoft.Extensions.ObjectPool.csproj"
38
+ "src\\ObjectPool\\src\\Microsoft.Extensions.ObjectPool.csproj",
39
+ "src\\Testing\\src\\Microsoft.AspNetCore.Testing.csproj"
39
40
]
40
41
}
41
42
}
Original file line number Diff line number Diff line change @@ -69,20 +69,25 @@ private void SetBufferList(in ReadOnlySequence<byte> buffer)
69
69
Debug . Assert ( ! buffer . IsEmpty ) ;
70
70
Debug . Assert ( ! buffer . IsSingleSegment ) ;
71
71
72
- if ( BufferList == null )
72
+ var buffers = BufferList ;
73
+
74
+ if ( buffers == null )
73
75
{
74
- BufferList = new List < ArraySegment < byte > > ( ) ;
76
+ buffers = new List < ArraySegment < byte > > ( ) ;
75
77
}
76
78
else
77
79
{
78
80
// Buffers are pooled, so it's OK to root them until the next multi-buffer write.
79
- BufferList . Clear ( ) ;
81
+ buffers . Clear ( ) ;
80
82
}
81
83
82
84
foreach ( var b in buffer )
83
85
{
84
- BufferList . Add ( b . GetArray ( ) ) ;
86
+ buffers . Add ( b . GetArray ( ) ) ;
85
87
}
88
+
89
+ // The act of setting this list, sets the buffers in the internal buffer list
90
+ BufferList = buffers ;
86
91
}
87
92
}
88
93
}
Original file line number Diff line number Diff line change
1
+ using System ;
1
2
using System . Collections . Concurrent ;
2
3
using System . IO . Pipelines ;
3
4
4
5
namespace Microsoft . AspNetCore . Server . Kestrel . Transport . Sockets . Internal
5
6
{
6
- internal class SocketSenderPool
7
+ internal class SocketSenderPool : IDisposable
7
8
{
8
9
private const int MaxQueueSize = 1024 ; // REVIEW: Is this good enough?
9
10
10
11
private readonly ConcurrentQueue < SocketSender > _queue = new ( ) ;
11
12
private readonly PipeScheduler _scheduler ;
13
+ private bool _disposed ;
12
14
13
15
public SocketSenderPool ( PipeScheduler scheduler )
14
16
{
@@ -26,7 +28,7 @@ public SocketSender Rent()
26
28
27
29
public void Return ( SocketSender sender )
28
30
{
29
- if ( _queue . Count > MaxQueueSize )
31
+ if ( _disposed || _queue . Count > MaxQueueSize )
30
32
{
31
33
sender . Dispose ( ) ;
32
34
return ;
@@ -36,5 +38,18 @@ public void Return(SocketSender sender)
36
38
37
39
_queue . Enqueue ( sender ) ;
38
40
}
41
+
42
+ public void Dispose ( )
43
+ {
44
+ if ( ! _disposed )
45
+ {
46
+ _disposed = true ;
47
+ while ( _queue . TryDequeue ( out var sender ) )
48
+ {
49
+ sender . Dispose ( ) ;
50
+ }
51
+ }
52
+ }
53
+
39
54
}
40
55
}
Original file line number Diff line number Diff line change @@ -204,6 +204,13 @@ public ValueTask DisposeAsync()
204
204
205
205
// Dispose the memory pool
206
206
_memoryPool . Dispose ( ) ;
207
+
208
+ // Dispose any pooled senders
209
+ foreach ( var setting in _settings )
210
+ {
211
+ setting . SocketSenderPool . Dispose ( ) ;
212
+ }
213
+
207
214
return default ;
208
215
}
209
216
You can’t perform that action at this time.
0 commit comments