Skip to content

Commit b2da539

Browse files
authored
Avoid potential race condition by making Storage thread safe (#26)
* fix:avoid race condition by making Storage thread safe * Update Storage.swift Use accessQueue only when it's necessary * Use legacy guard syntax for compatibility with older swift version's * Remove extra space
1 parent e850e9f commit b2da539

File tree

1 file changed

+28
-18
lines changed

1 file changed

+28
-18
lines changed

Sources/NetShears/Storage.swift

+28-18
Original file line numberDiff line numberDiff line change
@@ -9,40 +9,50 @@
99
import Foundation
1010

1111
final class Storage: NSObject {
12-
1312
static let shared: Storage = Storage()
14-
13+
private let accessQueue = DispatchQueue(label: "com.netshears.queue", attributes: .concurrent)
14+
1515
private(set) var requests: [NetShearsRequestModel] = []
1616

1717
var filteredRequests: [NetShearsRequestModel] {
18-
return getFilteredRequests()
18+
getFilteredRequests()
1919
}
2020

21-
func saveRequest(request: NetShearsRequestModel?){
22-
guard request != nil else {
23-
return
21+
func saveRequest(request: NetShearsRequestModel) {
22+
accessQueue.async(flags: .barrier) { [weak self] in
23+
guard let self = self else {
24+
return
25+
}
26+
if let index = self.requests.firstIndex(where: { (req) -> Bool in
27+
return request.id == req.id ? true : false
28+
}) {
29+
self.requests[index] = request
30+
} else {
31+
self.requests.insert(request, at: 0)
32+
}
33+
NotificationCenter.default.post(name: NSNotification.Name.NewRequestNotification, object: nil)
2434
}
25-
26-
if let index = requests.firstIndex(where: { (req) -> Bool in
27-
return request?.id == req.id ? true : false
28-
}) {
29-
requests[index] = request!
30-
} else {
31-
requests.insert(request!, at: 0)
32-
}
33-
NotificationCenter.default.post(name: NSNotification.Name.NewRequestNotification, object: nil)
3435
}
3536

3637
func clearRequests() {
37-
requests.removeAll()
38+
accessQueue.async(flags: .barrier) { [weak self] in
39+
self?.requests.removeAll()
40+
}
3841
}
3942

4043
private func getFilteredRequests() -> [NetShearsRequestModel] {
44+
var localRequests = [NetShearsRequestModel]()
45+
accessQueue.sync {
46+
localRequests = requests
47+
}
48+
return Self.filterRequestsIfNeeded(localRequests)
49+
}
50+
51+
private static func filterRequestsIfNeeded(_ requests: [NetShearsRequestModel]) -> [NetShearsRequestModel] {
4152
guard case Ignore.enabled(let ignoreHandler) = NetShears.shared.ignore else {
4253
return requests
4354
}
44-
let filteredRequests = requests.filter { ignoreHandler($0) == false }
45-
return filteredRequests
55+
return requests.filter { ignoreHandler($0) == false }
4656
}
4757

4858
}

0 commit comments

Comments
 (0)