Skip to content

Commit 98974b2

Browse files
committed
Adding atomic to shared variables
1 parent 20f6aae commit 98974b2

File tree

1 file changed

+14
-14
lines changed

1 file changed

+14
-14
lines changed

Sources/Segment/Utilities/Telemetry.swift

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public class Telemetry: Subscriber {
7171

7272
internal var session: any HTTPSession
7373
internal var host: String = HTTPClient.getDefaultAPIHost()
74-
var sampleRate: Double = 1.0 // inital sample rate should be 1.0, will be downsampled on start
74+
@Atomic var sampleRate: Double = 1.0 // inital sample rate should be 1.0, will be downsampled on start
7575
private var flushTimer: Int = 30
7676
internal var maxQueueSize: Int = 20
7777
var errorLogSizeMax: Int = 4000
@@ -85,27 +85,27 @@ public class Telemetry: Subscriber {
8585

8686
internal var queue = [RemoteMetric]()
8787
private var queueBytes = 0
88-
internal var started = false
89-
private var rateLimitEndTime: TimeInterval = 0
90-
internal var flushFirstError = true
88+
@Atomic internal var started = false
89+
@Atomic private var rateLimitEndTime: TimeInterval = 0
90+
@Atomic internal var flushFirstError = true
9191
private var telemetryQueue = DispatchQueue(label: "telemetryQueue")
9292
private var updateQueue = DispatchQueue(label: "updateQueue")
9393
private var telemetryTimer: QueueTimer?
9494

9595
/// Starts the Telemetry send loop. Requires both `enable` to be set and a configuration to be retrieved from Segment.
9696
func start() {
9797
guard enable, !started, sampleRate > 0.0 && sampleRate <= 1.0 else { return }
98-
started = true
98+
_started.set(true)
9999

100100
// Queue contents were sampled at the default 100%
101101
// the values on flush will be adjusted in the send function
102102
if Double.random(in: 0...1) > sampleRate {
103103
resetQueue()
104104
}
105105

106-
self.telemetryTimer = QueueTimer(interval: .seconds(self.flushTimer), queue: .main) { [weak self] in
106+
self.telemetryTimer = QueueTimer(interval: .seconds(self.flushTimer), queue: updateQueue) { [weak self] in
107107
if (!(self?.enable ?? false)) {
108-
self?.started = false
108+
self?._started.set(false)
109109
self?.telemetryTimer?.suspend()
110110
}
111111
self?.flush()
@@ -116,8 +116,8 @@ public class Telemetry: Subscriber {
116116
func reset() {
117117
telemetryTimer?.suspend()
118118
resetQueue()
119-
started = false
120-
rateLimitEndTime = 0
119+
_started.set(false)
120+
_rateLimitEndTime.set(0)
121121
}
122122

123123
/// Increments a metric with the provided tags.
@@ -161,7 +161,7 @@ public class Telemetry: Subscriber {
161161
addRemoteMetric(metric: metric, tags: filteredTags, log: logData)
162162

163163
if (flushFirstError) {
164-
flushFirstError = false
164+
_flushFirstError.set(false)
165165
flush()
166166
}
167167
}
@@ -175,14 +175,14 @@ public class Telemetry: Subscriber {
175175
if rateLimitEndTime > Date().timeIntervalSince1970 {
176176
return
177177
}
178-
rateLimitEndTime = 0
178+
_rateLimitEndTime.set(0)
179179

180180
do {
181181
try send()
182182
queueBytes = 0
183183
} catch {
184184
errorHandler?(error)
185-
sampleRate = 0.0
185+
_sampleRate.set(0.0)
186186
}
187187
}
188188
}
@@ -210,7 +210,7 @@ public class Telemetry: Subscriber {
210210

211211
if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 429 {
212212
if let retryAfter = httpResponse.allHeaderFields["Retry-After"] as? String, let retryAfterSeconds = TimeInterval(retryAfter) {
213-
self.rateLimitEndTime = retryAfterSeconds + Date().timeIntervalSince1970
213+
self._rateLimitEndTime.set(retryAfterSeconds + Date().timeIntervalSince1970)
214214
}
215215
}
216216
}
@@ -280,7 +280,7 @@ public class Telemetry: Subscriber {
280280

281281
private func systemUpdate(system: System) {
282282
if let settings = system.settings, let sampleRate = settings.metrics?["sampleRate"]?.doubleValue {
283-
self.sampleRate = sampleRate
283+
self._sampleRate.set(sampleRate)
284284
start()
285285
}
286286
}

0 commit comments

Comments
 (0)