From f7af3e52f1b98a43ab6efbba61f4179983963122 Mon Sep 17 00:00:00 2001 From: "Hedden, Kyle Matthew" Date: Mon, 29 Apr 2024 15:20:09 -0400 Subject: [PATCH] Digital PCT265 story ONEAPP-7249 - Better once implementation to avoid mutex lockups. --- VDS/Extensions/DispatchQueue+Once.swift | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/VDS/Extensions/DispatchQueue+Once.swift b/VDS/Extensions/DispatchQueue+Once.swift index 092500cf..15c96e41 100644 --- a/VDS/Extensions/DispatchQueue+Once.swift +++ b/VDS/Extensions/DispatchQueue+Once.swift @@ -8,7 +8,7 @@ import Foundation extension DispatchQueue { - private static var _onceTracker = [String]() + private static var _onceTracker = Set() public class func once( file: String = #file, @@ -31,12 +31,17 @@ extension DispatchQueue { token: String, block: () -> Void ) { + // Peek ahead to avoid the intersection. + guard !_onceTracker.contains(token) else { return } + objc_sync_enter(self) defer { objc_sync_exit(self) } + // Double check we are the first in the critical section. guard !_onceTracker.contains(token) else { return } - _onceTracker.append(token) + // Execute. + _onceTracker.insert(token) block() } }