-
Notifications
You must be signed in to change notification settings - Fork 10k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- SocketAsyncEventArgs have lots of state on them and as a result are quite big (~350) bytes at runtime. We can pool these since sends are usually very fast and we can reduce the per connection overhead as a result. - We also allocate one per IOQueue to reduce contention. - Fixed buffer list management - Disposed pool when the transport is disposed - Added project to slnf so running tests in VS was possible - Clear the buffer and buffer list before returning to the pool - This cleans up dumps as the pooled senders don't see references to buffers while pooled in the queue - Keep track of items in the pool separately from the queue count.
- Loading branch information
Showing
9 changed files
with
142 additions
and
74 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
61 changes: 61 additions & 0 deletions
61
src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketSenderPool.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
// Copyright (c) .NET Foundation. All rights reserved. | ||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. | ||
|
||
using System; | ||
using System.Collections.Concurrent; | ||
using System.IO.Pipelines; | ||
using System.Threading; | ||
|
||
namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal | ||
{ | ||
internal class SocketSenderPool : IDisposable | ||
{ | ||
private const int MaxQueueSize = 1024; // REVIEW: Is this good enough? | ||
|
||
private readonly ConcurrentQueue<SocketSender> _queue = new(); | ||
private int _count; | ||
private readonly PipeScheduler _scheduler; | ||
private bool _disposed; | ||
|
||
public SocketSenderPool(PipeScheduler scheduler) | ||
{ | ||
_scheduler = scheduler; | ||
} | ||
|
||
public SocketSender Rent() | ||
{ | ||
if (_queue.TryDequeue(out var sender)) | ||
{ | ||
Interlocked.Decrement(ref _count); | ||
return sender; | ||
} | ||
return new SocketSender(_scheduler); | ||
} | ||
|
||
public void Return(SocketSender sender) | ||
{ | ||
// This counting isn't accurate, but it's good enough for what we need to avoid using _queue.Count which could be expensive | ||
if (_disposed || Interlocked.Increment(ref _count) > MaxQueueSize) | ||
{ | ||
Interlocked.Decrement(ref _count); | ||
sender.Dispose(); | ||
return; | ||
} | ||
|
||
sender.Reset(); | ||
_queue.Enqueue(sender); | ||
} | ||
|
||
public void Dispose() | ||
{ | ||
if (!_disposed) | ||
{ | ||
_disposed = true; | ||
while (_queue.TryDequeue(out var sender)) | ||
{ | ||
sender.Dispose(); | ||
} | ||
} | ||
} | ||
} | ||
} |
23 changes: 0 additions & 23 deletions
23
src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketSenderReceiverBase.cs
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.