Split and move SocketOptionProvider (#1930)

Motivation:

SocketOptionProvider is a general interface for setting socket options
that are "wider" than a single platform Int. There is nothing inherent
in NIO to require the definition of this protocol to be there, so we
can move it to NIOCore.

Modifications:

- Move the definition of SocketOptionProvider to NIOCore.

Result:

SocketOptionProvider is generally available.
This commit is contained in:
Cory Benfield 2021-08-05 17:37:05 +01:00 committed by GitHub
parent cdf27b6160
commit a7e064d185
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 69 additions and 52 deletions

View File

@ -0,0 +1,63 @@
//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftNIO open source project
//
// Copyright (c) 2017-2021 Apple Inc. and the SwiftNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
extension BaseSocketChannel: SocketOptionProvider {
#if !os(Windows)
func unsafeSetSocketOption<Value>(level: SocketOptionLevel, name: SocketOptionName, value: Value) -> EventLoopFuture<Void> {
return unsafeSetSocketOption(level: NIOBSDSocket.OptionLevel(rawValue: CInt(level)), name: NIOBSDSocket.Option(rawValue: CInt(name)), value: value)
}
#endif
func unsafeSetSocketOption<Value>(level: NIOBSDSocket.OptionLevel, name: NIOBSDSocket.Option, value: Value) -> EventLoopFuture<Void> {
if eventLoop.inEventLoop {
let promise = eventLoop.makePromise(of: Void.self)
executeAndComplete(promise) {
try setSocketOption0(level: level, name: name, value: value)
}
return promise.futureResult
} else {
return eventLoop.submit {
try self.setSocketOption0(level: level, name: name, value: value)
}
}
}
#if !os(Windows)
func unsafeGetSocketOption<Value>(level: SocketOptionLevel, name: SocketOptionName) -> EventLoopFuture<Value> {
return unsafeGetSocketOption(level: NIOBSDSocket.OptionLevel(rawValue: CInt(level)), name: NIOBSDSocket.Option(rawValue: CInt(name)))
}
#endif
func unsafeGetSocketOption<Value>(level: NIOBSDSocket.OptionLevel, name: NIOBSDSocket.Option) -> EventLoopFuture<Value> {
if eventLoop.inEventLoop {
let promise = eventLoop.makePromise(of: Value.self)
executeAndComplete(promise) {
try getSocketOption0(level: level, name: name)
}
return promise.futureResult
} else {
return eventLoop.submit {
try self.getSocketOption0(level: level, name: name)
}
}
}
func setSocketOption0<Value>(level: NIOBSDSocket.OptionLevel, name: NIOBSDSocket.Option, value: Value) throws {
try self.socket.setOption(level: level, name: name, value: value)
}
func getSocketOption0<Value>(level: NIOBSDSocket.OptionLevel, name: NIOBSDSocket.Option) throws -> Value {
return try self.socket.getOption(level: level, name: name)
}
}

View File

@ -2,7 +2,7 @@
//
// This source file is part of the SwiftNIO open source project
//
// Copyright (c) 2017-2018 Apple Inc. and the SwiftNIO project authors
// Copyright (c) 2017-2021 Apple Inc. and the SwiftNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
@ -11,6 +11,11 @@
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)
import Darwin
#elseif os(Linux) || os(Android)
import Glibc
#endif
/// This protocol defines an object, most commonly a `Channel`, that supports
/// setting and getting socket options (via `setsockopt`/`getsockopt` or similar).
@ -276,54 +281,3 @@ extension SocketOptionProvider {
}
#endif
}
extension BaseSocketChannel: SocketOptionProvider {
#if !os(Windows)
func unsafeSetSocketOption<Value>(level: SocketOptionLevel, name: SocketOptionName, value: Value) -> EventLoopFuture<Void> {
return unsafeSetSocketOption(level: NIOBSDSocket.OptionLevel(rawValue: CInt(level)), name: NIOBSDSocket.Option(rawValue: CInt(name)), value: value)
}
#endif
func unsafeSetSocketOption<Value>(level: NIOBSDSocket.OptionLevel, name: NIOBSDSocket.Option, value: Value) -> EventLoopFuture<Void> {
if eventLoop.inEventLoop {
let promise = eventLoop.makePromise(of: Void.self)
executeAndComplete(promise) {
try setSocketOption0(level: level, name: name, value: value)
}
return promise.futureResult
} else {
return eventLoop.submit {
try self.setSocketOption0(level: level, name: name, value: value)
}
}
}
#if !os(Windows)
func unsafeGetSocketOption<Value>(level: SocketOptionLevel, name: SocketOptionName) -> EventLoopFuture<Value> {
return unsafeGetSocketOption(level: NIOBSDSocket.OptionLevel(rawValue: CInt(level)), name: NIOBSDSocket.Option(rawValue: CInt(name)))
}
#endif
func unsafeGetSocketOption<Value>(level: NIOBSDSocket.OptionLevel, name: NIOBSDSocket.Option) -> EventLoopFuture<Value> {
if eventLoop.inEventLoop {
let promise = eventLoop.makePromise(of: Value.self)
executeAndComplete(promise) {
try getSocketOption0(level: level, name: name)
}
return promise.futureResult
} else {
return eventLoop.submit {
try self.getSocketOption0(level: level, name: name)
}
}
}
func setSocketOption0<Value>(level: NIOBSDSocket.OptionLevel, name: NIOBSDSocket.Option, value: Value) throws {
try self.socket.setOption(level: level, name: name, value: value)
}
func getSocketOption0<Value>(level: NIOBSDSocket.OptionLevel, name: NIOBSDSocket.Option) throws -> Value {
return try self.socket.getOption(level: level, name: name)
}
}