diff --git a/Mixpanel/AutomaticEvents.swift b/Mixpanel/AutomaticEvents.swift index 666ca830b..e8b35a489 100644 --- a/Mixpanel/AutomaticEvents.swift +++ b/Mixpanel/AutomaticEvents.swift @@ -49,7 +49,7 @@ class AutomaticEvents: NSObject, SKPaymentTransactionObserver, SKProductsRequest var hasAddedObserver = false var automaticPushTracking = true var firstAppOpen = false - let awaitingTransactionsWriteLock = DispatchQueue(label: "com.mixpanel.awaiting_transactions_writeLock") + let awaitingTransactionsWriteLock = DispatchQueue(label: "com.mixpanel.awaiting_transactions_writeLock", qos: .utility) func initializeEvents() { let firstOpenKey = "MPFirstOpen" diff --git a/Mixpanel/Flush.swift b/Mixpanel/Flush.swift index dbcfa680b..8f219ac13 100644 --- a/Mixpanel/Flush.swift +++ b/Mixpanel/Flush.swift @@ -43,7 +43,7 @@ class Flush: AppLifecycle { required init(basePathIdentifier: String) { self.flushRequest = FlushRequest(basePathIdentifier: basePathIdentifier) - flushIntervalReadWriteLock = DispatchQueue(label: "com.mixpanel.flush_interval.lock", attributes: .concurrent) + flushIntervalReadWriteLock = DispatchQueue(label: "com.mixpanel.flush_interval.lock", qos: .utility, attributes: .concurrent) } func flushEventsQueue(_ eventsQueue: Queue, automaticEventsEnabled: Bool?) -> Queue? { diff --git a/Mixpanel/Mixpanel.swift b/Mixpanel/Mixpanel.swift index 1c2a9f86b..ff1e5adec 100644 --- a/Mixpanel/Mixpanel.swift +++ b/Mixpanel/Mixpanel.swift @@ -132,10 +132,12 @@ class MixpanelManager { static let sharedInstance = MixpanelManager() private var instances: [String: MixpanelInstance] private var mainInstance: MixpanelInstance? + private let readWriteLock: ReadWriteLock init() { instances = [String: MixpanelInstance]() Logger.addLogging(PrintLogging()) + readWriteLock = ReadWriteLock(label: "com.mixpanel.instance.manager.lock") } #if !os(OSX) && !WATCH_OS @@ -152,7 +154,9 @@ class MixpanelManager { automaticPushTracking: automaticPushTracking, optOutTrackingByDefault: optOutTrackingByDefault) mainInstance = instance - instances[instanceName] = instance + readWriteLock.write { + instances[instanceName] = instance + } return instance } @@ -166,14 +170,20 @@ class MixpanelManager { name: instanceName, optOutTrackingByDefault: optOutTrackingByDefault) mainInstance = instance - instances[instanceName] = instance + readWriteLock.write { + instances[instanceName] = instance + } return instance } #endif // os(OSX) func getInstance(name instanceName: String) -> MixpanelInstance? { - guard let instance = instances[instanceName] else { + var instance: MixpanelInstance? = nil + readWriteLock.read { + instance = instances[instanceName] + } + if instance == nil { Logger.warn(message: "no such instance: \(instanceName)") return nil } @@ -185,17 +195,23 @@ class MixpanelManager { } func setMainInstance(name instanceName: String) { - guard let instance = instances[instanceName] else { + var instance: MixpanelInstance? = nil + readWriteLock.read { + instance = instances[instanceName] + } + if instance == nil { return } mainInstance = instance } func removeInstance(name instanceName: String) { - if instances[instanceName] === mainInstance { - mainInstance = nil + readWriteLock.write { + if instances[instanceName] === mainInstance { + mainInstance = nil + } + instances[instanceName] = nil } - instances[instanceName] = nil } } diff --git a/Mixpanel/MixpanelInstance.swift b/Mixpanel/MixpanelInstance.swift index ae05154f1..9376bde4c 100644 --- a/Mixpanel/MixpanelInstance.swift +++ b/Mixpanel/MixpanelInstance.swift @@ -281,7 +281,7 @@ open class MixpanelInstance: CustomDebugStringConvertible, FlushDelegate, AEDele self.apiToken = apiToken } self.name = name - self.readWriteLock = ReadWriteLock(label: "globalLock") + self.readWriteLock = ReadWriteLock(label: "com.mixpanel.globallock") flushInstance = Flush(basePathIdentifier: name) #if DECIDE decideInstance = Decide(basePathIdentifier: name, lock: self.readWriteLock) @@ -356,16 +356,16 @@ open class MixpanelInstance: CustomDebugStringConvertible, FlushDelegate, AEDele self.apiToken = apiToken } self.name = name - self.readWriteLock = ReadWriteLock(label: "globalLock") + self.readWriteLock = ReadWriteLock(label: "com.mixpanel.globallock") flushInstance = Flush(basePathIdentifier: name) let label = "com.mixpanel.\(self.apiToken)" - trackingQueue = DispatchQueue(label: label) + trackingQueue = DispatchQueue(label: label, qos: .utility) sessionMetadata = SessionMetadata(trackingQueue: trackingQueue) trackInstance = Track(apiToken: self.apiToken, lock: self.readWriteLock, metadata: sessionMetadata) flushInstance.delegate = self - networkQueue = DispatchQueue(label: label) + networkQueue = DispatchQueue(label: label, qos: .utility) distinctId = defaultDistinctId() people = People(apiToken: self.apiToken, serialQueue: trackingQueue, diff --git a/Mixpanel/ObjectIdentityProvider.swift b/Mixpanel/ObjectIdentityProvider.swift index 97477eaf2..aad63bd2d 100644 --- a/Mixpanel/ObjectIdentityProvider.swift +++ b/Mixpanel/ObjectIdentityProvider.swift @@ -33,7 +33,7 @@ class ObjectIdentityProvider { } class SequenceGenerator { - private var queue = DispatchQueue(label: "com.mixpanel.sequence.generator") + private var queue = DispatchQueue(label: "com.mixpanel.sequence.generator", qos: .utility) private(set) var value: Int32 = 0 init() { diff --git a/Mixpanel/ReadWriteLock.swift b/Mixpanel/ReadWriteLock.swift index db363328a..e3a45713d 100644 --- a/Mixpanel/ReadWriteLock.swift +++ b/Mixpanel/ReadWriteLock.swift @@ -11,7 +11,7 @@ class ReadWriteLock { let concurentQueue: DispatchQueue init(label: String) { - self.concurentQueue = DispatchQueue(label: label, attributes: .concurrent) + self.concurentQueue = DispatchQueue(label: label, qos: .utility, attributes: .concurrent) } func read(closure: () -> ()) { diff --git a/Mixpanel/TweakPersistency.swift b/Mixpanel/TweakPersistency.swift index 7874d3389..df5c3f39e 100644 --- a/Mixpanel/TweakPersistency.swift +++ b/Mixpanel/TweakPersistency.swift @@ -69,7 +69,7 @@ private final class TweakDiskPersistency { .appendingPathExtension("db") } - private let queue = DispatchQueue(label: "org.khanacademy.swift_tweaks.disk_persistency", attributes: []) + private let queue = DispatchQueue(label: "org.khanacademy.swift_tweaks.disk_persistency", qos: .utility, attributes: []) init(identifier: String) { self.fileURL = TweakDiskPersistency.fileURLForIdentifier(identifier) diff --git a/Mixpanel/WebSocketWrapper.swift b/Mixpanel/WebSocketWrapper.swift index 70e01ef7f..4601e1f39 100644 --- a/Mixpanel/WebSocketWrapper.swift +++ b/Mixpanel/WebSocketWrapper.swift @@ -47,7 +47,7 @@ class WebSocketWrapper: WebSocketDelegate { open = false connected = false session = [String: Any]() - sessionObjectLock = DispatchQueue(label: "com.mixpanel.session_object_lock", attributes: .concurrent) + sessionObjectLock = DispatchQueue(label: "com.mixpanel.session_object_lock", qos: .utility, attributes: .concurrent) self.url = url self.connectCallback = connectCallback self.disconnectCallback = disconnectCallback diff --git a/MixpanelDemo/MixpanelDemoTests/MixpanelDemoTests.swift b/MixpanelDemo/MixpanelDemoTests/MixpanelDemoTests.swift index ac018a351..8f0c0c80c 100644 --- a/MixpanelDemo/MixpanelDemoTests/MixpanelDemoTests.swift +++ b/MixpanelDemo/MixpanelDemoTests/MixpanelDemoTests.swift @@ -858,7 +858,7 @@ class MixpanelDemoTests: MixpanelBaseTests { func testReadWriteLock() { var array = [Int]() let lock = ReadWriteLock(label: "test") - let queue = DispatchQueue(label: "concurrent", attributes: .concurrent) + let queue = DispatchQueue(label: "concurrent", qos: .utility, attributes: .concurrent) for _ in 0..<10 { queue.async { lock.write {