Skip to content

Commit b7cfe3b

Browse files
author
Ignacio Bonafonte
committed
Fix Xcode >= 13.0 && < 13.2 was using old code
1 parent 83be767 commit b7cfe3b

File tree

1 file changed

+59
-12
lines changed

1 file changed

+59
-12
lines changed

Sources/OpenTelemetryApi/Context/TaskLocalContextManager.swift

Lines changed: 59 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -107,16 +107,63 @@ class TaskLocalContextManager: ContextManager {
107107
#else
108108
@available(macOS 12.0, iOS 15.0, tvOS 15.0, *)
109109
enum ContextManagement {
110+
static let spanRLock = NSRecursiveLock()
111+
static let baggageRLock = NSRecursiveLock()
112+
110113
@TaskLocal
111-
static var span: Span?
112-
public static func setSpan(wrappedSpan: TaskLocal<Span?>) {
113-
_span = wrappedSpan
114+
private static var spans = [Span]()
115+
116+
public static func getSpan() -> Span? {
117+
spanRLock.lock()
118+
defer { spanRLock.unlock() }
119+
return spans.last
120+
}
121+
122+
public static func setSpan(span: Span) {
123+
spanRLock.lock()
124+
defer { spanRLock.unlock() }
125+
var aux = spans
126+
aux.append(span)
127+
_spans = TaskLocal(wrappedValue: aux)
128+
}
129+
130+
public static func removeSpan() {
131+
spanRLock.lock()
132+
defer { spanRLock.unlock() }
133+
guard !spans.isEmpty else {
134+
return
135+
}
136+
var aux = spans
137+
aux.removeLast()
138+
_spans = TaskLocal(wrappedValue: aux)
114139
}
115140

116141
@TaskLocal
117-
static var baggage: Baggage?
118-
public static func setBaggage(wrappedBaggage: TaskLocal<Baggage?>) {
119-
_baggage = wrappedBaggage
142+
private static var baggages = [Baggage]()
143+
144+
public static func getBaggage() -> Baggage? {
145+
baggageRLock.lock()
146+
defer { baggageRLock.unlock() }
147+
return baggages.last
148+
}
149+
150+
public static func setBaggage(baggage: Baggage) {
151+
baggageRLock.lock()
152+
defer { baggageRLock.unlock() }
153+
var aux = baggages
154+
aux.append(baggage)
155+
_baggages = TaskLocal(wrappedValue: aux)
156+
}
157+
158+
public static func removeBaggage() {
159+
baggageRLock.lock()
160+
defer { baggageRLock.unlock() }
161+
guard !baggages.isEmpty else {
162+
return
163+
}
164+
var aux = baggages
165+
aux.removeLast()
166+
_baggages = TaskLocal(wrappedValue: aux)
120167
}
121168
}
122169

@@ -127,31 +174,31 @@ class TaskLocalContextManager: ContextManager {
127174
func getCurrentContextValue(forKey key: OpenTelemetryContextKeys) -> AnyObject? {
128175
switch key {
129176
case .span:
130-
return ContextManagement.span
177+
return ContextManagement.getSpan()
131178
case .baggage:
132-
return ContextManagement.baggage
179+
return ContextManagement.getBaggage()
133180
}
134181
}
135182

136183
func setCurrentContextValue(forKey key: OpenTelemetryContextKeys, value: AnyObject) {
137184
switch key {
138185
case .span:
139186
if let span = value as? Span {
140-
ContextManagement.setSpan(wrappedSpan: TaskLocal(wrappedValue: span))
187+
ContextManagement.setSpan(span: span)
141188
}
142189
case .baggage:
143190
if let baggage = value as? Baggage {
144-
ContextManagement.setBaggage(wrappedBaggage: TaskLocal(wrappedValue: baggage))
191+
ContextManagement.setBaggage(baggage: baggage)
145192
}
146193
}
147194
}
148195

149196
func removeContextValue(forKey key: OpenTelemetryContextKeys, value: AnyObject) {
150197
switch key {
151198
case .span:
152-
ContextManagement.setSpan(wrappedSpan: TaskLocal(wrappedValue: nil))
199+
ContextManagement.removeSpan()
153200
case .baggage:
154-
ContextManagement.setBaggage(wrappedBaggage: TaskLocal(wrappedValue: nil))
201+
ContextManagement.removeBaggage()
155202
}
156203
}
157204
}

0 commit comments

Comments
 (0)