From 6c1ea427af4a3f70186da9644166c2fea2a650f2 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Fri, 3 May 2024 11:12:15 -0700 Subject: [PATCH] Fix concurrency warnings about gPingPongMap. --- .../SafariExtensionHandler.swift | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/Mac/SafariExtension/SafariExtensionHandler.swift b/Mac/SafariExtension/SafariExtensionHandler.swift index b90fc38e3..933d12d38 100644 --- a/Mac/SafariExtension/SafariExtensionHandler.swift +++ b/Mac/SafariExtension/SafariExtensionHandler.swift @@ -7,8 +7,9 @@ // import SafariServices +import os -class SafariExtensionHandler: SFSafariExtensionHandler { +final class SafariExtensionHandler: SFSafariExtensionHandler { // Safari App Extensions don't support any reasonable means of detecting whether a // specific Safari page was loaded with the benefit of the extension's injected @@ -19,8 +20,9 @@ class SafariExtensionHandler: SFSafariExtensionHandler { // I tried to use a NSMapTable from String to the closure directly, but Swift // complains that the object has to be a class type. - typealias ValidationHandler = (Bool, String) -> Void - class ValidationWrapper { + typealias ValidationHandler = @Sendable (Bool, String) -> Void + + final class ValidationWrapper: Sendable { let validationHandler: ValidationHandler init(validationHandler: @escaping ValidationHandler) { @@ -29,7 +31,16 @@ class SafariExtensionHandler: SFSafariExtensionHandler { } // Maps from UUID to a validation wrapper - static var gPingPongMap = Dictionary() + private static let _gPingPongMap: OSAllocatedUnfairLock> = OSAllocatedUnfairLock(initialState: [String: ValidationWrapper]()) + static var gPingPongMap: [String: ValidationWrapper] { + get { + _gPingPongMap.withLock { $0 } + } + set { + _gPingPongMap.withLock { $0 = newValue } + } + } + static let validationQueue = DispatchQueue(label: "Toolbar Validation") // Bottleneck for calling through to a validation handler we have saved, and removing it from the list. @@ -79,7 +90,7 @@ class SafariExtensionHandler: SFSafariExtensionHandler { } } - override func validateToolbarItem(in window: SFSafariWindow, validationHandler: @escaping ((Bool, String) -> Void)) { + override func validateToolbarItem(in window: SFSafariWindow, validationHandler: @escaping (Bool, String) -> Void) { let uniqueValidationID = NSUUID().uuidString