-
Notifications
You must be signed in to change notification settings - Fork 657
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Moving PooledRecvBufferAllocator
from NIOPosix to NIOCore
#3110
base: main
Are you sure you want to change the base?
Conversation
@@ -58,7 +61,7 @@ internal struct PooledRecvBufferAllocator { | |||
} | |||
|
|||
/// Update the capacity of the underlying buffer pool. | |||
mutating func updateCapacity(to newCapacity: Int) { | |||
public mutating func updateCapacity(to newCapacity: Int) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we update the docs for this and the other public
methods to include a list of arguments (i.e. the Parameters
keyword as in the public init
above)?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've added the missing documentation. Let me know if you think I should change anything else.
@@ -12,10 +12,8 @@ | |||
// | |||
//===----------------------------------------------------------------------===// | |||
|
|||
import NIOCore | |||
|
|||
/// A receive buffer allocator which cycles through a pool of buffers. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should extend this to express when users might want to use this type.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this addition to the comment accurate and sufficient: This type is useful when allocating new buffers for every IO read is expensive or undesirable.
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Allocating is always expensive, so I'm not sure this is particularly insightful. Maybe something like:
Channels can read multiple times per cycle (based on
ChannelOptions.maxMessagesPerRead
), and they reuse the inbound buffer for each read. If aChannelHandler
holds onto this buffer, then CoWing will be needed. APooledRecvBufferAllocator
cycles through preallocated buffers to avoid CoWs during the same read cycle.
mutating func record(actualReadBytes: Int) { | ||
/// - Parameters: | ||
/// - actualReadBytes: Number of bytes being recorded | ||
/// - Returns: whether the next buffer will be larger than the last. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This isn't actually returning anything so I'd get rid of this line
@@ -12,10 +12,8 @@ | |||
// | |||
//===----------------------------------------------------------------------===// | |||
|
|||
import NIOCore | |||
|
|||
/// A receive buffer allocator which cycles through a pool of buffers. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Allocating is always expensive, so I'm not sure this is particularly insightful. Maybe something like:
Channels can read multiple times per cycle (based on
ChannelOptions.maxMessagesPerRead
), and they reuse the inbound buffer for each read. If aChannelHandler
holds onto this buffer, then CoWing will be needed. APooledRecvBufferAllocator
cycles through preallocated buffers to avoid CoWs during the same read cycle.
internal struct PooledRecvBufferAllocator { | ||
/// | ||
/// This type is useful when allocating new buffers for every IO read is expensive or undesirable. | ||
public struct PooledRecvBufferAllocator { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This'll need a "NIO" prefix now that it's coming into a public namespace, see https://github.com/apple/swift-nio/blob/main/docs/public-api.md#1-no-global-namespace-additions-that-arent-prefixed
/// - allocator: `ByteBufferAllocator` used to construct a new buffer if needed | ||
/// - body: Closure where the caller can use the new or existing buffer | ||
/// - Returns: A tuple containing the `ByteBuffer` used and the `Result` yielded by the closure provided. | ||
public mutating func buffer<Result>( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should be @inlinable
. In turn it will mean a bunch of other functions and properties will need to be as well. For anything that's private
that needs to be @inlinable
/@usableFromInline
they can become internal
and be prefixed with an _
.
Moving
PooledRecvBufferAllocator
from NIOPosix to NIOCore, making it part of its public interface.Motivation:
We want to introduce the capability of reusing receiving buffers from a pool into swift-nio-transport-services project. To prevent duplicating this functionality there, this change is making the existing functionality from NIO part of its public API.
Modifications:
Moved the type
PooledRecvBufferAllocator
from NIOPosix module to NIOCore and turned it into a public type.Result:
PooledRecvBufferAllocator
is part of NIOCore public API.