diff options
| author | Bug Magnet <marco.nikic@mullvad.net> | 2024-12-04 14:43:23 +0100 |
|---|---|---|
| committer | Bug Magnet <marco.nikic@mullvad.net> | 2025-01-14 10:18:06 +0100 |
| commit | d1cf679456f87b2f93b150c67a76fa20e31d7643 (patch) | |
| tree | 6ae6911848db62013e09939488a54fd98bad81b4 /ios/Operations | |
| parent | d2949b4a0b1d3d86a25de1569dc8308c9d7fe237 (diff) | |
| download | mullvadvpn-d1cf679456f87b2f93b150c67a76fa20e31d7643.tar.xz mullvadvpn-d1cf679456f87b2f93b150c67a76fa20e31d7643.zip | |
Enable compilation with Swift 6 for most targets
Diffstat (limited to 'ios/Operations')
| -rw-r--r-- | ios/Operations/AsyncBlockOperation.swift | 13 | ||||
| -rw-r--r-- | ios/Operations/AsyncOperation.swift | 4 | ||||
| -rw-r--r-- | ios/Operations/AsyncOperationQueue.swift | 4 | ||||
| -rw-r--r-- | ios/Operations/BackgroundObserver.swift | 6 | ||||
| -rw-r--r-- | ios/Operations/GroupOperation.swift | 2 | ||||
| -rw-r--r-- | ios/Operations/OutputOperation.swift | 2 | ||||
| -rw-r--r-- | ios/Operations/ResultBlockOperation.swift | 14 | ||||
| -rw-r--r-- | ios/Operations/ResultOperation.swift | 6 |
8 files changed, 30 insertions, 21 deletions
diff --git a/ios/Operations/AsyncBlockOperation.swift b/ios/Operations/AsyncBlockOperation.swift index 062fc528f5..69e52aff0e 100644 --- a/ios/Operations/AsyncBlockOperation.swift +++ b/ios/Operations/AsyncBlockOperation.swift @@ -10,11 +10,14 @@ import Foundation import protocol MullvadTypes.Cancellable /// Asynchronous block operation -public class AsyncBlockOperation: AsyncOperation { - private var executor: ((@escaping (Error?) -> Void) -> Cancellable?)? +public class AsyncBlockOperation: AsyncOperation, @unchecked Sendable { + private var executor: ((@escaping @Sendable (Error?) -> Void) -> Cancellable?)? private var cancellableTask: Cancellable? - public init(dispatchQueue: DispatchQueue? = nil, block: @escaping (@escaping (Error?) -> Void) -> Void) { + public init( + dispatchQueue: DispatchQueue? = nil, + block: @escaping @Sendable (@escaping @Sendable (Error?) -> Void) -> Void + ) { super.init(dispatchQueue: dispatchQueue) executor = { finish in block(finish) @@ -22,7 +25,7 @@ public class AsyncBlockOperation: AsyncOperation { } } - public init(dispatchQueue: DispatchQueue? = nil, block: @escaping () -> Void) { + public init(dispatchQueue: DispatchQueue? = nil, block: @escaping @Sendable () -> Void) { super.init(dispatchQueue: dispatchQueue) executor = { finish in block() @@ -33,7 +36,7 @@ public class AsyncBlockOperation: AsyncOperation { public init( dispatchQueue: DispatchQueue? = nil, - cancellableTask: @escaping (@escaping (Error?) -> Void) -> Cancellable + cancellableTask: @escaping @Sendable (@escaping @Sendable (Error?) -> Void) -> Cancellable ) { super.init(dispatchQueue: dispatchQueue) executor = { cancellableTask($0) } diff --git a/ios/Operations/AsyncOperation.swift b/ios/Operations/AsyncOperation.swift index 034f17f199..771bf334fa 100644 --- a/ios/Operations/AsyncOperation.swift +++ b/ios/Operations/AsyncOperation.swift @@ -39,7 +39,7 @@ import Foundation } /// A base implementation of an asynchronous operation -open class AsyncOperation: Operation { +open class AsyncOperation: Operation, @unchecked Sendable { /// Mutex lock used for guarding critical sections of operation lifecycle. private let operationLock = NSRecursiveLock() @@ -199,7 +199,7 @@ open class AsyncOperation: Operation { state = .evaluatingConditions - var results = [Bool](repeating: false, count: _conditions.count) + nonisolated(unsafe) var results = [Bool](repeating: false, count: _conditions.count) let group = DispatchGroup() for (index, condition) in _conditions.enumerated() { diff --git a/ios/Operations/AsyncOperationQueue.swift b/ios/Operations/AsyncOperationQueue.swift index 57c4451138..cf4c421756 100644 --- a/ios/Operations/AsyncOperationQueue.swift +++ b/ios/Operations/AsyncOperationQueue.swift @@ -8,7 +8,7 @@ import Foundation -public final class AsyncOperationQueue: OperationQueue { +public final class AsyncOperationQueue: OperationQueue, @unchecked Sendable { override public func addOperation(_ operation: Operation) { if let operation = operation as? AsyncOperation { let categories = operation.conditions @@ -50,7 +50,7 @@ public final class AsyncOperationQueue: OperationQueue { } } -private final class ExclusivityManager { +private final class ExclusivityManager: @unchecked Sendable { static let shared = ExclusivityManager() private var operationsByCategory = [String: [Operation]]() diff --git a/ios/Operations/BackgroundObserver.swift b/ios/Operations/BackgroundObserver.swift index 5165780a15..5f5add27bc 100644 --- a/ios/Operations/BackgroundObserver.swift +++ b/ios/Operations/BackgroundObserver.swift @@ -26,7 +26,13 @@ public final class BackgroundObserver: OperationObserver { } public func didAttach(to operation: Operation) { + #if swift(>=6) + let expirationHandler = cancelUponExpiration + ? { @MainActor in operation.cancel() } as? @MainActor @Sendable () -> Void + : nil + #else let expirationHandler = cancelUponExpiration ? { operation.cancel() } : nil + #endif taskIdentifier = backgroundTaskProvider.beginBackgroundTask( withName: name, diff --git a/ios/Operations/GroupOperation.swift b/ios/Operations/GroupOperation.swift index 1f474e7b28..5d8015ec8e 100644 --- a/ios/Operations/GroupOperation.swift +++ b/ios/Operations/GroupOperation.swift @@ -8,7 +8,7 @@ import Foundation -public final class GroupOperation: AsyncOperation { +public final class GroupOperation: AsyncOperation, @unchecked Sendable { private let operationQueue = AsyncOperationQueue() private let children: [Operation] diff --git a/ios/Operations/OutputOperation.swift b/ios/Operations/OutputOperation.swift index 82274b1450..1a9e1acb87 100644 --- a/ios/Operations/OutputOperation.swift +++ b/ios/Operations/OutputOperation.swift @@ -9,7 +9,7 @@ import Foundation public protocol OutputOperation: Operation { - associatedtype Output + associatedtype Output: Sendable var output: Output? { get } } diff --git a/ios/Operations/ResultBlockOperation.swift b/ios/Operations/ResultBlockOperation.swift index 867dee45cf..cb4f5fff64 100644 --- a/ios/Operations/ResultBlockOperation.swift +++ b/ios/Operations/ResultBlockOperation.swift @@ -9,24 +9,24 @@ import Foundation import protocol MullvadTypes.Cancellable -public final class ResultBlockOperation<Success>: ResultOperation<Success> { - private var executor: ((@escaping (Result<Success, Error>) -> Void) -> Cancellable?)? +public final class ResultBlockOperation<Success: Sendable>: ResultOperation<Success>, @unchecked Sendable { + private var executor: ((@escaping @Sendable (Result<Success, Error>) -> Void) -> Cancellable?)? private var cancellableTask: Cancellable? public init( dispatchQueue: DispatchQueue? = nil, - executionBlock: @escaping (_ finish: @escaping (Result<Success, Error>) -> Void) -> Void + executionBlock: @escaping @Sendable (_ finish: @escaping (Result<Success, Error>) -> Void) -> Void ) { super.init(dispatchQueue: dispatchQueue) - executor = { finish in + executor = { @Sendable finish in executionBlock(finish) return nil } } - public init(dispatchQueue: DispatchQueue? = nil, executionBlock: @escaping () throws -> Success) { + public init(dispatchQueue: DispatchQueue? = nil, executionBlock: @escaping @Sendable () throws -> Success) { super.init(dispatchQueue: dispatchQueue) - executor = { finish in + executor = { @Sendable finish in finish(Result { try executionBlock() }) return nil } @@ -34,7 +34,7 @@ public final class ResultBlockOperation<Success>: ResultOperation<Success> { public init( dispatchQueue: DispatchQueue? = nil, - cancellableTask: @escaping (_ finish: @escaping (Result<Success, Error>) -> Void) -> Cancellable + cancellableTask: @escaping (_ finish: @escaping @Sendable (Result<Success, Error>) -> Void) -> Cancellable ) { super.init(dispatchQueue: dispatchQueue) executor = { cancellableTask($0) } diff --git a/ios/Operations/ResultOperation.swift b/ios/Operations/ResultOperation.swift index e377ecf9f5..2debb4381a 100644 --- a/ios/Operations/ResultOperation.swift +++ b/ios/Operations/ResultOperation.swift @@ -9,8 +9,8 @@ import Foundation /// Base class for operations producing result. -open class ResultOperation<Success>: AsyncOperation, OutputOperation, @unchecked Sendable { - public typealias CompletionHandler = (Result<Success, Error>) -> Void +open class ResultOperation<Success: Sendable>: AsyncOperation, OutputOperation, @unchecked Sendable { + public typealias CompletionHandler = @Sendable (Result<Success, Error>) -> Void private let nslock = NSLock() private var _output: Success? @@ -118,7 +118,7 @@ open class ResultOperation<Success>: AsyncOperation, OutputOperation, @unchecked let completionQueue = _completionQueue nslock.unlock() - let block = { + let block: @Sendable () -> Void = { // Call completion handler. completionHandler?(result) |
