Skip to content

Commit ac60efc

Browse files
committed
Use a recursive lock
* Drop UnfairLock and use NSRecursiveLock * UnfairLock is fast, but it doesn’t support recursive locking. So, it crashes whenever you lock it twice from the same thread. * So far, we haven't encountered this, but this is possible, especially if we are not careful about how changes are propagated up.
1 parent ff4705a commit ac60efc

File tree

4 files changed

+11
-70
lines changed

4 files changed

+11
-70
lines changed

iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
03E56DD328405F4A006AA1DA /* OneSignalAppDelegateOverrider.m in Sources */ = {isa = PBXBuildFile; fileRef = 03E56DD228405F4A006AA1DA /* OneSignalAppDelegateOverrider.m */; };
5454
16664C4C25DDB195003B8A14 /* NSTimeZoneOverrider.m in Sources */ = {isa = PBXBuildFile; fileRef = 16664C4B25DDB195003B8A14 /* NSTimeZoneOverrider.m */; };
5555
37E6B2BB19D9CAF300D0C601 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37E6B2BA19D9CAF300D0C601 /* UIKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
56-
3C05904B2B86BC9E00450D48 /* UnfairLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C05904A2B86BC9E00450D48 /* UnfairLock.swift */; };
5756
3C0EF49E28A1DBCB00E5434B /* OSUserInternalImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0EF49D28A1DBCB00E5434B /* OSUserInternalImpl.swift */; };
5857
3C115165289A259500565C41 /* OneSignalOSCore.docc in Sources */ = {isa = PBXBuildFile; fileRef = 3C115164289A259500565C41 /* OneSignalOSCore.docc */; };
5958
3C115171289A259500565C41 /* OneSignalOSCore.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C115163289A259500565C41 /* OneSignalOSCore.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -944,7 +943,6 @@
944943
1AF75EAD1E8567FD0097B315 /* NSString+OneSignal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+OneSignal.m"; sourceTree = "<group>"; };
945944
37747F9319147D6500558FAD /* libOneSignal.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libOneSignal.a; sourceTree = BUILT_PRODUCTS_DIR; };
946945
37E6B2BA19D9CAF300D0C601 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
947-
3C05904A2B86BC9E00450D48 /* UnfairLock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnfairLock.swift; sourceTree = "<group>"; };
948946
3C0EF49D28A1DBCB00E5434B /* OSUserInternalImpl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OSUserInternalImpl.swift; sourceTree = "<group>"; };
949947
3C115161289A259500565C41 /* OneSignalOSCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OneSignalOSCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
950948
3C115163289A259500565C41 /* OneSignalOSCore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OneSignalOSCore.h; sourceTree = "<group>"; };
@@ -1640,14 +1638,6 @@
16401638
name = Frameworks;
16411639
sourceTree = "<group>";
16421640
};
1643-
3C0590492B86BC5300450D48 /* Utils */ = {
1644-
isa = PBXGroup;
1645-
children = (
1646-
3C05904A2B86BC9E00450D48 /* UnfairLock.swift */,
1647-
);
1648-
path = Utils;
1649-
sourceTree = "<group>";
1650-
};
16511641
3C115162289A259500565C41 /* OneSignalOSCore */ = {
16521642
isa = PBXGroup;
16531643
children = (
@@ -1661,7 +1651,6 @@
16611651
isa = PBXGroup;
16621652
children = (
16631653
3C115163289A259500565C41 /* OneSignalOSCore.h */,
1664-
3C0590492B86BC5300450D48 /* Utils */,
16651654
3C115188289ADEA300565C41 /* OSModelStore.swift */,
16661655
3C115186289ADE7700565C41 /* OSModelStoreListener.swift */,
16671656
3C115184289ADE4F00565C41 /* OSModel.swift */,
@@ -3338,7 +3327,6 @@
33383327
3C115187289ADE7700565C41 /* OSModelStoreListener.swift in Sources */,
33393328
3CE5F9E3289D88DC004A156E /* OSModelStoreChangedHandler.swift in Sources */,
33403329
3C2D8A5928B4C4E300BE41F6 /* OSDelta.swift in Sources */,
3341-
3C05904B2B86BC9E00450D48 /* UnfairLock.swift in Sources */,
33423330
3C11518D289AF5E800565C41 /* OSModelChangedHandler.swift in Sources */,
33433331
3C8E6DF928A6D89E0031E48A /* OSOperationExecutor.swift in Sources */,
33443332
);

iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/Utils/UnfairLock.swift

Lines changed: 0 additions & 47 deletions
This file was deleted.

iOS_SDK/OneSignalSDK/OneSignalUser/Source/OSIdentityModel.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class OSIdentityModel: OSModel {
4040

4141
// All access to aliases should go through helper methods with locking
4242
var aliases: [String: String] = [:]
43-
private let aliasesLock = UnfairLock()
43+
private let aliasesLock = NSRecursiveLock()
4444

4545
// TODO: We need to make this token secure
4646
public var jwtBearerToken: String?
@@ -54,7 +54,7 @@ class OSIdentityModel: OSModel {
5454
}
5555

5656
override func encode(with coder: NSCoder) {
57-
aliasesLock.locked {
57+
aliasesLock.withLock {
5858
super.encode(with: coder)
5959
coder.encode(aliases, forKey: "aliases")
6060
}
@@ -71,14 +71,14 @@ class OSIdentityModel: OSModel {
7171

7272
/** Threadsafe getter for an alias */
7373
private func internalGetAlias(_ label: String) -> String? {
74-
aliasesLock.locked {
74+
aliasesLock.withLock {
7575
return self.aliases[label]
7676
}
7777
}
7878

7979
/** Threadsafe setter or removal for aliases */
8080
private func internalAddAliases(_ aliases: [String: String]) {
81-
aliasesLock.locked {
81+
aliasesLock.withLock {
8282
for (label, id) in aliases {
8383
// Remove the alias if the ID field is ""
8484
self.aliases[label] = id.isEmpty ? nil : id
@@ -91,7 +91,7 @@ class OSIdentityModel: OSModel {
9191
Called to clear the model's data in preparation for hydration via a fetch user call.
9292
*/
9393
func clearData() {
94-
aliasesLock.locked {
94+
aliasesLock.withLock {
9595
self.aliases = [:]
9696
}
9797
}

iOS_SDK/OneSignalSDK/OneSignalUser/Source/OSPropertiesModel.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class OSPropertiesModel: OSModel {
8282
var timezoneId = TimeZone.current.identifier
8383

8484
var tags: [String: String] = [:]
85-
private let tagsLock = UnfairLock()
85+
private let tagsLock = NSRecursiveLock()
8686

8787
// MARK: - Initialization
8888

@@ -102,7 +102,7 @@ class OSPropertiesModel: OSModel {
102102
}
103103

104104
override func encode(with coder: NSCoder) {
105-
tagsLock.locked {
105+
tagsLock.withLock {
106106
super.encode(with: coder)
107107
coder.encode(language, forKey: "language")
108108
coder.encode(tags, forKey: "tags")
@@ -127,15 +127,15 @@ class OSPropertiesModel: OSModel {
127127
*/
128128
func clearData() {
129129
// TODO: What about language, lat, long?
130-
tagsLock.locked {
130+
tagsLock.withLock {
131131
self.tags = [:]
132132
}
133133
}
134134

135135
// MARK: - Tag Methods
136136

137137
func addTags(_ tags: [String: String]) {
138-
tagsLock.locked {
138+
tagsLock.withLock {
139139
for (key, value) in tags {
140140
self.tags[key] = value
141141
}
@@ -144,7 +144,7 @@ class OSPropertiesModel: OSModel {
144144
}
145145

146146
func removeTags(_ tags: [String]) {
147-
tagsLock.locked {
147+
tagsLock.withLock {
148148
var tagsToSend: [String: String] = [:]
149149
for tag in tags {
150150
self.tags.removeValue(forKey: tag)
@@ -160,7 +160,7 @@ class OSPropertiesModel: OSModel {
160160
case "language":
161161
self.language = property.value as? String
162162
case "tags":
163-
tagsLock.locked {
163+
tagsLock.withLock {
164164
self.tags = property.value as? [String: String] ?? [:]
165165
}
166166
default:

0 commit comments

Comments
 (0)