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:
parent
cdf27b6160
commit
a7e064d185
|
@ -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)
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue