Skip to content
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

[ByteBuffer] Reduce ARC traffic when reading #1978

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 16 additions & 12 deletions Sources/NIOCore/ByteBuffer-aux.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,11 @@ extension ByteBuffer {
/// - length: The number of bytes to be read from this `ByteBuffer`.
/// - returns: A `[UInt8]` value containing `length` bytes or `nil` if there aren't at least `length` bytes readable.
public mutating func readBytes(length: Int) -> [UInt8]? {
return self.getBytes(at: self.readerIndex, length: length).map {
self._moveReaderIndex(forwardBy: length)
return $0
guard let result = self.getBytes(at: self.readerIndex, length: length) else {
return nil
}
self._moveReaderIndex(forwardBy: length)
return result
}

// MARK: StaticString APIs
Expand Down Expand Up @@ -149,10 +150,11 @@ extension ByteBuffer {
/// - length: The number of bytes making up the string.
/// - returns: A `String` value deserialized from this `ByteBuffer` or `nil` if there aren't at least `length` bytes readable.
public mutating func readString(length: Int) -> String? {
return self.getString(at: self.readerIndex, length: length).map {
self._moveReaderIndex(forwardBy: length)
return $0
guard let result = self.getString(at: self.readerIndex, length: length) else {
return nil
}
self._moveReaderIndex(forwardBy: length)
return result
}

// MARK: Substring APIs
Expand Down Expand Up @@ -238,10 +240,11 @@ extension ByteBuffer {
/// - length: The number of bytes.
/// - returns: A `DispatchData` value containing the bytes from this `ByteBuffer` or `nil` if there aren't at least `length` bytes readable.
public mutating func readDispatchData(length: Int) -> DispatchData? {
return self.getDispatchData(at: self.readerIndex, length: length).map {
self._moveReaderIndex(forwardBy: length)
return $0
guard let result = self.getDispatchData(at: self.readerIndex, length: length) else {
return nil
}
self._moveReaderIndex(forwardBy: length)
return result
}


Expand Down Expand Up @@ -426,10 +429,11 @@ extension ByteBuffer {
/// - length: The number of bytes to slice off.
/// - returns: A `ByteBuffer` sharing storage containing `length` bytes or `nil` if the not enough bytes were readable.
public mutating func readSlice(length: Int) -> ByteBuffer? {
return self.getSlice(at: self.readerIndex, length: length).map {
self._moveReaderIndex(forwardBy: length)
return $0
guard let result = self.getSlice(at: self.readerIndex, length: length) else {
return nil
}
self._moveReaderIndex(forwardBy: length)
return result
}

@discardableResult
Expand Down
7 changes: 4 additions & 3 deletions Sources/NIOCore/ByteBuffer-int.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,11 @@ extension ByteBuffer {
/// - returns: An integer value deserialized from this `ByteBuffer` or `nil` if there aren't enough bytes readable.
@inlinable
public mutating func readInteger<T: FixedWidthInteger>(endianness: Endianness = .big, as: T.Type = T.self) -> T? {
return self.getInteger(at: self.readerIndex, endianness: endianness, as: T.self).map {
self._moveReaderIndex(forwardBy: MemoryLayout<T>.size)
return $0
guard let result = self.getInteger(at: self.readerIndex, endianness: endianness, as: T.self) else {
return nil
}
self._moveReaderIndex(forwardBy: MemoryLayout<T>.size)
return result
}

/// Get the integer at `index` from this `ByteBuffer`. Does not move the reader index.
Expand Down
7 changes: 4 additions & 3 deletions Sources/NIOCore/ByteBuffer-lengthPrefix.swift
Original file line number Diff line number Diff line change
Expand Up @@ -112,10 +112,11 @@ extension ByteBuffer {
endianness: Endianness = .big,
as integer: Integer.Type
) -> ByteBuffer? where Integer: FixedWidthInteger {
self.getLengthPrefixedSlice(at: self.readerIndex, endianness: endianness, as: Integer.self).map {
self._moveReaderIndex(forwardBy: MemoryLayout<Integer>.size + $0.readableBytes)
return $0
guard let result = self.getLengthPrefixedSlice(at: self.readerIndex, endianness: endianness, as: Integer.self) else {
return nil
}
self._moveReaderIndex(forwardBy: MemoryLayout<Integer>.size + result.readableBytes)
return result
}

/// Gets an `Integer` from `self` and gets a slice of that length from `self` and returns it.
Expand Down