summaryrefslogtreecommitdiffhomepage
path: root/ios/Operations
diff options
context:
space:
mode:
authorBug Magnet <marco.nikic@mullvad.net>2024-12-04 14:43:23 +0100
committerBug Magnet <marco.nikic@mullvad.net>2025-01-14 10:18:06 +0100
commitd1cf679456f87b2f93b150c67a76fa20e31d7643 (patch)
tree6ae6911848db62013e09939488a54fd98bad81b4 /ios/Operations
parentd2949b4a0b1d3d86a25de1569dc8308c9d7fe237 (diff)
downloadmullvadvpn-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.swift13
-rw-r--r--ios/Operations/AsyncOperation.swift4
-rw-r--r--ios/Operations/AsyncOperationQueue.swift4
-rw-r--r--ios/Operations/BackgroundObserver.swift6
-rw-r--r--ios/Operations/GroupOperation.swift2
-rw-r--r--ios/Operations/OutputOperation.swift2
-rw-r--r--ios/Operations/ResultBlockOperation.swift14
-rw-r--r--ios/Operations/ResultOperation.swift6
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)