From ec16672d914416841ff804adbdd2a2f9eb43042c Mon Sep 17 00:00:00 2001 From: Dale Swift Date: Wed, 17 Jan 2024 07:58:33 +1100 Subject: [PATCH] Prevent crashes in unregisterSuperProperty Fixes thread safety in currentSuperProperties, unregisterSuperProperty and updateSuperProperty. --- Sources/MixpanelInstance.swift | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/Sources/MixpanelInstance.swift b/Sources/MixpanelInstance.swift index 5152582a..4fc1240a 100644 --- a/Sources/MixpanelInstance.swift +++ b/Sources/MixpanelInstance.swift @@ -1320,9 +1320,14 @@ extension MixpanelInstance { public func unregisterSuperProperty(_ propertyName: String) { trackingQueue.async { [weak self] in guard let self = self else { return } - self.superProperties = self.trackInstance.unregisterSuperProperty(propertyName, + let updatedSuperProperties = self.trackInstance.unregisterSuperProperty(propertyName, superProperties: self.superProperties) - MixpanelPersistence.saveSuperProperties(superProperties: self.superProperties, instanceName: self.name) + self.readWriteLock.write { + self.superProperties = updatedSuperProperties + } + self.readWriteLock.read { + MixpanelPersistence.saveSuperProperties(superProperties: self.superProperties, instanceName: self.name) + } } } @@ -1337,8 +1342,12 @@ extension MixpanelInstance { var superPropertiesShadow = self.superProperties self.trackInstance.updateSuperProperty(update, superProperties: &superPropertiesShadow) - self.superProperties = superPropertiesShadow - MixpanelPersistence.saveSuperProperties(superProperties: self.superProperties, instanceName: self.name) + self.readWriteLock.write { + self.superProperties = superPropertiesShadow + } + self.readWriteLock.read { + MixpanelPersistence.saveSuperProperties(superProperties: self.superProperties, instanceName: self.name) + } } }