Skip to content

Commit cffd3f3

Browse files
committed
Add inlinable annotations
1 parent 91661a4 commit cffd3f3

File tree

2 files changed

+67
-47
lines changed

2 files changed

+67
-47
lines changed

Sources/GRPC/AsyncAwaitSupport/PassthroughMessageSequence.swift

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,30 +17,40 @@
1717

1818
/// An ``AsyncSequence`` adapter for a ``PassthroughMessageSource``.`
1919
@available(macOS 12, iOS 15, tvOS 15, watchOS 8, *)
20+
@usableFromInline
2021
internal struct PassthroughMessageSequence<Element, Failure: Error>: AsyncSequence {
22+
@usableFromInline
2123
internal typealias Element = Element
24+
25+
@usableFromInline
2226
internal typealias AsyncIterator = Iterator
2327

2428
/// The source of messages in the sequence.
25-
private let source: PassthroughMessageSource<Element, Failure>
29+
@usableFromInline
30+
internal let _source: PassthroughMessageSource<Element, Failure>
2631

32+
@usableFromInline
2733
internal func makeAsyncIterator() -> Iterator {
28-
return Iterator(storage: self.source)
34+
return Iterator(storage: self._source)
2935
}
3036

37+
@usableFromInline
3138
internal init(consuming source: PassthroughMessageSource<Element, Failure>) {
32-
self.source = source
39+
self._source = source
3340
}
3441

42+
@usableFromInline
3543
internal struct Iterator: AsyncIteratorProtocol {
36-
private let storage: PassthroughMessageSource<Element, Failure>
44+
@usableFromInline
45+
internal let _storage: PassthroughMessageSource<Element, Failure>
3746

3847
fileprivate init(storage: PassthroughMessageSource<Element, Failure>) {
39-
self.storage = storage
48+
self._storage = storage
4049
}
4150

51+
@inlinable
4252
internal func next() async throws -> Element? {
43-
return try await self.storage.consumeNextElement()
53+
return try await self._storage.consumeNextElement()
4454
}
4555
}
4656
}

Sources/GRPC/AsyncAwaitSupport/PassthroughMessageSource.swift

Lines changed: 51 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -28,35 +28,43 @@ import NIOCore
2828
/// The source must be finished exactly once by calling ``finish()`` or ``finish(throwing:)`` to
2929
/// indicate that the sequence should end with an error.
3030
@available(macOS 12, iOS 15, tvOS 15, watchOS 8, *)
31+
@usableFromInline
3132
internal final class PassthroughMessageSource<Element, Failure: Error> {
32-
private typealias ContinuationResult = Result<Element?, Error>
33+
@usableFromInline
34+
internal typealias _ContinuationResult = Result<Element?, Error>
3335

3436
/// All state in this class must be accessed via the lock.
3537
///
3638
/// - Important: We use a `class` with a lock rather than an `actor` as we must guarantee that
3739
/// calls to ``yield(_:)`` are not reordered.
38-
private let lock: Lock
40+
@usableFromInline
41+
internal let _lock: Lock
3942

4043
/// A queue of elements which may be consumed as soon as there is demand.
41-
private var continuationResults: CircularBuffer<ContinuationResult>
44+
@usableFromInline
45+
internal var _continuationResults: CircularBuffer<_ContinuationResult>
4246

4347
/// A continuation which will be resumed in the future. The continuation must be `nil`
4448
/// if ``continuationResults`` is not empty.
45-
private var continuation: Optional<CheckedContinuation<Element?, Error>>
49+
@usableFromInline
50+
internal var _continuation: Optional<CheckedContinuation<Element?, Error>>
4651

4752
/// True if a terminal continuation result (`.success(nil)` or `.failure()`) has been seen.
4853
/// No more values may be enqueued to `continuationResults` if this is `true`.
49-
private var isTerminated: Bool
54+
@usableFromInline
55+
internal var _isTerminated: Bool
5056

57+
@usableFromInline
5158
internal init(initialBufferCapacity: Int = 16) {
52-
self.lock = Lock()
53-
self.continuationResults = CircularBuffer(initialCapacity: initialBufferCapacity)
54-
self.continuation = nil
55-
self.isTerminated = false
59+
self._lock = Lock()
60+
self._continuationResults = CircularBuffer(initialCapacity: initialBufferCapacity)
61+
self._continuation = nil
62+
self._isTerminated = false
5663
}
5764

5865
// MARK: - Append / Yield
5966

67+
@usableFromInline
6068
internal enum YieldResult: Hashable {
6169
/// The value was accepted. The `queueDepth` indicates how many elements are waiting to be
6270
/// consumed.
@@ -68,17 +76,20 @@ internal final class PassthroughMessageSource<Element, Failure: Error> {
6876
case dropped
6977
}
7078

79+
@inlinable
7180
internal func yield(_ element: Element) -> YieldResult {
72-
let continuationResult: ContinuationResult = .success(element)
73-
return self.yield(continuationResult, isTerminator: false)
81+
let continuationResult: _ContinuationResult = .success(element)
82+
return self._yield(continuationResult, isTerminator: false)
7483
}
7584

85+
@inlinable
7686
internal func finish(throwing error: Failure? = nil) -> YieldResult {
77-
let continuationResult: ContinuationResult = error.map { .failure($0) } ?? .success(nil)
78-
return self.yield(continuationResult, isTerminator: true)
87+
let continuationResult: _ContinuationResult = error.map { .failure($0) } ?? .success(nil)
88+
return self._yield(continuationResult, isTerminator: true)
7989
}
8090

81-
private enum _YieldResult {
91+
@usableFromInline
92+
internal enum _YieldResult {
8293
/// The sequence has already been terminated; drop the element.
8394
case alreadyTerminated
8495
/// The element was added to the queue to be consumed later.
@@ -88,10 +99,25 @@ internal final class PassthroughMessageSource<Element, Failure: Error> {
8899
case resume(CheckedContinuation<Element?, Error>)
89100
}
90101

91-
private func yield(_ continuationResult: ContinuationResult, isTerminator: Bool) -> YieldResult {
92-
let yieldResult: YieldResult
102+
@inlinable
103+
internal func _yield(
104+
_ continuationResult: _ContinuationResult, isTerminator: Bool
105+
) -> YieldResult {
106+
let result: _YieldResult = self._lock.withLock {
107+
if self._isTerminated {
108+
return .alreadyTerminated
109+
} else if let continuation = self._continuation {
110+
self._continuation = nil
111+
return .resume(continuation)
112+
} else {
113+
self._isTerminated = isTerminator
114+
self._continuationResults.append(continuationResult)
115+
return .queued(self._continuationResults.count)
116+
}
117+
}
93118

94-
switch self._yield(continuationResult, isTerminator: isTerminator) {
119+
let yieldResult: YieldResult
120+
switch result {
95121
case let .queued(size):
96122
yieldResult = .accepted(queueDepth: size)
97123
case let .resume(continuation):
@@ -105,40 +131,24 @@ internal final class PassthroughMessageSource<Element, Failure: Error> {
105131
return yieldResult
106132
}
107133

108-
private func _yield(
109-
_ continuationResult: ContinuationResult,
110-
isTerminator: Bool
111-
) -> _YieldResult {
112-
return self.lock.withLock {
113-
if self.isTerminated {
114-
return .alreadyTerminated
115-
} else if let continuation = self.continuation {
116-
self.continuation = nil
117-
return .resume(continuation)
118-
} else {
119-
self.isTerminated = isTerminator
120-
self.continuationResults.append(continuationResult)
121-
return .queued(self.continuationResults.count)
122-
}
123-
}
124-
}
125-
126134
// MARK: - Next
127135

136+
@inlinable
128137
internal func consumeNextElement() async throws -> Element? {
129138
return try await withCheckedThrowingContinuation {
130-
self.consumeNextElement(continuation: $0)
139+
self._consumeNextElement(continuation: $0)
131140
}
132141
}
133142

134-
private func consumeNextElement(continuation: CheckedContinuation<Element?, Error>) {
135-
let continuationResult: ContinuationResult? = self.lock.withLock {
136-
if let nextResult = self.continuationResults.popFirst() {
143+
@inlinable
144+
internal func _consumeNextElement(continuation: CheckedContinuation<Element?, Error>) {
145+
let continuationResult: _ContinuationResult? = self._lock.withLock {
146+
if let nextResult = self._continuationResults.popFirst() {
137147
return nextResult
138148
} else {
139149
// Nothing buffered and not terminated yet: save the continuation for later.
140-
assert(self.continuation == nil)
141-
self.continuation = continuation
150+
assert(self._continuation == nil)
151+
self._continuation = continuation
142152
return nil
143153
}
144154
}

0 commit comments

Comments
 (0)