@@ -107,16 +107,63 @@ class TaskLocalContextManager: ContextManager {
107107#else
108108@available ( macOS 12 . 0 , iOS 15 . 0 , tvOS 15 . 0 , * )
109109enum 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